diff --git a/Help/manual/cmake-properties.7.rst b/Help/manual/cmake-properties.7.rst index ff7446483b..16004b425b 100644 --- a/Help/manual/cmake-properties.7.rst +++ b/Help/manual/cmake-properties.7.rst @@ -584,6 +584,7 @@ Properties on Source Files /prop_sf/LOCATION /prop_sf/MACOSX_PACKAGE_LOCATION /prop_sf/OBJECT_DEPENDS + /prop_sf/OBJECT_NAME /prop_sf/OBJECT_OUTPUTS /prop_sf/JOB_POOL_COMPILE /prop_sf/SKIP_AUTOGEN diff --git a/Help/prop_sf/OBJECT_NAME.rst b/Help/prop_sf/OBJECT_NAME.rst new file mode 100644 index 0000000000..2424a5aacb --- /dev/null +++ b/Help/prop_sf/OBJECT_NAME.rst @@ -0,0 +1,26 @@ +OBJECT_NAME +----------- + +.. versionadded:: 4.2 + +Set the object name (without the object extension) of the source file. An +empty string value disables custom object naming. The value must be a relative +path, and may not include special directory components (e.g., ``..``). + +Note that the object name may not be used as-is in +:variable:`CMAKE_INTERMEDIATE_DIR_STRATEGY` and +:prop_tgt:`INSTALL_OBJECT_NAME_STRATEGY` strategies, but instead changed as +the strategy requires to fulfill its goals. + +This property supports +:manual:`generator expressions `, but does not +allow for context-sensitive (i.e., configuration-dependent) expressions. + +.. note:: + No collision resistance within a target is performed by CMake. When using + this property, collisions must be avoided in the project code. CMake has a + number of source files it generates that also create object files that may + collide with a given custom name. These include: + * Generated PCH source files (``cmake_pch``) + * Generated Unity compilation files (``unity_``) + * Qt autogen sources (``moc_compilations.cpp``) diff --git a/Help/prop_tgt/INSTALL_OBJECT_NAME_STRATEGY.rst b/Help/prop_tgt/INSTALL_OBJECT_NAME_STRATEGY.rst index 99f5170898..45cf7d8b8a 100644 --- a/Help/prop_tgt/INSTALL_OBJECT_NAME_STRATEGY.rst +++ b/Help/prop_tgt/INSTALL_OBJECT_NAME_STRATEGY.rst @@ -7,7 +7,8 @@ INSTALL_OBJECT_NAME_STRATEGY specifying the strategy to use when naming installed object files. The supported values are: -- ``FULL``: Object files are named after the associated source file. +- ``FULL``: Object files are named after the associated source file or + its :prop_sf:`OBJECT_NAME` property. - ``SHORT``: Object files are named based on the hash of the source file name to reduce path lengths. diff --git a/Help/release/dev/object-name-properties.rst b/Help/release/dev/object-name-properties.rst new file mode 100644 index 0000000000..fce7114290 --- /dev/null +++ b/Help/release/dev/object-name-properties.rst @@ -0,0 +1,5 @@ +object-name-properties +---------------------- + +* The :prop_sf:`OBJECT_NAME` source file property may be used to control + object names of source files. diff --git a/Help/variable/CMAKE_INTERMEDIATE_DIR_STRATEGY.rst b/Help/variable/CMAKE_INTERMEDIATE_DIR_STRATEGY.rst index 4b0849a8c4..a0b3a68ae2 100644 --- a/Help/variable/CMAKE_INTERMEDIATE_DIR_STRATEGY.rst +++ b/Help/variable/CMAKE_INTERMEDIATE_DIR_STRATEGY.rst @@ -10,7 +10,8 @@ supported values are: - ``FULL``: Intermediate directories are named based on a ``.dir`` pattern (with some slight deviations and sanitizations applied in various places). Object file names are based on the filename of - the source file being compiled. + the source file being compiled or, if set, its :prop_sf:`OBJECT_NAME` + property. - ``SHORT``: Intermediate directories are named from the hash of the target name and the build directory location. Object file names are based on hashes of the source file name to reduce path lengths. This may help with projects diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx index c504b39c2e..b5b6f43006 100644 --- a/Source/cmLocalGenerator.cxx +++ b/Source/cmLocalGenerator.cxx @@ -25,6 +25,7 @@ #include "cmsys/RegularExpression.hxx" #include "cmAlgorithms.h" +#include "cmCMakePath.h" #include "cmComputeLinkInformation.h" #include "cmCryptoHash.h" #include "cmCustomCommand.h" @@ -4237,6 +4238,94 @@ std::string cmLocalGenerator::GetRelativeSourceFileName( return objectName; } +std::string cmLocalGenerator::GetCustomObjectFileName( + cmSourceFile const& source) const +{ + if (!this->GetGlobalGenerator()->SupportsCustomObjectNames()) { + return std::string{}; + } + + if (auto objName = source.GetProperty("OBJECT_NAME")) { + cmGeneratorExpression ge(*this->GetCMakeInstance()); + auto cge = ge.Parse(objName); + static std::string const INVALID_GENEX = + "_cmake_invalid_object_name_genex"; + static std::string const INVALID_VALUE = + "_cmake_invalid_object_name_value"; + + if (!cge) { + this->Makefile->IssueMessage( + MessageType::FATAL_ERROR, + cmStrCat("The \"OBJECT_NAME\" property for\n ", source.GetFullPath(), + "\nis not a valid generator expression (", objName, ").")); + return INVALID_GENEX; + } + if (cge->GetHadHeadSensitiveCondition()) { + // Not reachable; all target-sensitive genexes actually fail to parse. + this->Makefile->IssueMessage( + MessageType::FATAL_ERROR, + cmStrCat("The \"OBJECT_NAME\" property for\n ", source.GetFullPath(), + "\ncontains a condition that queries the consuming target " + "which is not supported (", + objName, ").")); + return INVALID_GENEX; + } + if (cge->GetHadLinkLanguageSensitiveCondition()) { + // Not reachable; all target-sensitive genexes actually fail to parse. + this->Makefile->IssueMessage( + MessageType::FATAL_ERROR, + cmStrCat("The \"OBJECT_NAME\" property for\n ", source.GetFullPath(), + "\ncontains a condition that queries the link language " + "which is not supported (", + objName, ").")); + return INVALID_GENEX; + } + + auto objNameValue = cge->Evaluate(this, ""); + if (cge->GetHadContextSensitiveCondition()) { + this->Makefile->IssueMessage( + MessageType::FATAL_ERROR, + cmStrCat("The \"OBJECT_NAME\" property for\n ", source.GetFullPath(), + "\ncontains a context-sensitive condition which is not " + "supported (", + objName, ").")); + return INVALID_GENEX; + } + + // Skip if it evaluates to empty. + if (!objNameValue.empty()) { + cmCMakePath objNamePath = objNameValue; + // Verify that it is a relative path. + if (objNamePath.IsAbsolute()) { + this->Makefile->IssueMessage( + MessageType::FATAL_ERROR, + cmStrCat( + "The \"OBJECT_NAME\" property for\n ", source.GetFullPath(), + "\nresolves to an absolute path which is not supported:\n ", + objNameValue)); + return INVALID_VALUE; + } + auto isInvalidComponent = [](cmCMakePath const& component) -> bool { + return component == ".."_s; + }; + // Verify that it contains no `..` components. + if (std::any_of(objNamePath.begin(), objNamePath.end(), + isInvalidComponent)) { + this->Makefile->IssueMessage( + MessageType::FATAL_ERROR, + cmStrCat("The \"OBJECT_NAME\" property for\n ", + source.GetFullPath(), "\ncontains an invalid component (", + objNameValue, ").")); + return INVALID_VALUE; + } + + return objNameValue; + } + } + + return std::string{}; +} + std::string cmLocalGenerator::GetObjectFileNameWithoutTarget( cmSourceFile const& source, std::string const& dir_max, bool* hasSourceExtension, char const* customOutputExtension, @@ -4247,6 +4336,17 @@ std::string cmLocalGenerator::GetObjectFileNameWithoutTarget( useShortObjectNames = *forceShortObjectName; } + if (!useShortObjectNames) { + auto customName = this->GetCustomObjectFileName(source); + if (!customName.empty()) { + auto ext = this->GlobalGenerator->GetLanguageOutputExtension(source); + if (customOutputExtension) { + ext = *customOutputExtension; + } + return cmStrCat(customName, ext); + } + } + // This can return an absolute path in the case where source is // not relative to the current source or binary directories std::string objectName = this->GetRelativeSourceFileName(source); diff --git a/Source/cmLocalGenerator.h b/Source/cmLocalGenerator.h index 9f38a903ff..0fe8203dcf 100644 --- a/Source/cmLocalGenerator.h +++ b/Source/cmLocalGenerator.h @@ -452,6 +452,7 @@ public: virtual std::string GetShortObjectFileName(cmSourceFile const& source) const; virtual std::string ComputeShortTargetDirectory( cmGeneratorTarget const* gt) const; + std::string GetCustomObjectFileName(cmSourceFile const& source) const; /** * Generate a macOS application bundle Info.plist file. diff --git a/Source/cmLocalGhsMultiGenerator.cxx b/Source/cmLocalGhsMultiGenerator.cxx index 9bded02c2c..910e10df68 100644 --- a/Source/cmLocalGhsMultiGenerator.cxx +++ b/Source/cmLocalGhsMultiGenerator.cxx @@ -60,10 +60,16 @@ void cmLocalGhsMultiGenerator::ComputeObjectFilenames( for (auto const& si : mapping) { cmSourceFile const* sf = si.first; - std::string objectNameLower = cmStrCat( - cmSystemTools::LowerCase( - cmSystemTools::GetFilenameWithoutLastExtension(sf->GetFullPath())), - this->GlobalGenerator->GetLanguageOutputExtension(*sf)); + std::string objectName; + auto customObjectName = this->GetCustomObjectFileName(*sf); + if (customObjectName.empty()) { + objectName = + cmSystemTools::GetFilenameWithoutLastExtension(sf->GetFullPath()); + } else { + objectName = std::move(customObjectName); + } + objectName += this->GlobalGenerator->GetLanguageOutputExtension(*sf); + std::string objectNameLower = cmSystemTools::LowerCase(objectName); counts[objectNameLower] += 1; } @@ -74,9 +80,16 @@ void cmLocalGhsMultiGenerator::ComputeObjectFilenames( bool forceShortObjectName = true; std::string shortObjectName = this->GetObjectFileNameWithoutTarget( *sf, dir_max, nullptr, nullptr, &forceShortObjectName); - std::string longObjectName = cmStrCat( - cmSystemTools::GetFilenameWithoutLastExtension(sf->GetFullPath()), - this->GlobalGenerator->GetLanguageOutputExtension(*sf)); + std::string longObjectName; + auto customObjectName = this->GetCustomObjectFileName(*sf); + if (customObjectName.empty()) { + longObjectName = + cmSystemTools::GetFilenameWithoutLastExtension(sf->GetFullPath()); + } else { + longObjectName = std::move(customObjectName); + const_cast(gt)->AddExplicitObjectName(sf); + } + longObjectName += this->GlobalGenerator->GetLanguageOutputExtension(*sf); if (counts[cmSystemTools::LowerCase(longObjectName)] > 1) { const_cast(gt)->AddExplicitObjectName(sf); diff --git a/Source/cmLocalVisualStudioGenerator.cxx b/Source/cmLocalVisualStudioGenerator.cxx index 9d7a507544..4146128313 100644 --- a/Source/cmLocalVisualStudioGenerator.cxx +++ b/Source/cmLocalVisualStudioGenerator.cxx @@ -55,8 +55,13 @@ void cmLocalVisualStudioGenerator::ComputeObjectFilenames( if (gt->GetUseShortObjectNames()) { baseObjectName = this->GetShortObjectFileName(*sf); } else { - baseObjectName = - cmSystemTools::GetFilenameWithoutLastExtension(sf->GetFullPath()); + auto customObjectName = this->GetCustomObjectFileName(*sf); + if (customObjectName.empty()) { + baseObjectName = + cmSystemTools::GetFilenameWithoutLastExtension(sf->GetFullPath()); + } else { + baseObjectName = std::move(customObjectName); + } } std::string objectNameLower = cmSystemTools::LowerCase(baseObjectName); if (custom_ext) { @@ -74,8 +79,15 @@ void cmLocalVisualStudioGenerator::ComputeObjectFilenames( for (auto& si : mapping) { cmSourceFile const* sf = si.first; std::string shortObjectName = this->GetShortObjectFileName(*sf); - std::string longObjectName = - cmSystemTools::GetFilenameWithoutLastExtension(sf->GetFullPath()); + std::string longObjectName; + auto customObjectName = this->GetCustomObjectFileName(*sf); + if (customObjectName.empty()) { + longObjectName = + cmSystemTools::GetFilenameWithoutLastExtension(sf->GetFullPath()); + } else { + longObjectName = std::move(customObjectName); + const_cast(gt)->AddExplicitObjectName(sf); + } if (custom_ext) { shortObjectName += custom_ext; longObjectName += custom_ext; diff --git a/Source/cmVisualStudio10TargetGenerator.cxx b/Source/cmVisualStudio10TargetGenerator.cxx index d53987bff4..8630455f85 100644 --- a/Source/cmVisualStudio10TargetGenerator.cxx +++ b/Source/cmVisualStudio10TargetGenerator.cxx @@ -2721,16 +2721,21 @@ void cmVisualStudio10TargetGenerator::WriteAllSources(Elem& e0) this->WriteExcludeFromBuild(e2, exclude_configs); } + std::string customObjectName; if (this->GlobalGenerator->UseShortObjectNames()) { + customObjectName = + this->LocalGenerator->GetShortObjectFileName(*si.Source); + } else { + customObjectName = + this->LocalGenerator->GetCustomObjectFileName(*si.Source); + } + if (!customObjectName.empty()) { std::string outputName = "ObjectFileName"; if (si.Source->GetLanguage() == "CUDA"_s) { outputName = "CompileOut"; } - e2.Element( - outputName, - cmStrCat("$(IntDir)", - this->LocalGenerator->GetShortObjectFileName(*si.Source), - ".obj")); + e2.Element(outputName, + cmStrCat("$(IntDir)", customObjectName, ".obj")); } this->FinishWritingSource(e2, toolSettings); diff --git a/Tests/RunCMake/CMakeLists.txt b/Tests/RunCMake/CMakeLists.txt index cd951f21fd..92e9d5b3be 100644 --- a/Tests/RunCMake/CMakeLists.txt +++ b/Tests/RunCMake/CMakeLists.txt @@ -570,6 +570,7 @@ if(XCODE_VERSION) set(ObjectLibrary_ARGS -DXCODE_VERSION=${XCODE_VERSION}) endif() add_RunCMake_test(ObjectLibrary) +add_RunCMake_test(OBJECT_NAME) add_RunCMake_test(ParseImplicitIncludeInfo) add_RunCMake_test(ParseImplicitLinkInfo) if(UNIX AND CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG) diff --git a/Tests/RunCMake/OBJECT_NAME/CMakeLists.txt b/Tests/RunCMake/OBJECT_NAME/CMakeLists.txt new file mode 100644 index 0000000000..c89e9088dc --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/CMakeLists.txt @@ -0,0 +1,3 @@ +cmake_minimum_required(VERSION 3.16) +project(${RunCMake_TEST} C) +include(${RunCMake_TEST}.cmake) diff --git a/Tests/RunCMake/OBJECT_NAME/Collision-result.txt b/Tests/RunCMake/OBJECT_NAME/Collision-result.txt new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/Collision-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/OBJECT_NAME/Collision-stderr.txt b/Tests/RunCMake/OBJECT_NAME/Collision-stderr.txt new file mode 100644 index 0000000000..fb4133e041 --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/Collision-stderr.txt @@ -0,0 +1 @@ +((Ninja)?multiple rules generate CMakeFiles/objlib.dir/objlib_lib.c.o) diff --git a/Tests/RunCMake/OBJECT_NAME/Collision.cmake b/Tests/RunCMake/OBJECT_NAME/Collision.cmake new file mode 100644 index 0000000000..7f1a83f0af --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/Collision.cmake @@ -0,0 +1 @@ +include("${CMAKE_CURRENT_LIST_DIR}/CollisionBuild.cmake") diff --git a/Tests/RunCMake/OBJECT_NAME/CollisionBuild-build-result.txt b/Tests/RunCMake/OBJECT_NAME/CollisionBuild-build-result.txt new file mode 100644 index 0000000000..abdb916dd2 --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/CollisionBuild-build-result.txt @@ -0,0 +1 @@ +(1|(Makefiles)?2) diff --git a/Tests/RunCMake/OBJECT_NAME/CollisionBuild-build-stderr.txt b/Tests/RunCMake/OBJECT_NAME/CollisionBuild-build-stderr.txt new file mode 100644 index 0000000000..024a2fa8b8 --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/CollisionBuild-build-stderr.txt @@ -0,0 +1 @@ +((Ninja Multi-Config)?multiple rules generate CMakeFiles/objlib.dir/Debug/objlib_lib.c.o|(Makefiles)?((Linux)?undefined reference to `[fg]'|(macOS)?"?_[fg]"?, referenced from:|(Solaris)?[fg][ \t]*CMakeFiles/usefuncs.dir/test.c.o|(AIX)?Undefined symbol: \.[fg]|(FreeBSD)?undefined symbol: [fg])|(NMake Makefiles)?NMAKE : |(NMake Makefiles JOM)?jom: |(Watcom WMake)?Last command making \(usefuncs.exe\) returned a bad status|^$) diff --git a/Tests/RunCMake/OBJECT_NAME/CollisionBuild-build-stdout.txt b/Tests/RunCMake/OBJECT_NAME/CollisionBuild-build-stdout.txt new file mode 100644 index 0000000000..3864072be6 --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/CollisionBuild-build-stdout.txt @@ -0,0 +1 @@ +((NMake Makefiles)?unresolved external symbol [fg] referenced in function main|(Watcom WMake)?undefined symbol [fg]_|) diff --git a/Tests/RunCMake/OBJECT_NAME/CollisionBuild-stderr.txt b/Tests/RunCMake/OBJECT_NAME/CollisionBuild-stderr.txt new file mode 100644 index 0000000000..e3ec76eb7b --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/CollisionBuild-stderr.txt @@ -0,0 +1 @@ +((Makefiles)?Warning: Source file "[^"]*/Tests/RunCMake/OBJECT_NAME/lib2?.c" is listed multiple times for target "objlib".|^$) diff --git a/Tests/RunCMake/OBJECT_NAME/CollisionBuild.cmake b/Tests/RunCMake/OBJECT_NAME/CollisionBuild.cmake new file mode 100644 index 0000000000..e2bae33e59 --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/CollisionBuild.cmake @@ -0,0 +1,7 @@ +set(CMAKE_INTERMEDIATE_DIR_STRATEGY FULL CACHE STRING "" FORCE) + +add_library(objlib OBJECT lib.c lib2.c) +set_property(SOURCE lib.c lib2.c PROPERTY OBJECT_NAME "objlib_lib.c") + +add_executable(usefuncs test.c) +target_link_libraries(usefuncs PRIVATE objlib) diff --git a/Tests/RunCMake/OBJECT_NAME/Consume-DisableOnEmpty.cmake b/Tests/RunCMake/OBJECT_NAME/Consume-DisableOnEmpty.cmake new file mode 100644 index 0000000000..57f13bb621 --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/Consume-DisableOnEmpty.cmake @@ -0,0 +1 @@ +include("${CMAKE_CURRENT_LIST_DIR}/Consume.cmake") diff --git a/Tests/RunCMake/OBJECT_NAME/Consume-GeneratorExpression.cmake b/Tests/RunCMake/OBJECT_NAME/Consume-GeneratorExpression.cmake new file mode 100644 index 0000000000..57f13bb621 --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/Consume-GeneratorExpression.cmake @@ -0,0 +1 @@ +include("${CMAKE_CURRENT_LIST_DIR}/Consume.cmake") diff --git a/Tests/RunCMake/OBJECT_NAME/Consume-ObjectLibrary.cmake b/Tests/RunCMake/OBJECT_NAME/Consume-ObjectLibrary.cmake new file mode 100644 index 0000000000..57f13bb621 --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/Consume-ObjectLibrary.cmake @@ -0,0 +1 @@ +include("${CMAKE_CURRENT_LIST_DIR}/Consume.cmake") diff --git a/Tests/RunCMake/OBJECT_NAME/Consume-ShortInstallStrategy.cmake b/Tests/RunCMake/OBJECT_NAME/Consume-ShortInstallStrategy.cmake new file mode 100644 index 0000000000..57f13bb621 --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/Consume-ShortInstallStrategy.cmake @@ -0,0 +1 @@ +include("${CMAKE_CURRENT_LIST_DIR}/Consume.cmake") diff --git a/Tests/RunCMake/OBJECT_NAME/Consume-ShortStrategy.cmake b/Tests/RunCMake/OBJECT_NAME/Consume-ShortStrategy.cmake new file mode 100644 index 0000000000..57f13bb621 --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/Consume-ShortStrategy.cmake @@ -0,0 +1 @@ +include("${CMAKE_CURRENT_LIST_DIR}/Consume.cmake") diff --git a/Tests/RunCMake/OBJECT_NAME/Consume.cmake b/Tests/RunCMake/OBJECT_NAME/Consume.cmake new file mode 100644 index 0000000000..4610e9fb74 --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/Consume.cmake @@ -0,0 +1,7 @@ +find_package(ON CONFIG REQUIRED) + +add_executable(main main.c) +target_link_libraries(main PRIVATE ON::objlib) + +enable_testing() +add_test(NAME run COMMAND main) diff --git a/Tests/RunCMake/OBJECT_NAME/DisableOnEmpty-build-check.cmake b/Tests/RunCMake/OBJECT_NAME/DisableOnEmpty-build-check.cmake new file mode 100644 index 0000000000..fd982f5e95 --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/DisableOnEmpty-build-check.cmake @@ -0,0 +1,5 @@ +set(ext_suffix ".c") +if (RunCMake_GENERATOR MATCHES "(Visual Studio|Xcode)") + set(ext_suffix "") +endif () +check_build_object(objlib "lib${ext_suffix}") diff --git a/Tests/RunCMake/OBJECT_NAME/DisableOnEmpty-install-check.cmake b/Tests/RunCMake/OBJECT_NAME/DisableOnEmpty-install-check.cmake new file mode 100644 index 0000000000..b9c9a4214b --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/DisableOnEmpty-install-check.cmake @@ -0,0 +1,5 @@ +set(ext_suffix ".c") +if (RunCMake_GENERATOR MATCHES "(Visual Studio|Xcode)") + set(ext_suffix "") +endif () +check_installed_object("${RunCMake_TEST_BINARY_DIR}/real_install/lib/objlib/objects-Debug/objlib/lib${ext_suffix}${CMAKE_C_OUTPUT_EXTENSION}") diff --git a/Tests/RunCMake/OBJECT_NAME/DisableOnEmpty.cmake b/Tests/RunCMake/OBJECT_NAME/DisableOnEmpty.cmake new file mode 100644 index 0000000000..00427482de --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/DisableOnEmpty.cmake @@ -0,0 +1,6 @@ +set(CMAKE_INTERMEDIATE_DIR_STRATEGY FULL CACHE STRING "" FORCE) + +add_library(objlib OBJECT lib.c) +set_property(SOURCE lib.c PROPERTY OBJECT_NAME "$<$:objlib_lib.c>") +install(TARGETS objlib EXPORT exp OBJECTS DESTINATION "lib/objlib") +install(EXPORT exp DESTINATION lib/cmake/ON FILE on-config.cmake NAMESPACE ON::) diff --git a/Tests/RunCMake/OBJECT_NAME/Executable-build-check.cmake b/Tests/RunCMake/OBJECT_NAME/Executable-build-check.cmake new file mode 100644 index 0000000000..2366a72a61 --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/Executable-build-check.cmake @@ -0,0 +1 @@ +check_build_object(exe exe_main.c) diff --git a/Tests/RunCMake/OBJECT_NAME/Executable.cmake b/Tests/RunCMake/OBJECT_NAME/Executable.cmake new file mode 100644 index 0000000000..7fd7e1160d --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/Executable.cmake @@ -0,0 +1,4 @@ +set(CMAKE_INTERMEDIATE_DIR_STRATEGY FULL CACHE STRING "" FORCE) + +add_executable(exe main.c lib.c) +set_property(SOURCE main.c PROPERTY OBJECT_NAME "exe_main.c") diff --git a/Tests/RunCMake/OBJECT_NAME/GeneratorExpression-build-check.cmake b/Tests/RunCMake/OBJECT_NAME/GeneratorExpression-build-check.cmake new file mode 100644 index 0000000000..ed5979e868 --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/GeneratorExpression-build-check.cmake @@ -0,0 +1 @@ +check_build_object(objlib 1/objlib_lib.c) diff --git a/Tests/RunCMake/OBJECT_NAME/GeneratorExpression-install-check.cmake b/Tests/RunCMake/OBJECT_NAME/GeneratorExpression-install-check.cmake new file mode 100644 index 0000000000..b6ec47661a --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/GeneratorExpression-install-check.cmake @@ -0,0 +1 @@ +check_installed_object("${RunCMake_TEST_BINARY_DIR}/real_install/lib/objlib/objects-Debug/objlib/1/objlib_lib.c${CMAKE_C_OUTPUT_EXTENSION}") diff --git a/Tests/RunCMake/OBJECT_NAME/GeneratorExpression.cmake b/Tests/RunCMake/OBJECT_NAME/GeneratorExpression.cmake new file mode 100644 index 0000000000..12f82ee923 --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/GeneratorExpression.cmake @@ -0,0 +1,6 @@ +set(CMAKE_INTERMEDIATE_DIR_STRATEGY FULL CACHE STRING "" FORCE) + +add_library(objlib OBJECT lib.c) +set_property(SOURCE lib.c PROPERTY OBJECT_NAME "$/objlib_lib.c") +install(TARGETS objlib EXPORT exp OBJECTS DESTINATION "lib/objlib") +install(EXPORT exp DESTINATION lib/cmake/ON FILE on-config.cmake NAMESPACE ON::) diff --git a/Tests/RunCMake/OBJECT_NAME/Inspect.cmake b/Tests/RunCMake/OBJECT_NAME/Inspect.cmake new file mode 100644 index 0000000000..ec74ed8e36 --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/Inspect.cmake @@ -0,0 +1,10 @@ +enable_language(C) + +set(info "") + +# Forward information about the C++ compile features. +string(APPEND info "\ +set(CMAKE_C_OUTPUT_EXTENSION \"${CMAKE_C_OUTPUT_EXTENSION}\") +") + +file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/info.cmake" "${info}") diff --git a/Tests/RunCMake/OBJECT_NAME/InvalidGeneratorExpression-result.txt b/Tests/RunCMake/OBJECT_NAME/InvalidGeneratorExpression-result.txt new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/InvalidGeneratorExpression-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/OBJECT_NAME/InvalidGeneratorExpression-stderr.txt b/Tests/RunCMake/OBJECT_NAME/InvalidGeneratorExpression-stderr.txt new file mode 100644 index 0000000000..d769100a22 --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/InvalidGeneratorExpression-stderr.txt @@ -0,0 +1,9 @@ +CMake Error: + Error evaluating generator expression: + + \$ + + Expression did not evaluate to a known generator expression + + +CMake Generate step failed. Build files cannot be regenerated correctly. diff --git a/Tests/RunCMake/OBJECT_NAME/InvalidGeneratorExpression.cmake b/Tests/RunCMake/OBJECT_NAME/InvalidGeneratorExpression.cmake new file mode 100644 index 0000000000..0aa1a2f83b --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/InvalidGeneratorExpression.cmake @@ -0,0 +1,2 @@ +add_library(objlib OBJECT lib.c) +set_property(SOURCE lib.c PROPERTY OBJECT_NAME "$") diff --git a/Tests/RunCMake/OBJECT_NAME/NoAbsolute-result.txt b/Tests/RunCMake/OBJECT_NAME/NoAbsolute-result.txt new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/NoAbsolute-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/OBJECT_NAME/NoAbsolute-stderr.txt b/Tests/RunCMake/OBJECT_NAME/NoAbsolute-stderr.txt new file mode 100644 index 0000000000..be2f20ecb8 --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/NoAbsolute-stderr.txt @@ -0,0 +1,11 @@ +CMake Error in CMakeLists.txt: + The "OBJECT_NAME" property for + + .*/Tests/RunCMake/OBJECT_NAME/lib.c + + resolves to an absolute path which is not supported: + + .*/Tests/RunCMake/OBJECT_NAME/NoAbsolute-build/lib.c + + +CMake Generate step failed. Build files cannot be regenerated correctly. diff --git a/Tests/RunCMake/OBJECT_NAME/NoAbsolute.cmake b/Tests/RunCMake/OBJECT_NAME/NoAbsolute.cmake new file mode 100644 index 0000000000..1247dc3441 --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/NoAbsolute.cmake @@ -0,0 +1,2 @@ +add_library(static STATIC lib.c) +set_property(SOURCE lib.c PROPERTY OBJECT_NAME "${CMAKE_BINARY_DIR}/lib.c") diff --git a/Tests/RunCMake/OBJECT_NAME/NoDotDot-result.txt b/Tests/RunCMake/OBJECT_NAME/NoDotDot-result.txt new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/NoDotDot-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/OBJECT_NAME/NoDotDot-stderr.txt b/Tests/RunCMake/OBJECT_NAME/NoDotDot-stderr.txt new file mode 100644 index 0000000000..b10bd082ad --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/NoDotDot-stderr.txt @@ -0,0 +1,9 @@ +CMake Error in CMakeLists.txt: + The "OBJECT_NAME" property for + + .*/Tests/RunCMake/OBJECT_NAME/lib.c + + contains an invalid component \(subdir/\.\./sibling/lib.c\). + + +CMake Generate step failed. Build files cannot be regenerated correctly. diff --git a/Tests/RunCMake/OBJECT_NAME/NoDotDot.cmake b/Tests/RunCMake/OBJECT_NAME/NoDotDot.cmake new file mode 100644 index 0000000000..cdabada60c --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/NoDotDot.cmake @@ -0,0 +1,2 @@ +add_library(static STATIC lib.c) +set_property(SOURCE lib.c PROPERTY OBJECT_NAME "subdir/../sibling/lib.c") diff --git a/Tests/RunCMake/OBJECT_NAME/ObjectLibrary-build-check.cmake b/Tests/RunCMake/OBJECT_NAME/ObjectLibrary-build-check.cmake new file mode 100644 index 0000000000..39a6fa9bf2 --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/ObjectLibrary-build-check.cmake @@ -0,0 +1 @@ +check_build_object(objlib objlib_lib.c) diff --git a/Tests/RunCMake/OBJECT_NAME/ObjectLibrary-install-check.cmake b/Tests/RunCMake/OBJECT_NAME/ObjectLibrary-install-check.cmake new file mode 100644 index 0000000000..792efa1858 --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/ObjectLibrary-install-check.cmake @@ -0,0 +1 @@ +check_installed_object("${RunCMake_TEST_BINARY_DIR}/real_install/lib/objlib/objects-Debug/objlib/objlib_lib.c${CMAKE_C_OUTPUT_EXTENSION}") diff --git a/Tests/RunCMake/OBJECT_NAME/ObjectLibrary.cmake b/Tests/RunCMake/OBJECT_NAME/ObjectLibrary.cmake new file mode 100644 index 0000000000..93d544d791 --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/ObjectLibrary.cmake @@ -0,0 +1,6 @@ +set(CMAKE_INTERMEDIATE_DIR_STRATEGY FULL CACHE STRING "" FORCE) + +add_library(objlib OBJECT lib.c) +set_property(SOURCE lib.c PROPERTY OBJECT_NAME "objlib_lib.c") +install(TARGETS objlib EXPORT exp OBJECTS DESTINATION "lib/objlib") +install(EXPORT exp DESTINATION lib/cmake/ON FILE on-config.cmake NAMESPACE ON::) diff --git a/Tests/RunCMake/OBJECT_NAME/RunCMakeTest.cmake b/Tests/RunCMake/OBJECT_NAME/RunCMakeTest.cmake new file mode 100644 index 0000000000..5735eecc25 --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/RunCMakeTest.cmake @@ -0,0 +1,103 @@ +cmake_minimum_required(VERSION 3.16) + +include(RunCMake) + +# This test does installation of `OBJECT` libraries which does not work with +# multi-arch compilation under Xcode. +if (RunCMake_GENERATOR STREQUAL "Xcode" AND "$ENV{CMAKE_OSX_ARCHITECTURES}" MATCHES "[;$]") + return () +endif () + +function(run_build_test case) + set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/${case}-build) + set(RunCMake_TEST_OPTIONS -DCMAKE_BUILD_TYPE:STRING=Debug) + run_cmake(${case}) + set(RunCMake_TEST_NO_CLEAN 1) + run_cmake_command(${case}-build ${CMAKE_COMMAND} --build . --config Debug) +endfunction() + +function(run_install_test case) + set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/${case}-build) + set(RunCMake_TEST_OPTIONS -DCMAKE_BUILD_TYPE:STRING=Debug "-DCMAKE_INSTALL_PREFIX:PATH=${RunCMake_TEST_BINARY_DIR}/fake_install") + run_cmake(${case}) + set(RunCMake_TEST_NO_CLEAN 1) + run_cmake_command(${case}-build ${CMAKE_COMMAND} --build . --config Debug) + set(prefix "${RunCMake_TEST_BINARY_DIR}/real_install") + run_cmake_command(${case}-install ${CMAKE_COMMAND} --install . --config Debug --prefix "${prefix}") + + set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/Consume-${case}-build) + set(RunCMake_TEST_OPTIONS -DCMAKE_BUILD_TYPE:STRING=Debug "-DCMAKE_PREFIX_PATH:PATH=${prefix}") + run_cmake(Consume-${case} "-DCMAKE_PREFIX_PATH=${prefix}") + run_cmake_command(Consume-${case}-build ${CMAKE_COMMAND} --build . --config Debug) + run_cmake_command(Consume-${case}-test ${CMAKE_CTEST_COMMAND} -C Debug) +endfunction() + +function (check_build_object target objname) + set(cmf_subdir "CMakeFiles/") + set(config_subdir "") + if (RunCMake_GENERATOR MATCHES "Visual Studio") + set(cmf_subdir "") + endif () + if (RunCMake_GENERATOR_IS_MULTI_CONFIG) + set(config_subdir "Debug/") + endif () + set(path "${RunCMake_TEST_BINARY_DIR}/${cmf_subdir}${target}.dir/${config_subdir}${objname}${CMAKE_C_OUTPUT_EXTENSION}") + if (NOT EXISTS "${path}") + list(APPEND RunCMake_TEST_FAILED + "Could not find built object at '${path}'") + endif () + set(RunCMake_TEST_FAILED "${RunCMake_TEST_FAILED}" PARENT_SCOPE) +endfunction () + +function (check_short_build_object target objname) + set(config_subdir "") + if (RunCMake_GENERATOR_IS_MULTI_CONFIG) + set(config_subdir "Debug/") + endif () + set(obj_subdir ".o") + if (RunCMake_GENERATOR MATCHES "(Borland Makefiles|Watcom WMake)") + set(obj_subdir "_o") + endif () + set(path "${RunCMake_TEST_BINARY_DIR}/${obj_subdir}/${target}/${config_subdir}${objname}${CMAKE_C_OUTPUT_EXTENSION}") + if (NOT EXISTS "${path}") + list(APPEND RunCMake_TEST_FAILED + "Could not find built object at '${path}'") + endif () + set(RunCMake_TEST_FAILED "${RunCMake_TEST_FAILED}" PARENT_SCOPE) +endfunction () + +function (check_installed_object path) + if (NOT EXISTS "${path}") + list(APPEND RunCMake_TEST_FAILED + "Could not find installed object at '${path}'") + endif () + set(RunCMake_TEST_FAILED "${RunCMake_TEST_FAILED}" PARENT_SCOPE) +endfunction () + +run_cmake(Inspect) +include("${RunCMake_BINARY_DIR}/Inspect-build/info.cmake") + +run_build_test(Executable) +run_build_test(SharedLibrary) +run_build_test(StaticLibrary) + +if (RunCMake_GENERATOR STREQUAL "Ninja") + run_cmake(Collision) +else () + run_build_test(CollisionBuild) +endif () + +run_cmake(NoAbsolute) +run_cmake(NoDotDot) +run_cmake(InvalidGeneratorExpression) +run_cmake(UnsupportedGeneratorExpressionContextSensitive) +run_cmake(UnsupportedGeneratorExpressionHeadTarget) +run_cmake(UnsupportedGeneratorExpressionLinkLanguage) + +run_install_test(ObjectLibrary) +run_install_test(DisableOnEmpty) +if (RunCMake_GENERATOR MATCHES "(Ninja|Makefiles|Visual Studio)") + run_install_test(ShortStrategy) + run_install_test(ShortInstallStrategy) +endif () +run_install_test(GeneratorExpression) diff --git a/Tests/RunCMake/OBJECT_NAME/SharedLibrary-build-check.cmake b/Tests/RunCMake/OBJECT_NAME/SharedLibrary-build-check.cmake new file mode 100644 index 0000000000..8e0def5e5a --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/SharedLibrary-build-check.cmake @@ -0,0 +1 @@ +check_build_object(sharedlib sharedlib_lib.c) diff --git a/Tests/RunCMake/OBJECT_NAME/SharedLibrary.cmake b/Tests/RunCMake/OBJECT_NAME/SharedLibrary.cmake new file mode 100644 index 0000000000..0c9bdabce6 --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/SharedLibrary.cmake @@ -0,0 +1,4 @@ +set(CMAKE_INTERMEDIATE_DIR_STRATEGY FULL CACHE STRING "" FORCE) + +add_library(sharedlib SHARED lib.c) +set_property(SOURCE lib.c PROPERTY OBJECT_NAME "sharedlib_lib.c") diff --git a/Tests/RunCMake/OBJECT_NAME/ShortInstallStrategy-build-check.cmake b/Tests/RunCMake/OBJECT_NAME/ShortInstallStrategy-build-check.cmake new file mode 100644 index 0000000000..39a6fa9bf2 --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/ShortInstallStrategy-build-check.cmake @@ -0,0 +1 @@ +check_build_object(objlib objlib_lib.c) diff --git a/Tests/RunCMake/OBJECT_NAME/ShortInstallStrategy-install-check.cmake b/Tests/RunCMake/OBJECT_NAME/ShortInstallStrategy-install-check.cmake new file mode 100644 index 0000000000..ce06a88a8c --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/ShortInstallStrategy-install-check.cmake @@ -0,0 +1 @@ +check_installed_object("${RunCMake_TEST_BINARY_DIR}/real_install/lib/objlib/objects-Debug/objlib/d33a1361${CMAKE_C_OUTPUT_EXTENSION}") diff --git a/Tests/RunCMake/OBJECT_NAME/ShortInstallStrategy.cmake b/Tests/RunCMake/OBJECT_NAME/ShortInstallStrategy.cmake new file mode 100644 index 0000000000..007694b1c6 --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/ShortInstallStrategy.cmake @@ -0,0 +1,6 @@ +set(CMAKE_INSTALL_OBJECT_NAME_STRATEGY SHORT) + +add_library(objlib OBJECT lib.c) +set_property(SOURCE lib.c PROPERTY OBJECT_NAME "objlib_lib.c") +install(TARGETS objlib EXPORT exp OBJECTS DESTINATION "lib/objlib") +install(EXPORT exp DESTINATION lib/cmake/ON FILE on-config.cmake NAMESPACE ON::) diff --git a/Tests/RunCMake/OBJECT_NAME/ShortStrategy-build-check.cmake b/Tests/RunCMake/OBJECT_NAME/ShortStrategy-build-check.cmake new file mode 100644 index 0000000000..5343bffdb9 --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/ShortStrategy-build-check.cmake @@ -0,0 +1 @@ +check_short_build_object(fbbbd702 d33a1361) diff --git a/Tests/RunCMake/OBJECT_NAME/ShortStrategy-install-check.cmake b/Tests/RunCMake/OBJECT_NAME/ShortStrategy-install-check.cmake new file mode 100644 index 0000000000..792efa1858 --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/ShortStrategy-install-check.cmake @@ -0,0 +1 @@ +check_installed_object("${RunCMake_TEST_BINARY_DIR}/real_install/lib/objlib/objects-Debug/objlib/objlib_lib.c${CMAKE_C_OUTPUT_EXTENSION}") diff --git a/Tests/RunCMake/OBJECT_NAME/ShortStrategy.cmake b/Tests/RunCMake/OBJECT_NAME/ShortStrategy.cmake new file mode 100644 index 0000000000..7700eea866 --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/ShortStrategy.cmake @@ -0,0 +1,6 @@ +set(CMAKE_INTERMEDIATE_DIR_STRATEGY SHORT CACHE STRING "" FORCE) + +add_library(objlib OBJECT lib.c) +set_property(SOURCE lib.c PROPERTY OBJECT_NAME "objlib_lib.c") +install(TARGETS objlib EXPORT exp OBJECTS DESTINATION "lib/objlib") +install(EXPORT exp DESTINATION lib/cmake/ON FILE on-config.cmake NAMESPACE ON::) diff --git a/Tests/RunCMake/OBJECT_NAME/StaticLibrary-build-check.cmake b/Tests/RunCMake/OBJECT_NAME/StaticLibrary-build-check.cmake new file mode 100644 index 0000000000..3476ce9b9f --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/StaticLibrary-build-check.cmake @@ -0,0 +1 @@ +check_build_object(staticlib staticlib_lib.c) diff --git a/Tests/RunCMake/OBJECT_NAME/StaticLibrary.cmake b/Tests/RunCMake/OBJECT_NAME/StaticLibrary.cmake new file mode 100644 index 0000000000..c1b86e6eb9 --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/StaticLibrary.cmake @@ -0,0 +1,4 @@ +set(CMAKE_INTERMEDIATE_DIR_STRATEGY FULL CACHE STRING "" FORCE) + +add_library(staticlib STATIC lib.c) +set_property(SOURCE lib.c PROPERTY OBJECT_NAME "staticlib_lib.c") diff --git a/Tests/RunCMake/OBJECT_NAME/UnsupportedGeneratorExpressionContextSensitive-result.txt b/Tests/RunCMake/OBJECT_NAME/UnsupportedGeneratorExpressionContextSensitive-result.txt new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/UnsupportedGeneratorExpressionContextSensitive-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/OBJECT_NAME/UnsupportedGeneratorExpressionContextSensitive-stderr.txt b/Tests/RunCMake/OBJECT_NAME/UnsupportedGeneratorExpressionContextSensitive-stderr.txt new file mode 100644 index 0000000000..33ec747a2d --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/UnsupportedGeneratorExpressionContextSensitive-stderr.txt @@ -0,0 +1,10 @@ +CMake Error in CMakeLists.txt: + The "OBJECT_NAME" property for + + .*/Tests/RunCMake/OBJECT_NAME/lib.c + + contains a context-sensitive condition which is not supported + \(\$/objlib_lib.c\). + + +CMake Generate step failed. Build files cannot be regenerated correctly. diff --git a/Tests/RunCMake/OBJECT_NAME/UnsupportedGeneratorExpressionContextSensitive.cmake b/Tests/RunCMake/OBJECT_NAME/UnsupportedGeneratorExpressionContextSensitive.cmake new file mode 100644 index 0000000000..622e0364a1 --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/UnsupportedGeneratorExpressionContextSensitive.cmake @@ -0,0 +1,2 @@ +add_library(objlib OBJECT lib.c) +set_property(SOURCE lib.c PROPERTY OBJECT_NAME "$/objlib_lib.c") diff --git a/Tests/RunCMake/OBJECT_NAME/UnsupportedGeneratorExpressionHeadTarget-result.txt b/Tests/RunCMake/OBJECT_NAME/UnsupportedGeneratorExpressionHeadTarget-result.txt new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/UnsupportedGeneratorExpressionHeadTarget-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/OBJECT_NAME/UnsupportedGeneratorExpressionHeadTarget-stderr.txt b/Tests/RunCMake/OBJECT_NAME/UnsupportedGeneratorExpressionHeadTarget-stderr.txt new file mode 100644 index 0000000000..2ea9efddda --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/UnsupportedGeneratorExpressionHeadTarget-stderr.txt @@ -0,0 +1,12 @@ +CMake Error: + Error evaluating generator expression: + + \$ + + \$ may only be used with binary targets. It may not + be used with add_custom_command or add_custom_target. Specify the target + to read a property from using the \$ signature + instead. + + +CMake Generate step failed. Build files cannot be regenerated correctly. diff --git a/Tests/RunCMake/OBJECT_NAME/UnsupportedGeneratorExpressionHeadTarget.cmake b/Tests/RunCMake/OBJECT_NAME/UnsupportedGeneratorExpressionHeadTarget.cmake new file mode 100644 index 0000000000..196f4f38a0 --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/UnsupportedGeneratorExpressionHeadTarget.cmake @@ -0,0 +1,2 @@ +add_library(objlib OBJECT lib.c) +set_property(SOURCE lib.c PROPERTY OBJECT_NAME "$/objlib_lib.c") diff --git a/Tests/RunCMake/OBJECT_NAME/UnsupportedGeneratorExpressionLinkLanguage-result.txt b/Tests/RunCMake/OBJECT_NAME/UnsupportedGeneratorExpressionLinkLanguage-result.txt new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/UnsupportedGeneratorExpressionLinkLanguage-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/OBJECT_NAME/UnsupportedGeneratorExpressionLinkLanguage-stderr.txt b/Tests/RunCMake/OBJECT_NAME/UnsupportedGeneratorExpressionLinkLanguage-stderr.txt new file mode 100644 index 0000000000..73afc33771 --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/UnsupportedGeneratorExpressionLinkLanguage-stderr.txt @@ -0,0 +1,10 @@ +CMake Error: + Error evaluating generator expression: + + \$ + + \$ may only be used with binary targets to specify link + libraries, link directories, link options and link depends. + + +CMake Generate step failed. Build files cannot be regenerated correctly. diff --git a/Tests/RunCMake/OBJECT_NAME/UnsupportedGeneratorExpressionLinkLanguage.cmake b/Tests/RunCMake/OBJECT_NAME/UnsupportedGeneratorExpressionLinkLanguage.cmake new file mode 100644 index 0000000000..e57e475bc9 --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/UnsupportedGeneratorExpressionLinkLanguage.cmake @@ -0,0 +1,2 @@ +add_library(objlib OBJECT lib.c) +set_property(SOURCE lib.c PROPERTY OBJECT_NAME "$/objlib_lib.c") diff --git a/Tests/RunCMake/OBJECT_NAME/lib.c b/Tests/RunCMake/OBJECT_NAME/lib.c new file mode 100644 index 0000000000..a482372785 --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/lib.c @@ -0,0 +1,4 @@ +int f(int a) +{ + return a; +} diff --git a/Tests/RunCMake/OBJECT_NAME/lib2.c b/Tests/RunCMake/OBJECT_NAME/lib2.c new file mode 100644 index 0000000000..b1b136721f --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/lib2.c @@ -0,0 +1,4 @@ +int g(int a) +{ + return a; +} diff --git a/Tests/RunCMake/OBJECT_NAME/main.c b/Tests/RunCMake/OBJECT_NAME/main.c new file mode 100644 index 0000000000..934bcbc278 --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/main.c @@ -0,0 +1,6 @@ +int f(int a); + +int main(void) +{ + return f(0); +} diff --git a/Tests/RunCMake/OBJECT_NAME/test.c b/Tests/RunCMake/OBJECT_NAME/test.c new file mode 100644 index 0000000000..d2cac9b628 --- /dev/null +++ b/Tests/RunCMake/OBJECT_NAME/test.c @@ -0,0 +1,7 @@ +int f(int); +int g(int); + +int main(void) +{ + return f(0) + g(0); +}