Переглянути джерело

ENH: add COMPILE_FLAGS to targets

Bill Hoffman 20 роки тому
батько
коміт
07ef88c985

+ 7 - 3
Source/cmGlobalXCodeGenerator.cxx

@@ -466,12 +466,16 @@ cmXCodeObject* cmGlobalXCodeGenerator::CreateObjectReference(cmXCodeObject* ref)
 //----------------------------------------------------------------------------
 cmXCodeObject* 
 cmGlobalXCodeGenerator::CreateXCodeSourceFile(cmLocalGenerator* lg, 
-                                              cmSourceFile* sf)
+                                              cmSourceFile* sf,
+                                              cmTarget& cmtarget)
 {
   std::string flags;
   // Add flags from source file properties.
+  if(cmtarget.GetProperty("COMPILE_FLAGS"))
+    {
+    lg->AppendFlags(flags, cmtarget.GetProperty("COMPILE_FLAGS"));
+    }
   lg->AppendFlags(flags, sf->GetProperty("COMPILE_FLAGS"));
-
   cmXCodeObject* fileRef = this->CreateObject(cmXCodeObject::PBXFileReference);
 
   cmXCodeObject* group = m_GroupMap[sf];
@@ -650,7 +654,7 @@ cmGlobalXCodeGenerator::CreateXCodeTargets(cmLocalGenerator* gen,
         i != classes.end(); ++i)
       {
       cmXCodeObject* xsf =
-        this->CreateXCodeSourceFile(m_CurrentLocalGenerator, *i);
+        this->CreateXCodeSourceFile(m_CurrentLocalGenerator, *i, cmtarget);
       cmXCodeObject* fr = xsf->GetObject("fileRef");
       cmXCodeObject* filetype = 
         fr->GetObject()->GetObject("lastKnownFileType");

+ 2 - 1
Source/cmGlobalXCodeGenerator.h

@@ -124,7 +124,8 @@ private:
                                   cmLocalGenerator* root,
                                   std::vector<cmLocalGenerator*>& generators);
   cmXCodeObject* CreateXCodeSourceFile(cmLocalGenerator* gen, 
-                                       cmSourceFile* sf);
+                                       cmSourceFile* sf,
+                                       cmTarget& cmtarget);
   void CreateXCodeTargets(cmLocalGenerator* gen, std::vector<cmXCodeObject*>&);
   void AddDependTarget(cmXCodeObject* target,
                        cmXCodeObject* dependTarget);

+ 4 - 0
Source/cmLocalUnixMakefileGenerator3.cxx

@@ -617,6 +617,10 @@ cmLocalUnixMakefileGenerator3
   // Write the build rule.
   // Build the set of compiler flags.
   std::string flags;
+  if(target.GetProperty("COMPILE_FLAGS"))
+    {
+    this->AppendFlags(flags, target.GetProperty("COMPILE_FLAGS"));
+    }
 
   // Add flags from source file properties.
   if (source.GetProperty("COMPILE_FLAGS"))

+ 6 - 0
Source/cmLocalVisualStudio6Generator.cxx

