summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Source/cmCommands.cxx4
-rw-r--r--Source/cmLocalUnixMakefileGenerator.cxx114
-rw-r--r--Source/cmTarget.cxx36
-rw-r--r--Source/cmTarget.h11
-rw-r--r--Tests/Complex/Library/CMakeLists.txt8
-rw-r--r--Tests/ComplexOneConfig/Library/CMakeLists.txt8
-rw-r--r--Tests/ComplexRelativePaths/Library/CMakeLists.txt8
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.