Browse Source

another signature for Try_Compile

Ken Martin 23 years ago
parent
commit
31f714fc2a
2 changed files with 66 additions and 7 deletions
  1. 63 6
      Source/cmTryCompileCommand.cxx
  2. 3 1
      Source/cmTryCompileCommand.h

+ 63 - 6
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;
 }
 

+ 3 - 1
Source/cmTryCompileCommand.h

@@ -65,7 +65,9 @@ public:
       "TRY_COMPILE(RESULT_VAR srcdir bindir projectName <targetName>)\n"
       "Try compiling a program. Return the success or failure in RESULT_VAR "
       "If <target name> is specified then build just that target "
-      "otherwise the all or ALL_BUILD target is built.";
+      "otherwise the all or ALL_BUILD target is built.\n"
+      "TRY_COMPILE(RESULT_VAR srcfile bindir)\n"
+      "Try compiling a srcfile. Return the success or failure in RESULT_VAR.";
     }
   
   cmTypeMacro(cmTryCompileCommand, cmCommand);