diff options
-rw-r--r-- | Source/cmCommands.cxx | 4 | ||||
-rw-r--r-- | Source/cmLocalUnixMakefileGenerator.cxx | 114 | ||||
-rw-r--r-- | Source/cmTarget.cxx | 36 | ||||
-rw-r--r-- | Source/cmTarget.h | 11 | ||||
-rw-r--r-- | Tests/Complex/Library/CMakeLists.txt | 8 | ||||
-rw-r--r-- | Tests/ComplexOneConfig/Library/CMakeLists.txt | 8 | ||||
-rw-r--r-- | Tests/ComplexRelativePaths/Library/CMakeLists.txt | 8 |
7 files changed, 159 insertions, 30 deletions
diff --git a/Source/cmCommands.cxx b/Source/cmCommands.cxx index f52dd45..a60ff9f 100644 --- a/Source/cmCommands.cxx +++ b/Source/cmCommands.cxx @@ -46,6 +46,7 @@ #include "cmFLTKWrapUICommand.cxx" #include "cmGetFilenameComponentCommand.cxx" #include "cmGetSourceFilePropertyCommand.cxx" +#include "cmGetTargetPropertyCommand.cxx" #include "cmITKWrapTclCommand.cxx" #include "cmIfCommand.cxx" #include "cmIncludeCommand.cxx" @@ -69,6 +70,7 @@ #include "cmSeparateArgumentsCommand.cxx" #include "cmSetCommand.cxx" #include "cmSetSourceFilesPropertiesCommand.cxx" +#include "cmSetTargetPropertiesCommand.cxx" #include "cmSiteNameCommand.cxx" #include "cmSourceFilesCommand.cxx" #include "cmSourceFilesRemoveCommand.cxx" @@ -128,6 +130,7 @@ void GetPredefinedCommands(std::list<cmCommand*>& commands) commands.push_back(new cmFLTKWrapUICommand); commands.push_back(new cmGetFilenameComponentCommand); commands.push_back(new cmGetSourceFilePropertyCommand); + commands.push_back(new cmGetTargetPropertyCommand); commands.push_back(new cmITKWrapTclCommand); commands.push_back(new cmIfCommand); commands.push_back(new cmIncludeCommand); @@ -154,6 +157,7 @@ void GetPredefinedCommands(std::list<cmCommand*>& commands) commands.push_back(new cmSeparateArgumentsCommand); commands.push_back(new cmSetCommand); commands.push_back(new cmSetSourceFilesPropertiesCommand); + commands.push_back(new cmSetTargetPropertiesCommand); commands.push_back(new cmSiteNameCommand); commands.push_back(new cmSourceFilesCommand); commands.push_back(new cmSourceFilesRemoveCommand); diff --git a/Source/cmLocalUnixMakefileGenerator.cxx b/Source/cmLocalUnixMakefileGenerator.cxx index bb809ea..41778cb 100644 --- a/Source/cmLocalUnixMakefileGenerator.cxx +++ b/Source/cmLocalUnixMakefileGenerator.cxx @@ -333,31 +333,41 @@ void cmLocalUnixMakefileGenerator::OutputTargetRules(std::ostream& fout) { if (l->second.IsInAll()) { + const char* targetPrefix = l->second.GetProperty("PREFIX"); + const char* targetSuffix = l->second.GetProperty("SUFFIX"); std::string path = m_LibraryOutputPath; - if(l->second.GetType() == cmTarget::STATIC_LIBRARY) + const char* prefixVar = 0; + const char* suffixVar = 0; + switch(l->second.GetType()) { - path += - this->GetSafeDefinition("CMAKE_STATIC_LIBRARY_PREFIX") + - l->first - + this->GetSafeDefinition("CMAKE_STATIC_LIBRARY_SUFFIX"); - fout << " \\\n" - << cmSystemTools::ConvertToOutputPath(path.c_str()); - } - else if(l->second.GetType() == cmTarget::SHARED_LIBRARY) - { - path += - this->GetSafeDefinition("CMAKE_SHARED_LIBRARY_PREFIX") + - l->first - + this->GetSafeDefinition("CMAKE_SHARED_LIBRARY_SUFFIX"); - fout << " \\\n" - << cmSystemTools::ConvertToOutputPath(path.c_str()); + case cmTarget::STATIC_LIBRARY: + prefixVar = "CMAKE_STATIC_LIBRARY_PREFIX"; + suffixVar = "CMAKE_STATIC_LIBRARY_SUFFIX"; + break; + case cmTarget::SHARED_LIBRARY: + prefixVar = "CMAKE_SHARED_LIBRARY_PREFIX"; + suffixVar = "CMAKE_SHARED_LIBRARY_SUFFIX"; + break; + case cmTarget::MODULE_LIBRARY: + prefixVar = "CMAKE_SHARED_MODULE_PREFIX"; + suffixVar = "CMAKE_SHARED_MODULE_SUFFIX"; + break; } - else if(l->second.GetType() == cmTarget::MODULE_LIBRARY) + // if it is a library this will be set + if(prefixVar) { + // if there is no prefix on the target use the cmake definition + if(!targetPrefix) + { + targetPrefix = this->GetSafeDefinition(prefixVar); + } + // if there is no suffix on the target use the cmake definition + if(!targetSuffix) + { + targetSuffix = this->GetSafeDefinition(suffixVar); + } path += - this->GetSafeDefinition("CMAKE_SHARED_MODULE_PREFIX") + - l->first - + this->GetSafeDefinition("CMAKE_SHARED_MODULE_SUFFIX"); + targetPrefix + l->first + targetSuffix; fout << " \\\n" << cmSystemTools::ConvertToOutputPath(path.c_str()); } @@ -822,6 +832,8 @@ void cmLocalUnixMakefileGenerator::OutputLibraryRule(std::ostream& fout, // collect up the link libraries cmOStringStream linklibs; this->OutputLinkLibraries(linklibs, name, t); + const char* targetLinkFlags = t.GetProperty("LINK_FLAGS"); + std::string allLinkFlags; for(std::vector<std::string>::iterator i = commands.begin(); i != commands.end(); ++i) { @@ -876,9 +888,25 @@ void cmLocalUnixMakefileGenerator::OutputSharedLibraryRule(std::ostream& fout, } } #endif + const char* targetPrefix = t.GetProperty("PREFIX"); + if(!targetPrefix) + { + targetPrefix = this->GetSafeDefinition("CMAKE_SHARED_LIBRARY_PREFIX"); + } + const char* targetSuffix = t.GetProperty("SUFFIX"); + if(!targetSuffix) + { + targetSuffix = this->GetSafeDefinition("CMAKE_SHARED_LIBRARY_SUFFIX"); + } + const char* targetLinkFlags = t.GetProperty("LINK_FLAGS"); + if(targetLinkFlags) + { + linkFlags += targetLinkFlags; + linkFlags += " "; + } this->OutputLibraryRule(fout, name, t, - this->GetSafeDefinition("CMAKE_SHARED_LIBRARY_PREFIX"), - this->GetSafeDefinition("CMAKE_SHARED_LIBRARY_SUFFIX"), + targetPrefix, + targetSuffix, createRule, "shared library", linkFlags.c_str()); @@ -908,9 +936,25 @@ void cmLocalUnixMakefileGenerator::OutputModuleLibraryRule(std::ostream& fout, linkFlags += this->GetSafeDefinition(build.c_str()); linkFlags += " "; } + const char* targetPrefix = t.GetProperty("PREFIX"); + if(!targetPrefix) + { + targetPrefix = this->GetSafeDefinition("CMAKE_SHARED_MODULE_PREFIX"); + } + const char* targetSuffix = t.GetProperty("SUFFIX"); + if(!targetSuffix) + { + targetSuffix = this->GetSafeDefinition("CMAKE_SHARED_MODULE_SUFFIX"); + } + const char* targetLinkFlags = t.GetProperty("LINK_FLAGS"); + if(targetLinkFlags) + { + linkFlags += targetLinkFlags; + linkFlags += " "; + } this->OutputLibraryRule(fout, name, t, - this->GetSafeDefinition("CMAKE_SHARED_MODULE_PREFIX"), - this->GetSafeDefinition("CMAKE_SHARED_MODULE_SUFFIX"), + targetPrefix, + targetSuffix, createRule, "shared module", linkFlags.c_str()); @@ -929,10 +973,20 @@ void cmLocalUnixMakefileGenerator::OutputStaticLibraryRule(std::ostream& fout, else { createRule = "CMAKE_C_CREATE_STATIC_LIBRARY"; + } + const char* targetPrefix = t.GetProperty("PREFIX"); + if(!targetPrefix) + { + targetPrefix = this->GetSafeDefinition("CMAKE_STATIC_LIBRARY_PREFIX"); + } + const char* targetSuffix = t.GetProperty("SUFFIX"); + if(!targetSuffix) + { + targetSuffix = this->GetSafeDefinition("CMAKE_STATIC_LIBRARY_SUFFIX"); } this->OutputLibraryRule(fout, name, t, - this->GetSafeDefinition("CMAKE_STATIC_LIBRARY_PREFIX"), - this->GetSafeDefinition("CMAKE_STATIC_LIBRARY_SUFFIX"), + targetPrefix, + targetSuffix, createRule, "static library", 0); @@ -1008,8 +1062,12 @@ void cmLocalUnixMakefileGenerator::OutputExecutableRule(std::ostream& fout, linkFlags += this->GetSafeDefinition("CMAKE_CREATE_CONSOLE_EXE"); linkFlags += " "; } - - + const char* targetLinkFlags = t.GetProperty("LINK_FLAGS"); + if(targetLinkFlags) + { + linkFlags += targetLinkFlags; + linkFlags += " "; + } for(std::vector<std::string>::iterator i = commands.begin(); i != commands.end(); ++i) { diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 1e97557..602f826 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -544,3 +544,39 @@ void cmTarget::GatherDependencies( const cmMakefile& mf, DeleteDependency( dep_map, lib, lib); // cannot depend on itself } } + + +void cmTarget::SetProperty(const char* prop, const char* value) +{ + if (!prop) + { + return; + } + if (!value) + { + value = "NOTFOUND"; + } + m_Properties[prop] = value; +} + +const char *cmTarget::GetProperty(const char* prop) const +{ + std::map<cmStdString,cmStdString>::const_iterator i = + m_Properties.find(prop); + if (i != m_Properties.end()) + { + return i->second.c_str(); + } + return 0; +} + +bool cmTarget::GetPropertyAsBool(const char* prop) const +{ + std::map<cmStdString,cmStdString>::const_iterator i = + m_Properties.find(prop); + if (i != m_Properties.end()) + { + return cmSystemTools::IsOn(i->second.c_str()); + } + return false; +} diff --git a/Source/cmTarget.h b/Source/cmTarget.h index 1a26ba7..14ee770 100644 --- a/Source/cmTarget.h +++ b/Source/cmTarget.h @@ -125,6 +125,11 @@ public: void AnalyzeLibDependencies( const cmMakefile& mf ); + ///! Set/Get a property of this target file + void SetProperty(const char *prop, const char *value); + const char *GetProperty(const char *prop) const; + bool GetPropertyAsBool(const char *prop) const; + private: /** * A list of direct dependencies. Use in conjunction with DependencyMap. @@ -177,7 +182,8 @@ private: * dep_map. */ void GatherDependencies( const cmMakefile& mf, const std::string& lib, - DependencyMap& dep_map ); + DependencyMap& dep_map ); + private: std::vector<cmCustomCommand> m_CustomCommands; @@ -190,7 +196,8 @@ private: bool m_InAll; std::string m_InstallPath; std::set<cmStdString> m_Utilities; - bool m_RecordDependencies; + bool m_RecordDependencies; + std::map<cmStdString,cmStdString> m_Properties; }; typedef std::map<cmStdString,cmTarget> cmTargets; diff --git a/Tests/Complex/Library/CMakeLists.txt b/Tests/Complex/Library/CMakeLists.txt index cf6b976..9fccfc5 100644 --- a/Tests/Complex/Library/CMakeLists.txt +++ b/Tests/Complex/Library/CMakeLists.txt @@ -40,6 +40,14 @@ SOURCE_FILES(SharedLibrarySources sharedFile) ADD_LIBRARY(CMakeTestLibraryShared SHARED ${SharedLibrarySources}) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DTEST_C_FLAGS") ADD_LIBRARY(CMakeTestCLibraryShared SHARED testConly.c) +SET_TARGET_PROPERTIES(CMakeTestCLibraryShared PROPERTIES FOO BAR) +SET_TARGET_PROPERTIES(CMakeTestCLibraryShared PROPERTIES LINK_FLAGS "-lm") +GET_TARGET_PROPERTY(FOO_BAR_VAR CMakeTestCLibraryShared FOO) +IF(${FOO_BAR_VAR} MATCHES "BAR") +ELSE(${FOO_BAR_VAR} MATCHES "BAR") + MESSAGE(SEND_ERROR "SET_TARGET_PROPERTIES or GET_TARGET_PROPERTY failed, FOO_BAR_VAR should be BAR, but is ${FOO_BAR_VAR}") +ENDIF(${FOO_BAR_VAR} MATCHES "BAR") + # # Attach a post-build custom-command to the lib. diff --git a/Tests/ComplexOneConfig/Library/CMakeLists.txt b/Tests/ComplexOneConfig/Library/CMakeLists.txt index cf6b976..9fccfc5 100644 --- a/Tests/ComplexOneConfig/Library/CMakeLists.txt +++ b/Tests/ComplexOneConfig/Library/CMakeLists.txt @@ -40,6 +40,14 @@ SOURCE_FILES(SharedLibrarySources sharedFile) ADD_LIBRARY(CMakeTestLibraryShared SHARED ${SharedLibrarySources}) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DTEST_C_FLAGS") ADD_LIBRARY(CMakeTestCLibraryShared SHARED testConly.c) +SET_TARGET_PROPERTIES(CMakeTestCLibraryShared PROPERTIES FOO BAR) +SET_TARGET_PROPERTIES(CMakeTestCLibraryShared PROPERTIES LINK_FLAGS "-lm") +GET_TARGET_PROPERTY(FOO_BAR_VAR CMakeTestCLibraryShared FOO) +IF(${FOO_BAR_VAR} MATCHES "BAR") +ELSE(${FOO_BAR_VAR} MATCHES "BAR") + MESSAGE(SEND_ERROR "SET_TARGET_PROPERTIES or GET_TARGET_PROPERTY failed, FOO_BAR_VAR should be BAR, but is ${FOO_BAR_VAR}") +ENDIF(${FOO_BAR_VAR} MATCHES "BAR") + # # Attach a post-build custom-command to the lib. diff --git a/Tests/ComplexRelativePaths/Library/CMakeLists.txt b/Tests/ComplexRelativePaths/Library/CMakeLists.txt index cf6b976..9fccfc5 100644 --- a/Tests/ComplexRelativePaths/Library/CMakeLists.txt +++ b/Tests/ComplexRelativePaths/Library/CMakeLists.txt @@ -40,6 +40,14 @@ SOURCE_FILES(SharedLibrarySources sharedFile) ADD_LIBRARY(CMakeTestLibraryShared SHARED ${SharedLibrarySources}) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DTEST_C_FLAGS") ADD_LIBRARY(CMakeTestCLibraryShared SHARED testConly.c) +SET_TARGET_PROPERTIES(CMakeTestCLibraryShared PROPERTIES FOO BAR) +SET_TARGET_PROPERTIES(CMakeTestCLibraryShared PROPERTIES LINK_FLAGS "-lm") +GET_TARGET_PROPERTY(FOO_BAR_VAR CMakeTestCLibraryShared FOO) +IF(${FOO_BAR_VAR} MATCHES "BAR") +ELSE(${FOO_BAR_VAR} MATCHES "BAR") + MESSAGE(SEND_ERROR "SET_TARGET_PROPERTIES or GET_TARGET_PROPERTY failed, FOO_BAR_VAR should be BAR, but is ${FOO_BAR_VAR}") +ENDIF(${FOO_BAR_VAR} MATCHES "BAR") + # # Attach a post-build custom-command to the lib. |