From 43584bbc5b6f7ae4407b6d9391c1e23d154900f3 Mon Sep 17 00:00:00 2001 From: Modestas Vainius Date: Thu, 7 Nov 2013 00:51:16 +0200 Subject: [PATCH] Imported Upstream version 2.8.12.1 --- ChangeLog.manual | 26 ++ Modules/FindCUDA.cmake | 17 +- Modules/Platform/Windows-MSVC-C.cmake | 3 + Modules/Platform/Windows-MSVC-CXX.cmake | 3 + Modules/Platform/Windows-MSVC.cmake | 2 +- Source/CMakeVersion.cmake | 2 +- Source/cmExportFileGenerator.cxx | 5 + Source/cmGeneratorExpressionEvaluator.cxx | 2 +- Source/cmGlobalGenerator.cxx | 33 ++- Source/cmGlobalGenerator.h | 1 + Source/cmTarget.cxx | 223 +++++++++--------- Source/cmTargetLinkLibrariesCommand.cxx | 21 +- Source/cmTargetLinkLibrariesCommand.h | 11 +- Source/cmake.cxx | 2 +- .../cmp0022/CMakeLists.txt | 10 + .../cmp0022/onlyplainlib1.cpp | 13 + .../cmp0022/onlyplainlib1.h | 14 ++ .../cmp0022/onlyplainlib2.cpp | 8 + .../cmp0022/onlyplainlib2.h | 7 + .../cmp0022/onlyplainlib_user.cpp | 7 + Tests/QtAutomoc/foo.h | 5 +- .../CMP0022/CMP0022-NOWARN-exe-stderr.txt | 1 + .../RunCMake/CMP0022/CMP0022-NOWARN-exe.cmake | 7 + .../CMP0022/CMP0022-NOWARN-shared-stderr.txt | 1 + .../CMP0022/CMP0022-NOWARN-shared.cmake | 8 + .../CMP0022/CMP0022-NOWARN-static.cmake | 6 +- .../CMP0022/CMP0022-WARN-empty-old-result.txt | 1 + .../CMP0022/CMP0022-WARN-empty-old-stderr.txt | 19 ++ .../CMP0022/CMP0022-WARN-empty-old.cmake | 10 + .../CMP0022/CMP0022-WARN-static-stderr.txt | 17 +- .../RunCMake/CMP0022/CMP0022-WARN-stderr.txt | 6 +- .../CMP0022/CMP0022-WARN-tll-stderr.txt | 4 +- Tests/RunCMake/CMP0022/CMP0022-WARN.cmake | 5 + .../CMP0022/CMP0022-export-exe-stderr.txt | 1 + .../RunCMake/CMP0022/CMP0022-export-exe.cmake | 9 + Tests/RunCMake/CMP0022/RunCMakeTest.cmake | 4 + Tests/RunCMake/CMP0022/empty_vs6_4.cpp | 1 + .../BadTargetTypeObject-result.txt | 1 + .../BadTargetTypeObject-stderr.txt | 26 ++ .../BadTargetTypeObject.cmake | 7 + .../GeneratorExpression/RunCMakeTest.cmake | 1 + Tests/RunCMake/GeneratorExpression/empty.c | 0 .../ObjectLibrary/MissingSource-result.txt | 1 + .../ObjectLibrary/MissingSource-stderr.txt | 9 + .../ObjectLibrary/MissingSource.cmake | 1 + .../RunCMake/ObjectLibrary/RunCMakeTest.cmake | 1 + 46 files changed, 426 insertions(+), 136 deletions(-) create mode 100644 Tests/CMakeCommands/target_link_libraries/cmp0022/onlyplainlib1.cpp create mode 100644 Tests/CMakeCommands/target_link_libraries/cmp0022/onlyplainlib1.h create mode 100644 Tests/CMakeCommands/target_link_libraries/cmp0022/onlyplainlib2.cpp create mode 100644 Tests/CMakeCommands/target_link_libraries/cmp0022/onlyplainlib2.h create mode 100644 Tests/CMakeCommands/target_link_libraries/cmp0022/onlyplainlib_user.cpp create mode 100644 Tests/RunCMake/CMP0022/CMP0022-NOWARN-exe-stderr.txt create mode 100644 Tests/RunCMake/CMP0022/CMP0022-NOWARN-exe.cmake create mode 100644 Tests/RunCMake/CMP0022/CMP0022-NOWARN-shared-stderr.txt create mode 100644 Tests/RunCMake/CMP0022/CMP0022-NOWARN-shared.cmake create mode 100644 Tests/RunCMake/CMP0022/CMP0022-WARN-empty-old-result.txt create mode 100644 Tests/RunCMake/CMP0022/CMP0022-WARN-empty-old-stderr.txt create mode 100644 Tests/RunCMake/CMP0022/CMP0022-WARN-empty-old.cmake create mode 100644 Tests/RunCMake/CMP0022/CMP0022-export-exe-stderr.txt create mode 100644 Tests/RunCMake/CMP0022/CMP0022-export-exe.cmake create mode 100644 Tests/RunCMake/CMP0022/empty_vs6_4.cpp create mode 100644 Tests/RunCMake/GeneratorExpression/BadTargetTypeObject-result.txt create mode 100644 Tests/RunCMake/GeneratorExpression/BadTargetTypeObject-stderr.txt create mode 100644 Tests/RunCMake/GeneratorExpression/BadTargetTypeObject.cmake create mode 100644 Tests/RunCMake/GeneratorExpression/empty.c create mode 100644 Tests/RunCMake/ObjectLibrary/MissingSource-result.txt create mode 100644 Tests/RunCMake/ObjectLibrary/MissingSource-stderr.txt create mode 100644 Tests/RunCMake/ObjectLibrary/MissingSource.cmake diff --git a/ChangeLog.manual b/ChangeLog.manual index 0e84fb6d2..5d2dc8b31 100644 --- a/ChangeLog.manual +++ b/ChangeLog.manual @@ -1,3 +1,29 @@ +Changes in CMake 2.8.12.1 (since 2.8.12) +---------------------------------------- +Brad King (9): + MSVC: Add /FS flag for cl >= 18 to allow parallel compilation (#14492) + Genex: Reject $ for object libraries (#14532) + Check for OBJECT_LIBRARY source files at start of generation + CMP0022: Plain target_link_libraries must populate link interface + Do not export INTERFACE_LINK_LIBRARIES from non-linkable targets + CMP0022: Warn about a given target at most once + Fix summary documentation of INTERFACE_LINK_LIBRARIES + file(GENERATE): Clear internal records between configures + cmake: Validate -E cmake_automoc argument count (#14545) + +Modestas Vainius (1): + Fix spelling in INTERFACE_LINK_LIBRARIES documentation (#14542) + +Stephen Kelly (5): + CMP0022: Output link interface mismatch for static library warning + Don't add invalid content to static lib INTERFACE_LINK_LIBRARIES. + CMP0022: Add unit test for null pointer check and message. + CMP0022: Add test for target_link_libraries plain signature + Automoc: Add directory-level COMPILE_DEFINITIONS to command line (#14535) + +Vladislav Vinogradov (1): + FindCUDA: Fix NPP library search for CUDA 5.5 + Changes in CMake 2.8.12 (since 2.8.12-rc4) ------------------------------------------ Brad King (4): diff --git a/Modules/FindCUDA.cmake b/Modules/FindCUDA.cmake index 8270ad4d6..2705d3271 100644 --- a/Modules/FindCUDA.cmake +++ b/Modules/FindCUDA.cmake @@ -263,6 +263,12 @@ # Only available for CUDA version 3.2+. # CUDA_npp_LIBRARY -- NVIDIA Performance Primitives library. # Only available for CUDA version 4.0+. +# CUDA_nppc_LIBRARY -- NVIDIA Performance Primitives library (core). +# Only available for CUDA version 5.5+. +# CUDA_nppi_LIBRARY -- NVIDIA Performance Primitives library (image processing). +# Only available for CUDA version 5.5+. +# CUDA_npps_LIBRARY -- NVIDIA Performance Primitives library (signal processing). +# Only available for CUDA version 5.5+. # CUDA_nvcuvenc_LIBRARY -- CUDA Video Encoder library. # Only available for CUDA version 3.2+. # Windows only. @@ -496,6 +502,9 @@ if(NOT "${CUDA_TOOLKIT_ROOT_DIR}" STREQUAL "${CUDA_TOOLKIT_ROOT_DIR_INTERNAL}") unset(CUDA_curand_LIBRARY CACHE) unset(CUDA_cusparse_LIBRARY CACHE) unset(CUDA_npp_LIBRARY CACHE) + unset(CUDA_nppc_LIBRARY CACHE) + unset(CUDA_nppi_LIBRARY CACHE) + unset(CUDA_npps_LIBRARY CACHE) unset(CUDA_nvcuvenc_LIBRARY CACHE) unset(CUDA_nvcuvid_LIBRARY CACHE) endif() @@ -700,7 +709,13 @@ if(NOT CUDA_VERSION VERSION_LESS "3.2") find_cuda_helper_libs(nvcuvid) endif() endif() -if(NOT CUDA_VERSION VERSION_LESS "4.0") +if(CUDA_VERSION VERSION_GREATER "5.0") + # In CUDA 5.5 NPP was splitted onto 3 separate libraries. + find_cuda_helper_libs(nppc) + find_cuda_helper_libs(nppi) + find_cuda_helper_libs(npps) + set(CUDA_npp_LIBRARY "${CUDA_nppc_LIBRARY};${CUDA_nppi_LIBRARY};${CUDA_npps_LIBRARY}") +elseif(NOT CUDA_VERSION VERSION_LESS "4.0") find_cuda_helper_libs(npp) endif() diff --git a/Modules/Platform/Windows-MSVC-C.cmake b/Modules/Platform/Windows-MSVC-C.cmake index e81df9f83..cbe1586e1 100644 --- a/Modules/Platform/Windows-MSVC-C.cmake +++ b/Modules/Platform/Windows-MSVC-C.cmake @@ -1,2 +1,5 @@ include(Platform/Windows-MSVC) +if(NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 18.0) + set(_FS_C " /FS") +endif() __windows_compiler_msvc(C) diff --git a/Modules/Platform/Windows-MSVC-CXX.cmake b/Modules/Platform/Windows-MSVC-CXX.cmake index fdd1dae05..0e8500532 100644 --- a/Modules/Platform/Windows-MSVC-CXX.cmake +++ b/Modules/Platform/Windows-MSVC-CXX.cmake @@ -1,3 +1,6 @@ include(Platform/Windows-MSVC) set(_COMPILE_CXX " /TP") +if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 18.0) + set(_FS_CXX " /FS") +endif() __windows_compiler_msvc(CXX) diff --git a/Modules/Platform/Windows-MSVC.cmake b/Modules/Platform/Windows-MSVC.cmake index 7036ba0bd..6e02e4aca 100644 --- a/Modules/Platform/Windows-MSVC.cmake +++ b/Modules/Platform/Windows-MSVC.cmake @@ -232,7 +232,7 @@ macro(__windows_compiler_msvc lang) set(CMAKE_${lang}_CREATE_STATIC_LIBRARY " /lib ${CMAKE_CL_NOLOGO} /out: ") set(CMAKE_${lang}_COMPILE_OBJECT - " ${CMAKE_START_TEMP_FILE} ${CMAKE_CL_NOLOGO}${_COMPILE_${lang}} /Fo /Fd/ -c ${CMAKE_END_TEMP_FILE}") + " ${CMAKE_START_TEMP_FILE} ${CMAKE_CL_NOLOGO}${_COMPILE_${lang}} /Fo /Fd/${_FS_${lang}} -c ${CMAKE_END_TEMP_FILE}") set(CMAKE_${lang}_CREATE_PREPROCESSED_SOURCE " > ${CMAKE_START_TEMP_FILE} ${CMAKE_CL_NOLOGO}${_COMPILE_${lang}} -E ${CMAKE_END_TEMP_FILE}") set(CMAKE_${lang}_CREATE_ASSEMBLY_SOURCE diff --git a/Source/CMakeVersion.cmake b/Source/CMakeVersion.cmake index 63751fb89..50273701c 100644 --- a/Source/CMakeVersion.cmake +++ b/Source/CMakeVersion.cmake @@ -2,5 +2,5 @@ set(CMake_VERSION_MAJOR 2) set(CMake_VERSION_MINOR 8) set(CMake_VERSION_PATCH 12) -set(CMake_VERSION_TWEAK 0) +set(CMake_VERSION_TWEAK 1) #set(CMake_VERSION_RC 0) diff --git a/Source/cmExportFileGenerator.cxx b/Source/cmExportFileGenerator.cxx index ef336ea47..14be5cd47 100644 --- a/Source/cmExportFileGenerator.cxx +++ b/Source/cmExportFileGenerator.cxx @@ -185,6 +185,10 @@ bool cmExportFileGenerator::PopulateInterfaceLinkLibrariesProperty( ImportPropertyMap &properties, std::vector &missingTargets) { + if(!target->IsLinkable()) + { + return false; + } const char *input = target->GetProperty("INTERFACE_LINK_LIBRARIES"); if (input) { @@ -631,6 +635,7 @@ cmExportFileGenerator if (iface->ImplementationIsInterface) { + // Policy CMP0022 must not be NEW. this->SetImportLinkProperty(suffix, target, "IMPORTED_LINK_INTERFACE_LIBRARIES", iface->Libraries, properties, missingTargets); diff --git a/Source/cmGeneratorExpressionEvaluator.cxx b/Source/cmGeneratorExpressionEvaluator.cxx index abe4e7021..8b3135412 100644 --- a/Source/cmGeneratorExpressionEvaluator.cxx +++ b/Source/cmGeneratorExpressionEvaluator.cxx @@ -1277,7 +1277,7 @@ struct TargetFilesystemArtifact : public cmGeneratorExpressionNode "No target \"" + name + "\""); return std::string(); } - if(target->GetType() >= cmTarget::UTILITY && + if(target->GetType() >= cmTarget::OBJECT_LIBRARY && target->GetType() != cmTarget::UNKNOWN_LIBRARY) { ::reportError(context, content->GetOriginalExpression(), diff --git a/Source/cmGlobalGenerator.cxx b/Source/cmGlobalGenerator.cxx index 7f2b592f3..f297c4abb 100644 --- a/Source/cmGlobalGenerator.cxx +++ b/Source/cmGlobalGenerator.cxx @@ -848,6 +848,14 @@ void cmGlobalGenerator::Configure() delete this->LocalGenerators[i]; } this->LocalGenerators.clear(); + for(std::vector::const_iterator + li = this->EvaluationFiles.begin(); + li != this->EvaluationFiles.end(); + ++li) + { + delete *li; + } + this->EvaluationFiles.clear(); this->TargetDependencies.clear(); this->TotalTargets.clear(); this->ImportedTargets.clear(); @@ -956,6 +964,8 @@ void cmGlobalGenerator::Generate() return; } + this->FinalizeTargetCompileDefinitions(); + // Iterate through all targets and set up automoc for those which have // the AUTOMOC property set this->CreateAutomocTargets(); @@ -1088,6 +1098,7 @@ bool cmGlobalGenerator::CheckTargets() target.GetType() == cmTarget::STATIC_LIBRARY || target.GetType() == cmTarget::SHARED_LIBRARY || target.GetType() == cmTarget::MODULE_LIBRARY || + target.GetType() == cmTarget::OBJECT_LIBRARY || target.GetType() == cmTarget::UTILITY) { if(!target.FindSourceFiles()) @@ -1140,13 +1151,11 @@ void cmGlobalGenerator::CreateAutomocTargets() } //---------------------------------------------------------------------------- -void cmGlobalGenerator::CreateGeneratorTargets() +void cmGlobalGenerator::FinalizeTargetCompileDefinitions() { // Construct per-target generator information. for(unsigned int i=0; i < this->LocalGenerators.size(); ++i) { - cmGeneratorTargetsType generatorTargets; - cmMakefile *mf = this->LocalGenerators[i]->GetMakefile(); const std::vector noconfig_compile_definitions = @@ -1161,7 +1170,6 @@ void cmGlobalGenerator::CreateGeneratorTargets() { cmTarget* t = &ti->second; - { for (std::vector::const_iterator it = noconfig_compile_definitions.begin(); it != noconfig_compile_definitions.end(); ++it) @@ -1178,7 +1186,24 @@ void cmGlobalGenerator::CreateGeneratorTargets() mf->GetProperty(defPropName.c_str())); } } + } +} +//---------------------------------------------------------------------------- +void cmGlobalGenerator::CreateGeneratorTargets() +{ + // Construct per-target generator information. + for(unsigned int i=0; i < this->LocalGenerators.size(); ++i) + { + cmGeneratorTargetsType generatorTargets; + + cmMakefile *mf = this->LocalGenerators[i]->GetMakefile(); + + cmTargets& targets = mf->GetTargets(); + for(cmTargets::iterator ti = targets.begin(); + ti != targets.end(); ++ti) + { + cmTarget* t = &ti->second; cmGeneratorTarget* gt = new cmGeneratorTarget(t); this->GeneratorTargets[t] = gt; this->ComputeTargetObjects(gt); diff --git a/Source/cmGlobalGenerator.h b/Source/cmGlobalGenerator.h index 18aba24bf..80916ae59 100644 --- a/Source/cmGlobalGenerator.h +++ b/Source/cmGlobalGenerator.h @@ -382,6 +382,7 @@ private: void WriteSummary(); void WriteSummary(cmTarget* target); + void FinalizeTargetCompileDefinitions(); cmExternalMakefileProjectGenerator* ExtraGenerator; diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index ac655da12..4ba6c1981 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -83,10 +83,12 @@ class cmTargetInternals public: cmTargetInternals() { + this->PolicyWarnedCMP0022 = false; this->SourceFileFlagsConstructed = false; } cmTargetInternals(cmTargetInternals const& r) { + this->PolicyWarnedCMP0022 = false; this->SourceFileFlagsConstructed = false; // Only some of these entries are part of the object state. // Others not copied here are result caches. @@ -109,6 +111,7 @@ public: typedef std::map LinkInterfaceMapType; LinkInterfaceMapType LinkInterfaceMap; + bool PolicyWarnedCMP0022; typedef std::map OutputInfoMapType; OutputInfoMapType OutputInfoMap; @@ -833,7 +836,7 @@ void cmTarget::DefineProperties(cmake *cm) "CMAKE_LINK_INTERFACE_LIBRARIES if it is set when a target is " "created. " "This property is ignored for STATIC libraries.\n" - "This property is overriden by the INTERFACE_LINK_LIBRARIES property if " + "This property is overridden by the INTERFACE_LINK_LIBRARIES property if " "policy CMP0022 is NEW.\n" "This property is deprecated. Use INTERFACE_LINK_LIBRARIES instead."); @@ -844,18 +847,18 @@ void cmTarget::DefineProperties(cmake *cm) "LINK_INTERFACE_LIBRARIES. " "If set, this property completely overrides the generic property " "for the named configuration.\n" - "This property is overriden by the INTERFACE_LINK_LIBRARIES property if " + "This property is overridden by the INTERFACE_LINK_LIBRARIES property if " "policy CMP0022 is NEW.\n" "This property is deprecated. Use INTERFACE_LINK_LIBRARIES instead."); cm->DefineProperty ("INTERFACE_LINK_LIBRARIES", cmProperty::TARGET, - "List public interface libraries for a shared library or executable.", + "List public interface libraries for a library.", "This property contains the list of transitive link dependencies. " "When the target is linked into another target the libraries " "listed (and recursively their link interface libraries) will be " "provided to the other target also. " - "This property is overriden by the LINK_INTERFACE_LIBRARIES or " + "This property is overridden by the LINK_INTERFACE_LIBRARIES or " "LINK_INTERFACE_LIBRARIES_ property if " "policy CMP0022 is OLD or unset.\n" "\n" @@ -2331,16 +2334,10 @@ void cmTarget::MergeLinkLibraries( cmMakefile& mf, i += this->PrevLinkedLibraries.size(); for( ; i != libs.end(); ++i ) { - // We call this so that the dependencies get written to the cache + // This is equivalent to the target_link_libraries plain signature. this->AddLinkLibrary( mf, selfname, i->first.c_str(), i->second ); - - if (this->GetType() == cmTarget::STATIC_LIBRARY) - { - this->AppendProperty("INTERFACE_LINK_LIBRARIES", - ("$GetDebugGeneratorExpressions(i->first.c_str(), i->second) + - ">").c_str()); - } + this->AppendProperty("INTERFACE_LINK_LIBRARIES", + this->GetDebugGeneratorExpressions(i->first.c_str(), i->second).c_str()); } this->PrevLinkedLibraries = libs; } @@ -6412,12 +6409,20 @@ bool cmTarget::ComputeLinkInterface(const char* config, LinkInterface& iface, // An explicit list of interface libraries may be set for shared // libraries and executables that export symbols. const char* explicitLibraries = 0; - const char* newExplicitLibraries = - this->GetProperty("INTERFACE_LINK_LIBRARIES"); std::string linkIfaceProp; - if(this->GetType() == cmTarget::SHARED_LIBRARY || - this->IsExecutableWithExports()) + if(this->PolicyStatusCMP0022 != cmPolicies::OLD && + this->PolicyStatusCMP0022 != cmPolicies::WARN) + { + // CMP0022 NEW behavior is to use INTERFACE_LINK_LIBRARIES. + linkIfaceProp = "INTERFACE_LINK_LIBRARIES"; + explicitLibraries = this->GetProperty(linkIfaceProp.c_str()); + } + else if(this->GetType() == cmTarget::SHARED_LIBRARY || + this->IsExecutableWithExports()) { + // CMP0022 OLD behavior is to use LINK_INTERFACE_LIBRARIES if set on a + // shared lib or executable. + // Lookup the per-configuration property. linkIfaceProp = "LINK_INTERFACE_LIBRARIES"; linkIfaceProp += suffix; @@ -6429,95 +6434,32 @@ bool cmTarget::ComputeLinkInterface(const char* config, LinkInterface& iface, linkIfaceProp = "LINK_INTERFACE_LIBRARIES"; explicitLibraries = this->GetProperty(linkIfaceProp.c_str()); } - if (newExplicitLibraries - && (!explicitLibraries || - (explicitLibraries - && strcmp(newExplicitLibraries, explicitLibraries) != 0))) - { - switch(this->GetPolicyStatusCMP0022()) - { - case cmPolicies::WARN: - { - cmOStringStream w; - w << (this->Makefile->GetPolicies() - ->GetPolicyWarning(cmPolicies::CMP0022)) << "\n" - << "Target \"" << this->GetName() << "\" has a " - "INTERFACE_LINK_LIBRARIES property which differs from its " - << linkIfaceProp << " properties." - "\n" - "INTERFACE_LINK_LIBRARIES:\n " - << newExplicitLibraries - << "\n" - << linkIfaceProp << ":\n " - << (explicitLibraries ? explicitLibraries : "(empty)") << "\n"; - this->Makefile->IssueMessage(cmake::AUTHOR_WARNING, w.str()); - } - // Fall through - case cmPolicies::OLD: - break; - case cmPolicies::REQUIRED_IF_USED: - case cmPolicies::REQUIRED_ALWAYS: - case cmPolicies::NEW: - explicitLibraries = newExplicitLibraries; - linkIfaceProp = "INTERFACE_LINK_LIBRARIES"; - break; - } - } } - else if(this->GetType() == cmTarget::STATIC_LIBRARY) + + if(explicitLibraries && this->PolicyStatusCMP0022 == cmPolicies::WARN && + !this->Internal->PolicyWarnedCMP0022) { - if (newExplicitLibraries) + // Compare the explicitly set old link interface properties to the + // preferred new link interface property one and warn if different. + const char* newExplicitLibraries = + this->GetProperty("INTERFACE_LINK_LIBRARIES"); + if (newExplicitLibraries + && strcmp(newExplicitLibraries, explicitLibraries) != 0) { - cmListFileBacktrace lfbt; - cmGeneratorExpression ge(lfbt); - cmGeneratorExpressionDAGChecker dagChecker(lfbt, this->GetName(), - "INTERFACE_LINK_LIBRARIES", 0, 0); - std::vector ifaceLibs; - cmSystemTools::ExpandListArgument( - ge.Parse(newExplicitLibraries)->Evaluate( - this->Makefile, - config, - false, - headTarget, - this, &dagChecker), ifaceLibs); - LinkImplementation const* impl = this->GetLinkImplementation(config, - headTarget); - if (ifaceLibs != impl->Libraries) - { - switch(this->GetPolicyStatusCMP0022()) - { - case cmPolicies::WARN: - { - cmOStringStream w; - w << (this->Makefile->GetPolicies() - ->GetPolicyWarning(cmPolicies::CMP0022)) << "\n" - << "Static library target \"" << this->GetName() << "\" has a " - "INTERFACE_LINK_LIBRARIES property. This should be preferred " - "as the source of the link interface for this library. " - "Ignoring the property and using the link implementation " - "as the link interface instead."; - this->Makefile->IssueMessage(cmake::AUTHOR_WARNING, w.str()); - } - // Fall through - case cmPolicies::OLD: - break; - case cmPolicies::REQUIRED_IF_USED: - case cmPolicies::REQUIRED_ALWAYS: - case cmPolicies::NEW: - explicitLibraries = newExplicitLibraries; - linkIfaceProp = "INTERFACE_LINK_LIBRARIES"; - break; - } - } - else - { - iface.Libraries = impl->Libraries; - if(this->LinkLanguagePropagatesToDependents()) - { - // Targets using this archive need its language runtime libraries. - iface.Languages = impl->Languages; - } - } + cmOStringStream w; + w << + (this->Makefile->GetPolicies() + ->GetPolicyWarning(cmPolicies::CMP0022)) << "\n" + "Target \"" << this->GetName() << "\" has an " + "INTERFACE_LINK_LIBRARIES property which differs from its " << + linkIfaceProp << " properties." + "\n" + "INTERFACE_LINK_LIBRARIES:\n" + " " << newExplicitLibraries << "\n" << + linkIfaceProp << ":\n" + " " << (explicitLibraries ? explicitLibraries : "(empty)") << "\n"; + this->Makefile->IssueMessage(cmake::AUTHOR_WARNING, w.str()); + this->Internal->PolicyWarnedCMP0022 = true; } } @@ -6588,11 +6530,12 @@ bool cmTarget::ComputeLinkInterface(const char* config, LinkInterface& iface, } } } - else if (this->GetPolicyStatusCMP0022() == cmPolicies::WARN - || this->GetPolicyStatusCMP0022() == cmPolicies::OLD) - // The implementation shouldn't be the interface if CMP0022 is NEW. That - // way, the LINK_LIBRARIES property can be set directly without having to - // empty the INTERFACE_LINK_LIBRARIES + else if (this->PolicyStatusCMP0022 == cmPolicies::WARN + || this->PolicyStatusCMP0022 == cmPolicies::OLD) + // If CMP0022 is NEW then the plain tll signature sets the + // INTERFACE_LINK_LIBRARIES, so if we get here then the project + // cleared the property explicitly and we should not fall back + // to the link implementation. { // The link implementation is the default link interface. LinkImplementation const* impl = this->GetLinkImplementation(config, @@ -6605,6 +6548,70 @@ bool cmTarget::ComputeLinkInterface(const char* config, LinkInterface& iface, // Targets using this archive need its language runtime libraries. iface.Languages = impl->Languages; } + + if(this->PolicyStatusCMP0022 == cmPolicies::WARN && + !this->Internal->PolicyWarnedCMP0022) + { + // Compare the link implementation fallback link interface to the + // preferred new link interface property and warn if different. + cmListFileBacktrace lfbt; + cmGeneratorExpression ge(lfbt); + cmGeneratorExpressionDAGChecker dagChecker(lfbt, this->GetName(), + "INTERFACE_LINK_LIBRARIES", 0, 0); + std::vector ifaceLibs; + const char* newExplicitLibraries = + this->GetProperty("INTERFACE_LINK_LIBRARIES"); + cmSystemTools::ExpandListArgument( + ge.Parse(newExplicitLibraries)->Evaluate(this->Makefile, + config, + false, + headTarget, + this, &dagChecker), + ifaceLibs); + if (ifaceLibs != impl->Libraries) + { + std::string oldLibraries; + std::string newLibraries; + const char *sep = ""; + for(std::vector::const_iterator it + = impl->Libraries.begin(); it != impl->Libraries.end(); ++it) + { + oldLibraries += sep; + oldLibraries += *it; + sep = ";"; + } + sep = ""; + for(std::vector::const_iterator it + = ifaceLibs.begin(); it != ifaceLibs.end(); ++it) + { + newLibraries += sep; + newLibraries += *it; + sep = ";"; + } + if(oldLibraries.empty()) + { oldLibraries = "(empty)"; } + if(newLibraries.empty()) + { newLibraries = "(empty)"; } + + cmOStringStream w; + w << + (this->Makefile->GetPolicies() + ->GetPolicyWarning(cmPolicies::CMP0022)) << "\n" + "Target \"" << this->GetName() << "\" has an " + "INTERFACE_LINK_LIBRARIES property. " + "This should be preferred as the source of the link interface " + "for this library but because CMP0022 is not set CMake is " + "ignoring the property and using the link implementation " + "as the link interface instead." + "\n" + "INTERFACE_LINK_LIBRARIES:\n" + " " << newLibraries << "\n" + "Link implementation:\n" + " " << oldLibraries << "\n"; + this->Makefile->IssueMessage(cmake::AUTHOR_WARNING, w.str()); + this->Internal->PolicyWarnedCMP0022 = true; + } + } } if(this->GetType() == cmTarget::STATIC_LIBRARY) diff --git a/Source/cmTargetLinkLibrariesCommand.cxx b/Source/cmTargetLinkLibrariesCommand.cxx index 863b3917e..c2f46a1b1 100644 --- a/Source/cmTargetLinkLibrariesCommand.cxx +++ b/Source/cmTargetLinkLibrariesCommand.cxx @@ -379,15 +379,26 @@ cmTargetLinkLibrariesCommand::HandleLibrary(const char* lib, { this->Makefile ->AddLinkLibraryForTarget(this->Target->GetName(), lib, llt); - if (this->CurrentProcessingState != ProcessingKeywordPublicInterface - && this->CurrentProcessingState != ProcessingPlainPublicInterface) + if(this->CurrentProcessingState == ProcessingLinkLibraries) + { + this->Target->AppendProperty("INTERFACE_LINK_LIBRARIES", + this->Target->GetDebugGeneratorExpressions(lib, llt).c_str()); + return true; + } + else if(this->CurrentProcessingState != ProcessingKeywordPublicInterface + && this->CurrentProcessingState != ProcessingPlainPublicInterface) { if (this->Target->GetType() == cmTarget::STATIC_LIBRARY) { + std::string configLib = this->Target + ->GetDebugGeneratorExpressions(lib, llt); + if (cmGeneratorExpression::IsValidTargetName(lib) + || cmGeneratorExpression::Find(lib) != std::string::npos) + { + configLib = "$"; + } this->Target->AppendProperty("INTERFACE_LINK_LIBRARIES", - ("$Target->GetDebugGeneratorExpressions(lib, llt) + - ">").c_str()); + configLib.c_str()); } // Not a 'public' or 'interface' library. Do not add to interface // property. diff --git a/Source/cmTargetLinkLibrariesCommand.h b/Source/cmTargetLinkLibrariesCommand.h index f2b25433c..2cf6b03ef 100644 --- a/Source/cmTargetLinkLibrariesCommand.h +++ b/Source/cmTargetLinkLibrariesCommand.h @@ -88,14 +88,19 @@ public: "See the IMPORTED mode of the add_library command for more " "information. " "\n" - "Library dependencies are transitive by default. " + "Library dependencies are transitive by default with this signature. " "When this target is linked into another target then the libraries " "linked to this target will appear on the link line for the other " "target too. " - "See the INTERFACE_LINK_LIBRARIES target property to override the " - "set of transitive link dependencies for a target. " + "This transitive \"link interface\" is stored in the " + "INTERFACE_LINK_LIBRARIES target property when policy CMP0022 is set " + "to NEW and may be overridden by setting the property directly. " + "(" + "When CMP0022 is not set to NEW, transitive linking is builtin " + "but may be overridden by the LINK_INTERFACE_LIBRARIES property. " "Calls to other signatures of this command may set the property " "making any libraries linked exclusively by this signature private." + ")" "\n" "CMake will also propagate \"usage requirements\" from linked library " "targets. " diff --git a/Source/cmake.cxx b/Source/cmake.cxx index 290aff05c..14ddc1b01 100644 --- a/Source/cmake.cxx +++ b/Source/cmake.cxx @@ -1734,7 +1734,7 @@ int cmake::ExecuteCMakeCommand(std::vector& args) { return cmake::ExecuteEchoColor(args); } - else if (args[1] == "cmake_automoc") + else if (args[1] == "cmake_automoc" && args.size() >= 4) { cmQtAutomoc automoc; const char *config = args[3].empty() ? 0 : args[3].c_str(); diff --git a/Tests/CMakeCommands/target_link_libraries/cmp0022/CMakeLists.txt b/Tests/CMakeCommands/target_link_libraries/cmp0022/CMakeLists.txt index 07d7c4392..818b8c99c 100644 --- a/Tests/CMakeCommands/target_link_libraries/cmp0022/CMakeLists.txt +++ b/Tests/CMakeCommands/target_link_libraries/cmp0022/CMakeLists.txt @@ -22,6 +22,16 @@ generate_export_header(staticlib1) add_library(staticlib2 STATIC staticlib2.cpp) generate_export_header(staticlib2) target_link_libraries(staticlib1 LINK_PUBLIC staticlib2) +if (CMAKE_CXX_COMPILER_ID MATCHES GNU OR CMAKE_CXX_COMPILER_ID MATCHES Clang) + target_link_libraries(staticlib1 LINK_PRIVATE "-Wl,-v") +endif() add_executable(staticlib_exe staticlib_exe.cpp) target_link_libraries(staticlib_exe staticlib1) + +add_library(onlyplainlib1 SHARED onlyplainlib1.cpp) +add_library(onlyplainlib2 SHARED onlyplainlib2.cpp) +target_link_libraries(onlyplainlib2 onlyplainlib1) + +add_executable(onlyplainlib_user onlyplainlib_user.cpp) +target_link_libraries(onlyplainlib_user onlyplainlib2) diff --git a/Tests/CMakeCommands/target_link_libraries/cmp0022/onlyplainlib1.cpp b/Tests/CMakeCommands/target_link_libraries/cmp0022/onlyplainlib1.cpp new file mode 100644 index 000000000..41dc3ce18 --- /dev/null +++ b/Tests/CMakeCommands/target_link_libraries/cmp0022/onlyplainlib1.cpp @@ -0,0 +1,13 @@ + +#include "onlyplainlib1.h" + +OnlyPlainLib1::OnlyPlainLib1() + : result(0) +{ + +} + +int OnlyPlainLib1::GetResult() +{ + return result; +} diff --git a/Tests/CMakeCommands/target_link_libraries/cmp0022/onlyplainlib1.h b/Tests/CMakeCommands/target_link_libraries/cmp0022/onlyplainlib1.h new file mode 100644 index 000000000..c0373ceb3 --- /dev/null +++ b/Tests/CMakeCommands/target_link_libraries/cmp0022/onlyplainlib1.h @@ -0,0 +1,14 @@ + +struct +#ifdef _WIN32 +__declspec(dllexport) +#endif +OnlyPlainLib1 +{ + OnlyPlainLib1(); + + int GetResult(); + +private: + int result; +}; diff --git a/Tests/CMakeCommands/target_link_libraries/cmp0022/onlyplainlib2.cpp b/Tests/CMakeCommands/target_link_libraries/cmp0022/onlyplainlib2.cpp new file mode 100644 index 000000000..2865ae91a --- /dev/null +++ b/Tests/CMakeCommands/target_link_libraries/cmp0022/onlyplainlib2.cpp @@ -0,0 +1,8 @@ + +#include "onlyplainlib2.h" + +OnlyPlainLib1 onlyPlainLib2() +{ + OnlyPlainLib1 opl1; + return opl1; +} diff --git a/Tests/CMakeCommands/target_link_libraries/cmp0022/onlyplainlib2.h b/Tests/CMakeCommands/target_link_libraries/cmp0022/onlyplainlib2.h new file mode 100644 index 000000000..74b18a00e --- /dev/null +++ b/Tests/CMakeCommands/target_link_libraries/cmp0022/onlyplainlib2.h @@ -0,0 +1,7 @@ + +#include "onlyplainlib1.h" + +#ifdef _WIN32 +__declspec(dllexport) +#endif +OnlyPlainLib1 onlyPlainLib2(); diff --git a/Tests/CMakeCommands/target_link_libraries/cmp0022/onlyplainlib_user.cpp b/Tests/CMakeCommands/target_link_libraries/cmp0022/onlyplainlib_user.cpp new file mode 100644 index 000000000..0fb7b0a67 --- /dev/null +++ b/Tests/CMakeCommands/target_link_libraries/cmp0022/onlyplainlib_user.cpp @@ -0,0 +1,7 @@ + +#include "onlyplainlib2.h" + +int main(int argc, char **argv) +{ + return onlyPlainLib2().GetResult(); +} diff --git a/Tests/QtAutomoc/foo.h b/Tests/QtAutomoc/foo.h index 32d4c8d8f..f23ec0739 100644 --- a/Tests/QtAutomoc/foo.h +++ b/Tests/QtAutomoc/foo.h @@ -16,7 +16,10 @@ #include -class Foo : public QObject +class Foo +#ifdef FOO + : public QObject +#endif { Q_OBJECT public: diff --git a/Tests/RunCMake/CMP0022/CMP0022-NOWARN-exe-stderr.txt b/Tests/RunCMake/CMP0022/CMP0022-NOWARN-exe-stderr.txt new file mode 100644 index 000000000..10f32932e --- /dev/null +++ b/Tests/RunCMake/CMP0022/CMP0022-NOWARN-exe-stderr.txt @@ -0,0 +1 @@ +^$ diff --git a/Tests/RunCMake/CMP0022/CMP0022-NOWARN-exe.cmake b/Tests/RunCMake/CMP0022/CMP0022-NOWARN-exe.cmake new file mode 100644 index 000000000..b0268c842 --- /dev/null +++ b/Tests/RunCMake/CMP0022/CMP0022-NOWARN-exe.cmake @@ -0,0 +1,7 @@ +enable_language(CXX) + +add_library(testLib empty_vs6_1.cpp) +add_executable(testExe empty_vs6_2.cpp) +target_link_libraries(testExe testLib) + +export(TARGETS testExe FILE "${CMAKE_CURRENT_BINARY_DIR}/cmp0022NOWARN-exe.cmake") diff --git a/Tests/RunCMake/CMP0022/CMP0022-NOWARN-shared-stderr.txt b/Tests/RunCMake/CMP0022/CMP0022-NOWARN-shared-stderr.txt new file mode 100644 index 000000000..10f32932e --- /dev/null +++ b/Tests/RunCMake/CMP0022/CMP0022-NOWARN-shared-stderr.txt @@ -0,0 +1 @@ +^$ diff --git a/Tests/RunCMake/CMP0022/CMP0022-NOWARN-shared.cmake b/Tests/RunCMake/CMP0022/CMP0022-NOWARN-shared.cmake new file mode 100644 index 000000000..57c3ed0d7 --- /dev/null +++ b/Tests/RunCMake/CMP0022/CMP0022-NOWARN-shared.cmake @@ -0,0 +1,8 @@ +enable_language(CXX) + +add_library(foo SHARED empty_vs6_1.cpp) +add_library(bar SHARED empty_vs6_2.cpp) +target_link_libraries(bar foo) + +add_executable(zot empty.cpp) +target_link_libraries(zot bar) diff --git a/Tests/RunCMake/CMP0022/CMP0022-NOWARN-static.cmake b/Tests/RunCMake/CMP0022/CMP0022-NOWARN-static.cmake index 3e4144fcd..ad3b8df74 100644 --- a/Tests/RunCMake/CMP0022/CMP0022-NOWARN-static.cmake +++ b/Tests/RunCMake/CMP0022/CMP0022-NOWARN-static.cmake @@ -5,4 +5,8 @@ add_library(foo STATIC empty_vs6_1.cpp) add_library(bar STATIC empty_vs6_2.cpp) add_library(bat STATIC empty_vs6_3.cpp) target_link_libraries(foo bar) -target_link_libraries(bar bat) +# The last element here needs to contain a space so that it is a single +# element which is not a valid target name. As bar is a STATIC library, +# this tests that the LINK_ONLY generator expression is not used for +# that element, creating an error. +target_link_libraries(bar bat "-lz -lm") diff --git a/Tests/RunCMake/CMP0022/CMP0022-WARN-empty-old-result.txt b/Tests/RunCMake/CMP0022/CMP0022-WARN-empty-old-result.txt new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/Tests/RunCMake/CMP0022/CMP0022-WARN-empty-old-result.txt @@ -0,0 +1 @@ +0 diff --git a/Tests/RunCMake/CMP0022/CMP0022-WARN-empty-old-stderr.txt b/Tests/RunCMake/CMP0022/CMP0022-WARN-empty-old-stderr.txt new file mode 100644 index 000000000..6a6a0c782 --- /dev/null +++ b/Tests/RunCMake/CMP0022/CMP0022-WARN-empty-old-stderr.txt @@ -0,0 +1,19 @@ +CMake Warning \(dev\) in CMakeLists.txt: + Policy CMP0022 is not set: INTERFACE_LINK_LIBRARIES defines the link + interface. Run "cmake --help-policy CMP0022" for policy details. Use the + cmake_policy command to set the policy and suppress this warning. + + Target "bar" has an INTERFACE_LINK_LIBRARIES property. This should be + preferred as the source of the link interface for this library but because + CMP0022 is not set CMake is ignoring the property and using the link + implementation as the link interface instead. + + INTERFACE_LINK_LIBRARIES: + + foo + + Link implementation: + + \(empty\) + +This warning is for project developers. Use -Wno-dev to suppress it. diff --git a/Tests/RunCMake/CMP0022/CMP0022-WARN-empty-old.cmake b/Tests/RunCMake/CMP0022/CMP0022-WARN-empty-old.cmake new file mode 100644 index 000000000..c5d3c29d9 --- /dev/null +++ b/Tests/RunCMake/CMP0022/CMP0022-WARN-empty-old.cmake @@ -0,0 +1,10 @@ + +project(CMP0022-WARN-empty-old) + +add_library(foo SHARED empty_vs6_1.cpp) +add_library(bar SHARED empty_vs6_2.cpp) + +set_property(TARGET bar PROPERTY INTERFACE_LINK_LIBRARIES foo) + +add_library(user empty.cpp) +target_link_libraries(user bar) diff --git a/Tests/RunCMake/CMP0022/CMP0022-WARN-static-stderr.txt b/Tests/RunCMake/CMP0022/CMP0022-WARN-static-stderr.txt index 41d132cc0..1370c5ebe 100644 --- a/Tests/RunCMake/CMP0022/CMP0022-WARN-static-stderr.txt +++ b/Tests/RunCMake/CMP0022/CMP0022-WARN-static-stderr.txt @@ -3,8 +3,17 @@ CMake Warning \(dev\) in CMakeLists.txt: interface. Run "cmake --help-policy CMP0022" for policy details. Use the cmake_policy command to set the policy and suppress this warning. - Static library target "bar" has a INTERFACE_LINK_LIBRARIES property. This - should be preferred as the source of the link interface for this library. - Ignoring the property and using the link implementation as the link - interface instead. + Target "bar" has an INTERFACE_LINK_LIBRARIES property. This should be + preferred as the source of the link interface for this library but because + CMP0022 is not set CMake is ignoring the property and using the link + implementation as the link interface instead. + + INTERFACE_LINK_LIBRARIES: + + foo + + Link implementation: + + bat + This warning is for project developers. Use -Wno-dev to suppress it.$ diff --git a/Tests/RunCMake/CMP0022/CMP0022-WARN-stderr.txt b/Tests/RunCMake/CMP0022/CMP0022-WARN-stderr.txt index 93c0ab327..2f7dfbfb7 100644 --- a/Tests/RunCMake/CMP0022/CMP0022-WARN-stderr.txt +++ b/Tests/RunCMake/CMP0022/CMP0022-WARN-stderr.txt @@ -1,10 +1,10 @@ -CMake Warning \(dev\) in CMakeLists.txt: +^CMake Warning \(dev\) in CMakeLists.txt: Policy CMP0022 is not set: INTERFACE_LINK_LIBRARIES defines the link interface. Run "cmake --help-policy CMP0022" for policy details. Use the cmake_policy command to set the policy and suppress this warning. - Target "bar" has a INTERFACE_LINK_LIBRARIES property which differs from its - LINK_INTERFACE_LIBRARIES properties. + Target "bar" has an INTERFACE_LINK_LIBRARIES property which differs from + its LINK_INTERFACE_LIBRARIES properties. INTERFACE_LINK_LIBRARIES: diff --git a/Tests/RunCMake/CMP0022/CMP0022-WARN-tll-stderr.txt b/Tests/RunCMake/CMP0022/CMP0022-WARN-tll-stderr.txt index 6370b2475..f6722853a 100644 --- a/Tests/RunCMake/CMP0022/CMP0022-WARN-tll-stderr.txt +++ b/Tests/RunCMake/CMP0022/CMP0022-WARN-tll-stderr.txt @@ -3,8 +3,8 @@ CMake Warning \(dev\) in CMakeLists.txt: interface. Run "cmake --help-policy CMP0022" for policy details. Use the cmake_policy command to set the policy and suppress this warning. - Target "bar" has a INTERFACE_LINK_LIBRARIES property which differs from its - LINK_INTERFACE_LIBRARIES properties. + Target "bar" has an INTERFACE_LINK_LIBRARIES property which differs from + its LINK_INTERFACE_LIBRARIES properties. INTERFACE_LINK_LIBRARIES: diff --git a/Tests/RunCMake/CMP0022/CMP0022-WARN.cmake b/Tests/RunCMake/CMP0022/CMP0022-WARN.cmake index 24b7f4576..fe7e858b7 100644 --- a/Tests/RunCMake/CMP0022/CMP0022-WARN.cmake +++ b/Tests/RunCMake/CMP0022/CMP0022-WARN.cmake @@ -9,3 +9,8 @@ set_property(TARGET bar PROPERTY LINK_INTERFACE_LIBRARIES bat) add_library(user empty.cpp) target_link_libraries(user bar) + +# Use "bar" again with a different "head" target to check +# that the warning does not appear again. +add_library(user2 empty_vs6_3.cpp) +target_link_libraries(user2 bar) diff --git a/Tests/RunCMake/CMP0022/CMP0022-export-exe-stderr.txt b/Tests/RunCMake/CMP0022/CMP0022-export-exe-stderr.txt new file mode 100644 index 000000000..10f32932e --- /dev/null +++ b/Tests/RunCMake/CMP0022/CMP0022-export-exe-stderr.txt @@ -0,0 +1 @@ +^$ diff --git a/Tests/RunCMake/CMP0022/CMP0022-export-exe.cmake b/Tests/RunCMake/CMP0022/CMP0022-export-exe.cmake new file mode 100644 index 000000000..d832faceb --- /dev/null +++ b/Tests/RunCMake/CMP0022/CMP0022-export-exe.cmake @@ -0,0 +1,9 @@ +enable_language(CXX) + +cmake_policy(SET CMP0022 NEW) + +add_library(testLib empty_vs6_1.cpp) +add_executable(testExe empty_vs6_2.cpp) +target_link_libraries(testExe testLib) + +export(TARGETS testExe FILE "${CMAKE_CURRENT_BINARY_DIR}/cmp0022NEW-exe.cmake") diff --git a/Tests/RunCMake/CMP0022/RunCMakeTest.cmake b/Tests/RunCMake/CMP0022/RunCMakeTest.cmake index dcef0f5b4..2781d2094 100644 --- a/Tests/RunCMake/CMP0022/RunCMakeTest.cmake +++ b/Tests/RunCMake/CMP0022/RunCMakeTest.cmake @@ -3,7 +3,11 @@ include(RunCMake) run_cmake(CMP0022-WARN) run_cmake(CMP0022-WARN-tll) run_cmake(CMP0022-WARN-static) +run_cmake(CMP0022-WARN-empty-old) +run_cmake(CMP0022-NOWARN-exe) +run_cmake(CMP0022-NOWARN-shared) run_cmake(CMP0022-NOWARN-static) run_cmake(CMP0022-NOWARN-static-link_libraries) run_cmake(CMP0022-export) +run_cmake(CMP0022-export-exe) run_cmake(CMP0022-install-export) diff --git a/Tests/RunCMake/CMP0022/empty_vs6_4.cpp b/Tests/RunCMake/CMP0022/empty_vs6_4.cpp new file mode 100644 index 000000000..7efedabfa --- /dev/null +++ b/Tests/RunCMake/CMP0022/empty_vs6_4.cpp @@ -0,0 +1 @@ +#include "empty.cpp" diff --git a/Tests/RunCMake/GeneratorExpression/BadTargetTypeObject-result.txt b/Tests/RunCMake/GeneratorExpression/BadTargetTypeObject-result.txt new file mode 100644 index 000000000..d00491fd7 --- /dev/null +++ b/Tests/RunCMake/GeneratorExpression/BadTargetTypeObject-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/GeneratorExpression/BadTargetTypeObject-stderr.txt b/Tests/RunCMake/GeneratorExpression/BadTargetTypeObject-stderr.txt new file mode 100644 index 000000000..533d38cef --- /dev/null +++ b/Tests/RunCMake/GeneratorExpression/BadTargetTypeObject-stderr.txt @@ -0,0 +1,26 @@ +CMake Error at BadTargetTypeObject.cmake:3 \(add_custom_target\): + Error evaluating generator expression: + + \$ + + Target "objlib" is not an executable or library. +Call Stack \(most recent call first\): + CMakeLists.txt:3 \(include\) ++ +CMake Error at BadTargetTypeObject.cmake:3 \(add_custom_target\): + Error evaluating generator expression: + + \$ + + Target "objlib" is not an executable or library. +Call Stack \(most recent call first\): + CMakeLists.txt:3 \(include\) ++ +CMake Error at BadTargetTypeObject.cmake:3 \(add_custom_target\): + Error evaluating generator expression: + + \$ + + Target "objlib" is not an executable or library. +Call Stack \(most recent call first\): + CMakeLists.txt:3 \(include\) diff --git a/Tests/RunCMake/GeneratorExpression/BadTargetTypeObject.cmake b/Tests/RunCMake/GeneratorExpression/BadTargetTypeObject.cmake new file mode 100644 index 000000000..c47ee2bec --- /dev/null +++ b/Tests/RunCMake/GeneratorExpression/BadTargetTypeObject.cmake @@ -0,0 +1,7 @@ +enable_language(C) +add_library(objlib OBJECT empty.c) +add_custom_target(check ALL COMMAND echo + $ + $ + $ + ) diff --git a/Tests/RunCMake/GeneratorExpression/RunCMakeTest.cmake b/Tests/RunCMake/GeneratorExpression/RunCMakeTest.cmake index 62bf29bc9..54d5064ce 100644 --- a/Tests/RunCMake/GeneratorExpression/RunCMakeTest.cmake +++ b/Tests/RunCMake/GeneratorExpression/RunCMakeTest.cmake @@ -7,4 +7,5 @@ run_cmake(BadNOT) run_cmake(BadStrEqual) run_cmake(BadZero) run_cmake(BadTargetName) +run_cmake(BadTargetTypeObject) run_cmake(BadInstallPrefix) diff --git a/Tests/RunCMake/GeneratorExpression/empty.c b/Tests/RunCMake/GeneratorExpression/empty.c new file mode 100644 index 000000000..e69de29bb diff --git a/Tests/RunCMake/ObjectLibrary/MissingSource-result.txt b/Tests/RunCMake/ObjectLibrary/MissingSource-result.txt new file mode 100644 index 000000000..d00491fd7 --- /dev/null +++ b/Tests/RunCMake/ObjectLibrary/MissingSource-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/ObjectLibrary/MissingSource-stderr.txt b/Tests/RunCMake/ObjectLibrary/MissingSource-stderr.txt new file mode 100644 index 000000000..411cd7cb7 --- /dev/null +++ b/Tests/RunCMake/ObjectLibrary/MissingSource-stderr.txt @@ -0,0 +1,9 @@ +CMake Error at MissingSource.cmake:1 \(add_library\): + Cannot find source file: + + missing.c + + Tried extensions( \.[A-Za-z+]+| + )* +Call Stack \(most recent call first\): + CMakeLists.txt:3 \(include\) diff --git a/Tests/RunCMake/ObjectLibrary/MissingSource.cmake b/Tests/RunCMake/ObjectLibrary/MissingSource.cmake new file mode 100644 index 000000000..258eaedb2 --- /dev/null +++ b/Tests/RunCMake/ObjectLibrary/MissingSource.cmake @@ -0,0 +1 @@ +add_library(A OBJECT missing.c) diff --git a/Tests/RunCMake/ObjectLibrary/RunCMakeTest.cmake b/Tests/RunCMake/ObjectLibrary/RunCMakeTest.cmake index 55db14dfd..2dd8d3859 100644 --- a/Tests/RunCMake/ObjectLibrary/RunCMakeTest.cmake +++ b/Tests/RunCMake/ObjectLibrary/RunCMakeTest.cmake @@ -12,6 +12,7 @@ run_cmake(Install) run_cmake(LinkObjLHS) run_cmake(LinkObjRHS1) run_cmake(LinkObjRHS2) +run_cmake(MissingSource) run_cmake(ObjWithObj) run_cmake(PostBuild) run_cmake(PreBuild)