Ver código fonte

fix to the signature and argument parsing

Ken Martin 22 anos atrás
pai
commit
baaf5eae7d
2 arquivos alterados com 24 adições e 17 exclusões
  1. 23 16
      Source/cmTryCompileCommand.cxx
  2. 1 1
      Source/cmTryCompileCommand.h

+ 23 - 16
Source/cmTryCompileCommand.cxx

@@ -33,24 +33,21 @@ int cmTryCompileCommand::CoreTryCompileCode(
   const char* projectName = 0;
   const char* projectName = 0;
   const char* targetName = 0;
   const char* targetName = 0;
   std::string tmpString;
   std::string tmpString;
-
-  // do we have a srcfile signature
-  if (argv.size() == 3 || argv[3] == "CMAKE_FLAGS" || argv[3] == "COMPILE_DEFINITIONS" ||
-      argv[3] == "OUTPUT_VARIABLE")
-    {
-    srcFileSignature = true;
-    }
-
+  int extraArgs = 0;
+  
   // look for CMAKE_FLAGS and store them
   // look for CMAKE_FLAGS and store them
   std::vector<std::string> cmakeFlags;
   std::vector<std::string> cmakeFlags;
   for (i = 3; i < argv.size(); ++i)
   for (i = 3; i < argv.size(); ++i)
     {
     {
     if (argv[i] == "CMAKE_FLAGS")
     if (argv[i] == "CMAKE_FLAGS")
       {
       {
+      extraArgs++;
+      ++i;
       for (; i < argv.size() && argv[i] != "COMPILE_DEFINITIONS" && 
       for (; i < argv.size() && argv[i] != "COMPILE_DEFINITIONS" && 
              argv[i] != "OUTPUT_VARIABLE"; 
              argv[i] != "OUTPUT_VARIABLE"; 
            ++i)
            ++i)
         {
         {
+        extraArgs++;
         cmakeFlags.push_back(argv[i]);
         cmakeFlags.push_back(argv[i]);
         }
         }
       break;
       break;
@@ -69,6 +66,7 @@ int cmTryCompileCommand::CoreTryCompileCode(
           "OUTPUT_VARIABLE specified but there is no variable");
           "OUTPUT_VARIABLE specified but there is no variable");
         return -1;
         return -1;
         }
         }
+      extraArgs += 2;
       outputVariable = argv[i+1];
       outputVariable = argv[i+1];
       break;
       break;
       }
       }
@@ -80,23 +78,32 @@ int cmTryCompileCommand::CoreTryCompileCode(
     {
     {
     if (argv[i] == "COMPILE_DEFINITIONS")
     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;
-        }
+      extraArgs++;
       for (i = i + 1; i < argv.size() && argv[i] != "CMAKE_FLAGS" && 
       for (i = i + 1; i < argv.size() && argv[i] != "CMAKE_FLAGS" && 
              argv[i] != "OUTPUT_VARIABLE"; 
              argv[i] != "OUTPUT_VARIABLE"; 
            ++i)
            ++i)
         {
         {
+        extraArgs++;
         compileFlags.push_back(argv[i]);
         compileFlags.push_back(argv[i]);
         }
         }
       break;
       break;
       }
       }
     }
     }
 
 
+  // do we have a srcfile signature
+  if (argv.size() - extraArgs == 3)
+    {
+    srcFileSignature = true;
+    }
+
+  // only valid for srcfile signatures
+  if (!srcFileSignature && compileFlags.size())
+    {
+    cmSystemTools::Error(
+      "COMPILE_FLAGS specified on a srcdir type TRY_COMPILE");
+    return -1;
+    }
+
   // compute the binary dir when TRY_COMPILE is called with a src file
   // compute the binary dir when TRY_COMPILE is called with a src file
   // signature
   // signature
   if (srcFileSignature)
   if (srcFileSignature)
@@ -203,7 +210,7 @@ int cmTryCompileCommand::CoreTryCompileCode(
     {
     {
     projectName = argv[3].c_str();
     projectName = argv[3].c_str();
     
     
-    if (argv.size() == 5)
+    if (argv.size() - extraArgs == 5)
       {
       {
       targetName = argv[4].c_str();
       targetName = argv[4].c_str();
       }
       }

+ 1 - 1
Source/cmTryCompileCommand.h

@@ -75,7 +75,7 @@ public:
     {
     {
     return
     return
       "  TRY_COMPILE(RESULT_VAR bindir srcdir\n"
       "  TRY_COMPILE(RESULT_VAR bindir srcdir\n"
-      "              projectName <CMAKE_FLAGS <Flags>>\n"
+      "              projectName <targetname> <CMAKE_FLAGS <Flags>>\n"
       "              <OUTPUT_VARIABLE var>)\n"
       "              <OUTPUT_VARIABLE var>)\n"
       "Try compiling a program.  Return the success or failure in RESULT_VAR.  "
       "Try compiling a program.  Return the success or failure in RESULT_VAR.  "
       "If <target name> is specified then build just that target "
       "If <target name> is specified then build just that target "