@@ -405,6 +405,12 @@ void cmLocalVisualStudio6Generator::WriteGroup(const cmSourceGroup *sg, cmTarget
       {
       compileFlags = cflags;
       }
+    if(target.GetProperty("COMPILE_FLAGS"))
+      {
+      compileFlags += " ";
+      compileFlags += target.GetProperty("COMPILE_FLAGS");
+      }
+
     const char* lang = 
       m_GlobalGenerator->GetLanguageFromExtension((*sf)->GetSourceExtension().c_str());
     if(lang && strcmp(lang, "CXX") == 0)

+ 8 - 2
Source/cmLocalVisualStudio7Generator.cxx

@@ -1036,11 +1036,17 @@ void cmLocalVisualStudio7Generator::WriteGroup(const cmSourceGroup *sg, cmTarget
     std::string additionalDeps;
 
     // Check for extra compiler flags.
+    if(target.GetProperty("COMPILE_FLAGS"))
+      {
+      compileFlags += " ";
+      compileFlags += target.GetProperty("COMPILE_FLAGS");
+      }
     const char* cflags = (*sf)->GetProperty("COMPILE_FLAGS");
     if(cflags)
       {
-      compileFlags = cflags;
-      }
+      compileFlags += " ";
+      compileFlags += cflags;
+      } 
     const char* lang = 
       m_GlobalGenerator->GetLanguageFromExtension((*sf)->GetSourceExtension().c_str());
     if(lang && strcmp(lang, "CXX") == 0)

+ 1 - 1
Tests/Complex/Executable/CMakeLists.txt

@@ -56,7 +56,7 @@ SET_SOURCE_FILES_PROPERTIES(complex
   COMPILE_FLAGS "-DFILE_HAS_EXTRA_COMPILE_FLAGS"
   OBJECT_DEPENDS ${Complex_BINARY_DIR}/cmTestGeneratedHeader.h
 )
-
+SET_TARGET_PROPERTIES(complex PROPERTIES COMPILE_FLAGS "-DCOMPLEX_TARGET_FLAG")
 ADD_CUSTOM_COMMAND(
   TARGET complex
   SOURCE ${Complex_SOURCE_DIR}/cmTestGeneratedHeader.h.in

+ 17 - 3
Tests/Complex/Executable/complex.cxx

@@ -272,6 +272,7 @@ void ForceStringUse()
 
 // defined in testcflags.c
 extern "C" int TestCFlags(char* m);
+extern "C" int TestTargetCompileFlags(char* m);
 
 // ======================================================================
 
@@ -387,7 +388,12 @@ int main()
     {
     cmPassed("Call to file1 function returned 1.");
     }
-
+#ifndef COMPLEX_TARGET_FLAG
+  cmFailed("COMPILE_FLAGS did not work with SET_TARGET_PROPERTIES");
+#else
+  cmPassed("COMPILE_FLAGS did work with SET_TARGET_PROPERTIES");
+#endif
+  
   if(file2() != 1)
     {
     cmFailed("Call to file2 function from library failed.");
@@ -403,6 +409,7 @@ int main()
 #endif
   std::string gen = CMAKE_GENERATOR;
   // visual studio is currently broken for c flags
+  char msg[1024];
   if(gen.find("Visual") == gen.npos)
     {
 #ifdef TEST_C_FLAGS
@@ -410,7 +417,6 @@ int main()
 #else
     cmPassed("CMake CMAKE_C_FLAGS are not being passed to c++ files.");
 #endif
-    char msg[1024];
     if(TestCFlags(msg))
       {
       cmPassed(
@@ -421,7 +427,15 @@ int main()
       cmFailed(msg);
       }
     }
-  
+  if(TestTargetCompileFlags(msg))
+    {
+    cmPassed(msg);
+    }
+  else
+    {
+    cmFailed(msg);
+    }
+
   // ----------------------------------------------------------------------
   // Test ADD_DEFINITIONS
 

+ 11 - 0
Tests/Complex/Executable/testcflags.c

@@ -1,4 +1,15 @@
 #include <string.h>
+
+int TestTargetCompileFlags(char* m)
+{
+#ifndef COMPLEX_TARGET_FLAG
+  strcpy(m, "CMAKE SET_TARGET_PROPERTIES COMPILE_FLAGS did not work");
+  return 0;
+#endif
+  strcpy(m, "CMAKE SET_TARGET_PROPERTIES COMPILE_FLAGS worked");
+  return 1;
+}
+
 int TestCFlags(char* m)
 {
   /* TEST_CXX_FLAGS should not be defined in a c file */

+ 1 - 1
Tests/ComplexOneConfig/Executable/CMakeLists.txt

@@ -56,7 +56,7 @@ SET_SOURCE_FILES_PROPERTIES(complex
   COMPILE_FLAGS "-DFILE_HAS_EXTRA_COMPILE_FLAGS"
   OBJECT_DEPENDS ${Complex_BINARY_DIR}/cmTestGeneratedHeader.h
 )
-
+SET_TARGET_PROPERTIES(complex PROPERTIES COMPILE_FLAGS "-DCOMPLEX_TARGET_FLAG")
 ADD_CUSTOM_COMMAND(
   TARGET complex
   SOURCE ${Complex_SOURCE_DIR}/cmTestGeneratedHeader.h.in

+ 17 - 3
Tests/ComplexOneConfig/Executable/complex.cxx

@@ -272,6 +272,7 @@ void ForceStringUse()
 
 // defined in testcflags.c
 extern "C" int TestCFlags(char* m);
+extern "C" int TestTargetCompileFlags(char* m);
 
 // ======================================================================
 
@@ -387,7 +388,12 @@ int main()
     {
     cmPassed("Call to file1 function returned 1.");
     }
-
+#ifndef COMPLEX_TARGET_FLAG
+  cmFailed("COMPILE_FLAGS did not work with SET_TARGET_PROPERTIES");
+#else
+  cmPassed("COMPILE_FLAGS did work with SET_TARGET_PROPERTIES");
+#endif
+  
   if(file2() != 1)
     {
     cmFailed("Call to file2 function from library failed.");
@@ -403,6 +409,7 @@ int main()
 #endif
   std::string gen = CMAKE_GENERATOR;
   // visual studio is currently broken for c flags
+  char msg[1024];
   if(gen.find("Visual") == gen.npos)
     {
 #ifdef TEST_C_FLAGS
@@ -410,7 +417,6 @@ int main()
 #else
     cmPassed("CMake CMAKE_C_FLAGS are not being passed to c++ files.");
 #endif
-    char msg[1024];
     if(TestCFlags(msg))
       {
       cmPassed(
@@ -421,7 +427,15 @@ int main()
       cmFailed(msg);
       }
     }
-  
+  if(TestTargetCompileFlags(msg))
+    {
+    cmPassed(msg);
+    }
+  else
+    {
+    cmFailed(msg);
+    }
+
   // ----------------------------------------------------------------------
   // Test ADD_DEFINITIONS
 

+ 11 - 0
Tests/ComplexOneConfig/Executable/testcflags.c

@@ -1,4 +1,15 @@
 #include <string.h>
+
+int TestTargetCompileFlags(char* m)
+{
+#ifndef COMPLEX_TARGET_FLAG
+  strcpy(m, "CMAKE SET_TARGET_PROPERTIES COMPILE_FLAGS did not work");
+  return 0;
+#endif
+  strcpy(m, "CMAKE SET_TARGET_PROPERTIES COMPILE_FLAGS worked");
+  return 1;
+}
+
 int TestCFlags(char* m)
 {
   /* TEST_CXX_FLAGS should not be defined in a c file */

+ 1 - 1
Tests/ComplexRelativePaths/Executable/CMakeLists.txt

@@ -56,7 +56,7 @@ SET_SOURCE_FILES_PROPERTIES(complex
   COMPILE_FLAGS "-DFILE_HAS_EXTRA_COMPILE_FLAGS"
   OBJECT_DEPENDS ${Complex_BINARY_DIR}/cmTestGeneratedHeader.h
 )
-
+SET_TARGET_PROPERTIES(complex PROPERTIES COMPILE_FLAGS "-DCOMPLEX_TARGET_FLAG")
 ADD_CUSTOM_COMMAND(
   TARGET complex
   SOURCE ${Complex_SOURCE_DIR}/cmTestGeneratedHeader.h.in

+ 17 - 3
Tests/ComplexRelativePaths/Executable/complex.cxx

@@ -272,6 +272,7 @@ void ForceStringUse()
 
 // defined in testcflags.c
 extern "C" int TestCFlags(char* m);
+extern "C" int TestTargetCompileFlags(char* m);
 
 // ======================================================================
 
@@ -387,7 +388,12 @@ int main()
     {
     cmPassed("Call to file1 function returned 1.");
     }
-
+#ifndef COMPLEX_TARGET_FLAG
+  cmFailed("COMPILE_FLAGS did not work with SET_TARGET_PROPERTIES");
+#else
+  cmPassed("COMPILE_FLAGS did work with SET_TARGET_PROPERTIES");
+#endif
+  
   if(file2() != 1)
     {
     cmFailed("Call to file2 function from library failed.");
@@ -403,6 +409,7 @@ int main()
 #endif
   std::string gen = CMAKE_GENERATOR;
   // visual studio is currently broken for c flags
+  char msg[1024];
   if(gen.find("Visual") == gen.npos)
     {
 #ifdef TEST_C_FLAGS
@@ -410,7 +417,6 @@ int main()
 #else
     cmPassed("CMake CMAKE_C_FLAGS are not being passed to c++ files.");
 #endif
-    char msg[1024];
     if(TestCFlags(msg))
       {
       cmPassed(
@@ -421,7 +427,15 @@ int main()
       cmFailed(msg);
       }
     }
-  
+  if(TestTargetCompileFlags(msg))
+    {
+    cmPassed(msg);
+    }
+  else
+    {
+    cmFailed(msg);
+    }
+
   // ----------------------------------------------------------------------
   // Test ADD_DEFINITIONS
 

+ 11 - 0
Tests/ComplexRelativePaths/Executable/testcflags.c

@@ -1,4 +1,15 @@
 #include <string.h>
+
+int TestTargetCompileFlags(char* m)
+{
+#ifndef COMPLEX_TARGET_FLAG
+  strcpy(m, "CMAKE SET_TARGET_PROPERTIES COMPILE_FLAGS did not work");
+  return 0;
+#endif
+  strcpy(m, "CMAKE SET_TARGET_PROPERTIES COMPILE_FLAGS worked");
+  return 1;
+}
+
 int TestCFlags(char* m)
 {
   /* TEST_CXX_FLAGS should not be defined in a c file */