diff options
Diffstat (limited to 'Source/cmTryCompileCommand.cxx')
-rw-r--r-- | Source/cmTryCompileCommand.cxx | 69 |
1 files changed, 63 insertions, 6 deletions
diff --git a/Source/cmTryCompileCommand.cxx b/Source/cmTryCompileCommand.cxx index 77e061f..eba8ca6 100644 --- a/Source/cmTryCompileCommand.cxx +++ b/Source/cmTryCompileCommand.cxx @@ -20,26 +20,83 @@ // cmExecutableCommand bool cmTryCompileCommand::InitialPass(std::vector<std::string> const& argv) { - if(argv.size() < 4) + if(argv.size() < 3) { return false; } - - const char* sourceDirectory = argv[1].c_str(); + + // where will the binaries be stored const char* binaryDirectory = argv[2].c_str(); - const char* projectName = argv[3].c_str(); + const char* sourceDirectory = argv[1].c_str(); + 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 (argv.size() == 3) + { + tmpString = argv[2] + "/CMakeTmp"; + binaryDirectory = tmpString.c_str(); + } - if (argv.size() == 5) + // do not allow recursive try Compiles + if (!strcmp(binaryDirectory,m_Makefile->GetHomeOutputDirectory())) + { + cmSystemTools::Error("Attempt at a recursive or nested TRY_COMPILE", + binaryDirectory); + return false; + } + + // which signature are we using? If we are using var srcfile bindir + if (argv.size() == 3) + { + // remove any CMakeCache.txt files so we will have a clean test + std::string ccFile = tmpString + "/CMakeCache.txt"; + cmSystemTools::RemoveFile(ccFile.c_str()); + + // we need to create a directory and CMakeList file etc... + // first create the directories + sourceDirectory = binaryDirectory; + cmSystemTools::MakeDirectory(binaryDirectory); + + // now create a CMakeList.txt file in that directory + std::string outFileName = tmpString + "/CMakeLists.txt"; + FILE *fout = fopen(outFileName.c_str(),"w"); + if (!fout) + { + cmSystemTools::Error("Failed to create CMakeList file for ", + outFileName.c_str()); + return false; + } + fprintf(fout,"PROJECT(CMAKE_TRY_COMPILE)\n"); + fprintf(fout,"ADD_EXECUTABLE(cmTryCompileExec \"%s\")\n",argv[1].c_str()); + fclose(fout); + projectName = "CMAKE_TRY_COMPILE"; + targetName = "cmTryCompileExec"; + } + // else the srcdir bindir project target signature + else { - targetName = argv[4].c_str(); + projectName = argv[3].c_str(); + + if (argv.size() == 5) + { + targetName = argv[4].c_str(); + } } + // actually do the try compile now that everything is setup int res = m_Makefile->TryCompile(sourceDirectory, binaryDirectory, projectName, targetName); // 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 + // Actually right now lets not clean up after ourselves, removing + // a directory is tricky and putting that code in could be a risk + return true; } |