diff options
author | Brad King <brad.king@kitware.com> | 2006-08-03 13:42:48 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2006-08-03 13:42:48 (GMT) |
commit | 441d208bb323b49bc7a42036d17fb5eb2a9cba48 (patch) | |
tree | 6bd8a4c10987d0c1b5cefe2f71a65fed2adf2160 | |
parent | 24b55bfe11db52b37795b241272b0a1511e12bd5 (diff) | |
download | CMake-441d208bb323b49bc7a42036d17fb5eb2a9cba48.zip CMake-441d208bb323b49bc7a42036d17fb5eb2a9cba48.tar.gz CMake-441d208bb323b49bc7a42036d17fb5eb2a9cba48.tar.bz2 |
ENH: Added target property CLEAN_DIRECT_OUTPUT to not clean all forms of a library name so that static and shared libraries of the same name can coexist in a single build directory.
-rw-r--r-- | Source/cmMakefileLibraryTargetGenerator.cxx | 132 | ||||
-rw-r--r-- | Source/cmSetTargetPropertiesCommand.h | 7 | ||||
-rw-r--r-- | Source/cmTarget.cxx | 11 |
3 files changed, 101 insertions, 49 deletions
diff --git a/Source/cmMakefileLibraryTargetGenerator.cxx b/Source/cmMakefileLibraryTargetGenerator.cxx index 0009429..0697e2c 100644 --- a/Source/cmMakefileLibraryTargetGenerator.cxx +++ b/Source/cmMakefileLibraryTargetGenerator.cxx @@ -305,59 +305,93 @@ void cmMakefileLibraryTargetGenerator::WriteLibraryRules // Construct a list of files associated with this library that may // need to be cleaned. std::vector<std::string> libCleanFiles; - { - std::string cleanStaticName; - std::string cleanSharedName; - std::string cleanSharedSOName; - std::string cleanSharedRealName; - std::string cleanImportName; - this->Target->GetLibraryCleanNames( - cleanStaticName, - cleanSharedName, - cleanSharedSOName, - cleanSharedRealName, - cleanImportName, - this->LocalGenerator->ConfigurationName.c_str()); - std::string cleanFullStaticName = outpath + cleanStaticName; - std::string cleanFullSharedName = outpath + cleanSharedName; - std::string cleanFullSharedSOName = outpath + cleanSharedSOName; - std::string cleanFullSharedRealName = outpath + cleanSharedRealName; - std::string cleanFullImportName = outpath + cleanImportName; - libCleanFiles.push_back - (this->Convert(cleanFullStaticName.c_str(),cmLocalGenerator::START_OUTPUT, - cmLocalGenerator::UNCHANGED)); - if(cleanSharedRealName != cleanStaticName) - { - libCleanFiles.push_back(this->Convert(cleanFullSharedRealName.c_str(), - cmLocalGenerator::START_OUTPUT, - cmLocalGenerator::UNCHANGED)); - } - if(cleanSharedSOName != cleanStaticName && - cleanSharedSOName != cleanSharedRealName) - { - libCleanFiles.push_back(this->Convert(cleanFullSharedSOName.c_str(), - cmLocalGenerator::START_OUTPUT, - cmLocalGenerator::UNCHANGED)); - } - if(cleanSharedName != cleanStaticName && - cleanSharedName != cleanSharedSOName && - cleanSharedName != cleanSharedRealName) + if(this->Target->GetPropertyAsBool("CLEAN_DIRECT_OUTPUT")) { - libCleanFiles.push_back(this->Convert(cleanFullSharedName.c_str(), - cmLocalGenerator::START_OUTPUT, - cmLocalGenerator::UNCHANGED)); + // The user has requested that only the files directly built + // by this target be cleaned instead of all possible names. + libCleanFiles.push_back(this->Convert(targetFullPath.c_str(), + cmLocalGenerator::START_OUTPUT, + cmLocalGenerator::UNCHANGED)); + if(targetNameReal != targetName) + { + libCleanFiles.push_back(this->Convert(targetFullPathReal.c_str(), + cmLocalGenerator::START_OUTPUT, + cmLocalGenerator::UNCHANGED)); + } + if(targetNameSO != targetName && + targetNameSO != targetNameReal) + { + libCleanFiles.push_back(this->Convert(targetFullPathSO.c_str(), + cmLocalGenerator::START_OUTPUT, + cmLocalGenerator::UNCHANGED)); + } + if(!targetNameImport.empty() && + targetNameImport != targetName && + targetNameImport != targetNameReal && + targetNameImport != targetNameSO) + { + libCleanFiles.push_back(this->Convert(targetFullPathImport.c_str(), + cmLocalGenerator::START_OUTPUT, + cmLocalGenerator::UNCHANGED)); + } } - if(!cleanImportName.empty() && - cleanImportName != cleanStaticName && - cleanImportName != cleanSharedSOName && - cleanImportName != cleanSharedRealName && - cleanImportName != cleanSharedName) + else { - libCleanFiles.push_back(this->Convert(cleanFullImportName.c_str(), - cmLocalGenerator::START_OUTPUT, - cmLocalGenerator::UNCHANGED)); + // This target may switch between static and shared based + // on a user option or the BUILD_SHARED_LIBS switch. Clean + // all possible names. + std::string cleanStaticName; + std::string cleanSharedName; + std::string cleanSharedSOName; + std::string cleanSharedRealName; + std::string cleanImportName; + this->Target->GetLibraryCleanNames( + cleanStaticName, + cleanSharedName, + cleanSharedSOName, + cleanSharedRealName, + cleanImportName, + this->LocalGenerator->ConfigurationName.c_str()); + std::string cleanFullStaticName = outpath + cleanStaticName; + std::string cleanFullSharedName = outpath + cleanSharedName; + std::string cleanFullSharedSOName = outpath + cleanSharedSOName; + std::string cleanFullSharedRealName = outpath + cleanSharedRealName; + std::string cleanFullImportName = outpath + cleanImportName; + libCleanFiles.push_back + (this->Convert(cleanFullStaticName.c_str(),cmLocalGenerator::START_OUTPUT, + cmLocalGenerator::UNCHANGED)); + if(cleanSharedRealName != cleanStaticName) + { + libCleanFiles.push_back(this->Convert(cleanFullSharedRealName.c_str(), + cmLocalGenerator::START_OUTPUT, + cmLocalGenerator::UNCHANGED)); + } + if(cleanSharedSOName != cleanStaticName && + cleanSharedSOName != cleanSharedRealName) + { + libCleanFiles.push_back(this->Convert(cleanFullSharedSOName.c_str(), + cmLocalGenerator::START_OUTPUT, + cmLocalGenerator::UNCHANGED)); + } + if(cleanSharedName != cleanStaticName && + cleanSharedName != cleanSharedSOName && + cleanSharedName != cleanSharedRealName) + { + libCleanFiles.push_back(this->Convert(cleanFullSharedName.c_str(), + cmLocalGenerator::START_OUTPUT, + cmLocalGenerator::UNCHANGED)); + } + if(!cleanImportName.empty() && + cleanImportName != cleanStaticName && + cleanImportName != cleanSharedSOName && + cleanImportName != cleanSharedRealName && + cleanImportName != cleanSharedName) + { + libCleanFiles.push_back(this->Convert(cleanFullImportName.c_str(), + cmLocalGenerator::START_OUTPUT, + cmLocalGenerator::UNCHANGED)); + } } - } // Add a command to remove any existing files for this library. std::vector<std::string> commands1; this->LocalGenerator->AppendCleanCommand(commands1, libCleanFiles, diff --git a/Source/cmSetTargetPropertiesCommand.h b/Source/cmSetTargetPropertiesCommand.h index a605a77..86cb41a 100644 --- a/Source/cmSetTargetPropertiesCommand.h +++ b/Source/cmSetTargetPropertiesCommand.h @@ -133,6 +133,13 @@ public: "the target in an IDE like visual studio. VS_KEYWORD can be set " "to change the visual studio keyword, for example QT integration " "works better if this is set to Qt4VSv1.0.\n" + "When a library is built CMake by default generates code to remove " + "any existing library using all possible names. This is needed " + "to support libraries that switch between STATIC and SHARED by " + "a user option. However when using OUTPUT_NAME to build a static " + "and shared library of the same name using different logical target " + "names the two targets will remove each other's files. This can be " + "prevented by setting the CLEAN_DIRECT_OUTPUT property to 1.\n" "The PRE_INSTALL_SCRIPT and POST_INSTALL_SCRIPT properties are the " "old way to specify CMake scripts to run before and after " "installing a target. They are used only when the old " diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index c895907..a5515f4 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -1158,6 +1158,17 @@ void cmTarget::GetFullNameInternal(TargetType type, return; } + // Return an empty name for the import library if this platform + // does not support import libraries. + if(implib && + !this->Makefile->GetDefinition("CMAKE_IMPORT_LIBRARY_SUFFIX")) + { + outPrefix = ""; + outBase = ""; + outSuffix = ""; + return; + } + // The implib option is only allowed for shared libraries. if(type != cmTarget::SHARED_LIBRARY) { |