summaryrefslogtreecommitdiffstats
path: root/Source/cmTryCompileCommand.cxx
diff options
context:
space:
mode:
authorKen Martin <ken.martin@kitware.com>2002-09-19 13:49:14 (GMT)
committerKen Martin <ken.martin@kitware.com>2002-09-19 13:49:14 (GMT)
commitd4f5545007c99259dcb7414d975a5446d5163933 (patch)
treed4a2da63e8ee80cd7787df86c2c8fe7869878d52 /Source/cmTryCompileCommand.cxx
parent3eaf054d6a68ea7e915abddb61e82ff94b123fd6 (diff)
downloadCMake-d4f5545007c99259dcb7414d975a5446d5163933.zip
CMake-d4f5545007c99259dcb7414d975a5446d5163933.tar.gz
CMake-d4f5545007c99259dcb7414d975a5446d5163933.tar.bz2
updated to try compile
Diffstat (limited to 'Source/cmTryCompileCommand.cxx')
-rw-r--r--Source/cmTryCompileCommand.cxx117
1 files changed, 80 insertions, 37 deletions
diff --git a/Source/cmTryCompileCommand.cxx b/Source/cmTryCompileCommand.cxx
index 52f10dd..319adb0 100644
--- a/Source/cmTryCompileCommand.cxx
+++ b/Source/cmTryCompileCommand.cxx
@@ -17,34 +17,12 @@
#include "cmTryCompileCommand.h"
#include "cmCacheManager.h"
-// cmExecutableCommand
-bool cmTryCompileCommand::InitialPass(std::vector<std::string> const& argv)
+int cmTryCompileCommand::CoreTryCompileCode(
+ cmMakefile *mf, std::vector<std::string> const& argv, bool clean)
{
- if(argv.size() < 3)
- {
- return false;
- }
-
// which signature were we called with ?
bool srcFileSignature = true;
-
- // look for CMAKE_FLAGS and store them
- std::vector<std::string> cmakeFlags;
int i;
- for (i = 3; i < argv.size(); ++i)
- {
- if (argv[i] == "CMAKE_FLAGS")
- {
- for (; i < argv.size(); ++i)
- {
- cmakeFlags.push_back(argv[i]);
- }
- }
- else
- {
- srcFileSignature = false;
- }
- }
// where will the binaries be stored
const char* binaryDirectory = argv[1].c_str();
@@ -52,7 +30,7 @@ bool cmTryCompileCommand::InitialPass(std::vector<std::string> const& argv)
const char* projectName = 0;
const char* targetName = 0;
std::string tmpString;
-
+
// compute the binary dir when TRY_COMPILE is called with a src file
// signature
if (srcFileSignature)
@@ -64,13 +42,54 @@ bool cmTryCompileCommand::InitialPass(std::vector<std::string> const& argv)
cmSystemTools::MakeDirectory(binaryDirectory);
// do not allow recursive try Compiles
- if (!strcmp(binaryDirectory,m_Makefile->GetHomeOutputDirectory()))
+ if (!strcmp(binaryDirectory,mf->GetHomeOutputDirectory()))
{
cmSystemTools::Error("Attempt at a recursive or nested TRY_COMPILE",
binaryDirectory);
- return false;
+ return -1;
}
-
+
+ // look for CMAKE_FLAGS and store them
+ std::vector<std::string> cmakeFlags;
+ for (i = 3; i < argv.size(); ++i)
+ {
+ if (argv[i] == "CMAKE_FLAGS")
+ {
+ for (; i < argv.size() && argv[i] != "COMPILE_DEFINITIONS";
+ ++i)
+ {
+ cmakeFlags.push_back(argv[i]);
+ }
+ break;
+ }
+ else
+ {
+ srcFileSignature = false;
+ }
+ }
+
+ // look for COMPILE_DEFINITIONS and store them
+ std::vector<std::string> compileFlags;
+ for (i = 0; i < argv.size(); ++i)
+ {
+ if (argv[i] == "COMPILE_DEFINITIONS")
+ {
+ // only valid for srcfile signatures
+ if (!srcFileSignature)
+ {
+ cmSystemTools::Error(
+ "COMPILE_FLAGS specified on a srcdir type TRY_COMPILE");
+ return -1;
+ }
+ for (i = i + 1; i < argv.size() && argv[i] != "CMAKE_FLAGS";
+ ++i)
+ {
+ compileFlags.push_back(argv[i]);
+ }
+ break;
+ }
+ }
+
// which signature are we using? If we are using var srcfile bindir
if (srcFileSignature)
{
@@ -89,13 +108,24 @@ bool cmTryCompileCommand::InitialPass(std::vector<std::string> const& argv)
{
cmSystemTools::Error("Failed to create CMakeList file for ",
outFileName.c_str());
- return false;
+ return -1;
}
- fprintf(fout,"PROJECT(CMAKE_TRY_COMPILE)\n");
+ fprintf(fout, "PROJECT(CMAKE_TRY_COMPILE)\n");
fprintf(fout, "IF (CMAKE_ANSI_CXXFLAGS)\n");
fprintf(fout, " SET(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} ${CMAKE_ANSI_CXXFLAGS}\")\n");
fprintf(fout, "ENDIF (CMAKE_ANSI_CXXFLAGS)\n");
- fprintf(fout,"ADD_EXECUTABLE(cmTryCompileExec \"%s\")\n",argv[2].c_str());
+ // handle any compile flags we need to pass on
+ if (compileFlags.size())
+ {
+ fprintf(fout, "ADD_DEFINITIONS( ");
+ for (i = 0; i < compileFlags.size(); ++i)
+ {
+ fprintf(fout,"%s ",compileFlags[i].c_str());
+ }
+ fprintf(fout, ")\n");
+ }
+
+ fprintf(fout, "ADD_EXECUTABLE(cmTryCompileExec \"%s\")\n",argv[2].c_str());
fclose(fout);
projectName = "CMAKE_TRY_COMPILE";
targetName = "cmTryCompileExec";
@@ -112,14 +142,14 @@ bool cmTryCompileCommand::InitialPass(std::vector<std::string> const& argv)
}
// actually do the try compile now that everything is setup
- int res = m_Makefile->TryCompile(sourceDirectory, binaryDirectory,
- projectName, targetName, &cmakeFlags);
+ int res = mf->TryCompile(sourceDirectory, binaryDirectory,
+ projectName, targetName, &cmakeFlags);
// set the result var to the return value to indicate success or failure
- m_Makefile->AddDefinition(argv[0].c_str(), (res == 0 ? "TRUE" : "FALSE"));
-
- // if we created a directory etc, then cleanup after ourselves
- if (srcFileSignature)
+ mf->AddDefinition(argv[0].c_str(), (res == 0 ? "TRUE" : "FALSE"));
+
+ // if They specified clean then we clean up what we can
+ if (srcFileSignature && clean)
{
cmDirectory dir;
dir.Load(binaryDirectory);
@@ -137,6 +167,19 @@ bool cmTryCompileCommand::InitialPass(std::vector<std::string> const& argv)
}
}
+ return res;
+}
+
+// cmExecutableCommand
+bool cmTryCompileCommand::InitialPass(std::vector<std::string> const& argv)
+{
+ if(argv.size() < 3)
+ {
+ return false;
+ }
+
+ cmTryCompileCommand::CoreTryCompileCode(m_Makefile,argv,true);
+
return true;
}