ENH: Handle missing unsetenv and add check for environ

This commit is contained in:
Andy Cedilnik 2006-03-17 15:46:20 -05:00
parent ca8d1bc99b
commit b20cb78049
4 changed files with 39 additions and 2 deletions

View File

@ -23,6 +23,23 @@ INCLUDE_DIRECTORIES(
# let cmake know it is supposed to use it # let cmake know it is supposed to use it
ADD_DEFINITIONS(-DCMAKE_BUILD_WITH_CMAKE) ADD_DEFINITIONS(-DCMAKE_BUILD_WITH_CMAKE)
INCLUDE(CheckSymbolExists)
CHECK_SYMBOL_EXISTS(unsetenv "stdlib.h" HAVE_UNSETENV)
INCLUDE("${CMAKE_ROOT}/Modules/CheckCXXSourceCompiles.cmake")
CHECK_CXX_SOURCE_COMPILES(
"int main(int argc, char* argv[]) { return sizeof(environ); }"
HAVE_ENVIRON_WITHOUT_SIGNATURE)
IF(NOT HAVE_ENVIRON_WITHOUT_SIGNATURE)
CHECK_CXX_SOURCE_COMPILES(
"
#ifdef _WIN32
extern __declspec( dllimport ) char** environ;
#else
extern char** environ;
#endif
int main(int argc, char* argv[]) { return sizeof(environ); }"
HAVE_ENVIRON_WITH_SIGNATURE)
ENDIF(NOT HAVE_ENVIRON_WITHOUT_SIGNATURE)
OPTION(CMAKE_REGENERATE_YACCLEX OPTION(CMAKE_REGENERATE_YACCLEX
"Regenerate YACC and LEXX files" OFF) "Regenerate YACC and LEXX files" OFF)

View File

@ -56,7 +56,14 @@
# pragma set woff 1375 /* base class destructor not virtual */ # pragma set woff 1375 /* base class destructor not virtual */
#endif #endif
extern char** environ; // For GetEnvironmentVariables #if !defined(HAVE_ENVIRON_WITHOUT_SIGNATURE)
// For GetEnvironmentVariables
# if defined(_WIN32)
extern __declspec( dllimport ) char** environ;
# else
extern char** environ;
# endif
#endif
bool cmSystemTools::s_RunCommandHideConsole = false; bool cmSystemTools::s_RunCommandHideConsole = false;
bool cmSystemTools::s_DisableRunCommandOutput = false; bool cmSystemTools::s_DisableRunCommandOutput = false;
@ -1280,9 +1287,17 @@ bool cmSystemTools::PutEnv(const char* value)
return ret == 0; return ret == 0;
} }
#ifdef CMAKE_BUILD_WITH_CMAKE
bool cmSystemTools::UnsetEnv(const char* value) bool cmSystemTools::UnsetEnv(const char* value)
{ {
return false; #if !defined(HAVE_UNSETENV)
std::string var = value;
var += "=";
return cmSystemTools::PutEnv(var.c_str());
#else
unsetenv(value);
return true;
#endif
} }
std::vector<std::string> cmSystemTools::GetEnvironmentVariables() std::vector<std::string> cmSystemTools::GetEnvironmentVariables()
@ -1295,6 +1310,7 @@ std::vector<std::string> cmSystemTools::GetEnvironmentVariables()
} }
return env; return env;
} }
#endif
void cmSystemTools::EnableVSConsoleOutput() void cmSystemTools::EnableVSConsoleOutput()
{ {

View File

@ -295,11 +295,13 @@ public:
of the form var=value */ of the form var=value */
static bool PutEnv(const char* value); static bool PutEnv(const char* value);
#ifdef CMAKE_BUILD_WITH_CMAKE
/** Remove an environment variable */ /** Remove an environment variable */
static bool UnsetEnv(const char* value); static bool UnsetEnv(const char* value);
/** Get the list of all environment variables */ /** Get the list of all environment variables */
static std::vector<std::string> GetEnvironmentVariables(); static std::vector<std::string> GetEnvironmentVariables();
#endif
/** Setup the environment to enable VS 8 IDE output. */ /** Setup the environment to enable VS 8 IDE output. */
static void EnableVSConsoleOutput(); static void EnableVSConsoleOutput();

View File

@ -831,6 +831,7 @@ int cmake::ExecuteCMakeCommand(std::vector<std::string>& args)
return 0; return 0;
} }
#if defined(CMAKE_BUILD_WITH_CMAKE)
// Command to create a symbolic link. Fails on platforms not // Command to create a symbolic link. Fails on platforms not
// supporting them. // supporting them.
else if (args[1] == "environment" ) else if (args[1] == "environment" )
@ -843,6 +844,7 @@ int cmake::ExecuteCMakeCommand(std::vector<std::string>& args)
} }
return 0; return 0;
} }
#endif
// Remove file // Remove file
else if (args[1] == "remove" && args.size() > 2) else if (args[1] == "remove" && args.size() > 2)