diff options
-rw-r--r-- | Help/prop_tgt/COMPILE_WARNING_AS_ERROR.rst | 25 | ||||
-rw-r--r-- | Source/cmExportFileGenerator.cxx | 7 | ||||
-rw-r--r-- | Source/cmQtAutoMocUic.cxx | 18 | ||||
-rw-r--r-- | Tests/RunCMake/CMakeLists.txt | 1 | ||||
-rw-r--r-- | Tests/RunCMake/ExportImport/CMakeLists.txt | 3 | ||||
-rw-r--r-- | Tests/RunCMake/ExportImport/RunCMakeTest.cmake | 24 | ||||
-rw-r--r-- | Tests/RunCMake/ExportImport/SharedDep-export.cmake | 13 | ||||
-rw-r--r-- | Tests/RunCMake/ExportImport/SharedDep-import.cmake | 1 | ||||
-rw-r--r-- | Tests/RunCMake/ExportImport/bar-config.cmake.in | 2 | ||||
-rw-r--r-- | Tests/RunCMake/ExportImport/bar.c | 12 | ||||
-rw-r--r-- | Tests/RunCMake/ExportImport/foo-config.cmake.in | 1 | ||||
-rw-r--r-- | Tests/RunCMake/ExportImport/foo.c | 7 |
12 files changed, 105 insertions, 9 deletions
diff --git a/Help/prop_tgt/COMPILE_WARNING_AS_ERROR.rst b/Help/prop_tgt/COMPILE_WARNING_AS_ERROR.rst index 86a0f7f..19323cb 100644 --- a/Help/prop_tgt/COMPILE_WARNING_AS_ERROR.rst +++ b/Help/prop_tgt/COMPILE_WARNING_AS_ERROR.rst @@ -5,6 +5,31 @@ COMPILE_WARNING_AS_ERROR Specify whether to treat warnings on compile as errors. If enabled, adds a flag to treat warnings on compile as errors. +If the ``--compile-no-warning-as-error`` option is given on the +:manual:`cmake(1)` command line, this property is ignored. + +This property is not implemented for all compilers. It is silently ignored +if there is no implementation for the compiler being used. The currently +implemented :variable:`compiler IDs <CMAKE_<LANG>_COMPILER_ID>` are: + +* ``GNU`` +* ``Clang`` +* ``AppleClang`` +* ``Fujitsu`` +* ``FujitsuClang`` +* ``IBMClang`` +* ``Intel`` +* ``IntelLLVM`` +* ``LCC`` +* ``MSVC`` +* ``NVHPC`` +* ``NVIDIA`` (CUDA) +* ``QCC`` +* ``SunPro`` +* ``TI`` +* ``VisualAge`` +* ``XL`` +* ``XLClang`` This property is initialized by the value of the variable :variable:`CMAKE_COMPILE_WARNING_AS_ERROR` if it is set when a target is created. diff --git a/Source/cmExportFileGenerator.cxx b/Source/cmExportFileGenerator.cxx index 452eb99..5a33349 100644 --- a/Source/cmExportFileGenerator.cxx +++ b/Source/cmExportFileGenerator.cxx @@ -843,9 +843,16 @@ void cmExportFileGenerator::SetImportDetailProperties( suffix, target, "IMPORTED_LINK_INTERFACE_LANGUAGES", iface->Languages, properties, ImportLinkPropertyTargetNames::No); + // Export IMPORTED_LINK_DEPENDENT_LIBRARIES to help consuming linkers + // find private dependencies of shared libraries. + std::size_t oldMissingTargetsSize = this->MissingTargets.size(); this->SetImportLinkProperty( suffix, target, "IMPORTED_LINK_DEPENDENT_LIBRARIES", iface->SharedDeps, properties, ImportLinkPropertyTargetNames::Yes); + // Avoid enforcing shared library private dependencies as public package + // dependencies by ignoring missing targets added for them. + this->MissingTargets.resize(oldMissingTargetsSize); + if (iface->Multiplicity > 0) { std::string prop = cmStrCat("IMPORTED_LINK_INTERFACE_MULTIPLICITY", suffix); diff --git a/Source/cmQtAutoMocUic.cxx b/Source/cmQtAutoMocUic.cxx index a7125b1..8c09b56 100644 --- a/Source/cmQtAutoMocUic.cxx +++ b/Source/cmQtAutoMocUic.cxx @@ -2167,22 +2167,23 @@ void cmQtAutoMocUicT::JobCompileUicT::Process() void cmQtAutoMocUicT::JobMocsCompilationT::Process() { + std::string const& compAbs = this->MocConst().CompFileAbs; + // Compose mocs compilation file content std::string content = "// This file is autogenerated. Changes will be overwritten.\n"; if (this->MocEval().CompFiles.empty()) { // Placeholder content + cmCryptoHash hash(cmCryptoHash::AlgoSHA256); + const std::string hashedPath = hash.HashString(compAbs); + const std::string functionName = + "cmake_automoc_silence_linker_warning" + hashedPath; + content += "// No files found that require moc or the moc files are " "included\n" - "struct cmake_automoc_silence_linker_warning{\n" - " virtual ~cmake_automoc_silence_linker_warning();\n" - "};\n" - "\n" - "inline " - "cmake_automoc_silence_linker_warning::" - "~cmake_automoc_silence_linker_warning()\n" - "{}\n"; + "void " + + functionName + "() {}\n"; } else { // Valid content const bool mc = this->BaseConst().MultiConfig; @@ -2191,7 +2192,6 @@ void cmQtAutoMocUicT::JobMocsCompilationT::Process() content += cmWrap(wrapFront, this->MocEval().CompFiles, wrapBack, ""); } - std::string const& compAbs = this->MocConst().CompFileAbs; if (cmQtAutoGenerator::FileDiffers(compAbs, content)) { // Actually write mocs compilation file if (this->Log().Verbose()) { diff --git a/Tests/RunCMake/CMakeLists.txt b/Tests/RunCMake/CMakeLists.txt index 69def6d..09f248e 100644 --- a/Tests/RunCMake/CMakeLists.txt +++ b/Tests/RunCMake/CMakeLists.txt @@ -301,6 +301,7 @@ if("${CMAKE_GENERATOR}" MATCHES "Unix Makefiles|Ninja") add_RunCMake_test(ExportCompileCommands) endif() add_RunCMake_test(ExcludeFromAll) +add_RunCMake_test(ExportImport) add_RunCMake_test(ExternalData) add_RunCMake_test(FeatureSummary) add_RunCMake_test(FPHSA) diff --git a/Tests/RunCMake/ExportImport/CMakeLists.txt b/Tests/RunCMake/ExportImport/CMakeLists.txt new file mode 100644 index 0000000..5ff8d3e --- /dev/null +++ b/Tests/RunCMake/ExportImport/CMakeLists.txt @@ -0,0 +1,3 @@ +cmake_minimum_required(VERSION 3.23) +project(${RunCMake_TEST} NONE) +include(${RunCMake_TEST}.cmake) diff --git a/Tests/RunCMake/ExportImport/RunCMakeTest.cmake b/Tests/RunCMake/ExportImport/RunCMakeTest.cmake new file mode 100644 index 0000000..d07fca2 --- /dev/null +++ b/Tests/RunCMake/ExportImport/RunCMakeTest.cmake @@ -0,0 +1,24 @@ +cmake_minimum_required(VERSION 3.23) +include(RunCMake) + +function(run_ExportImport_test case) + set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/${case}-export-build) + set(CMAKE_INSTALL_PREFIX ${RunCMake_TEST_BINARY_DIR}/root) + if (NOT RunCMake_GENERATOR_IS_MULTI_CONFIG) + set(RunCMake_TEST_OPTIONS -DCMAKE_BUILD_TYPE=Debug) + endif() + run_cmake(${case}-export) + unset(RunCMake_TEST_OPTIONS) + set(RunCMake_TEST_NO_CLEAN 1) + run_cmake_command(${case}-export-build ${CMAKE_COMMAND} --build . --config Debug) + run_cmake_command(${case}-export-install ${CMAKE_COMMAND} -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DBUILD_TYPE=Debug -P cmake_install.cmake) + unset(RunCMake_TEST_NO_CLEAN) + + set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/${case}-import-build) + run_cmake_with_options(${case}-import + -Dfoo_DIR=${CMAKE_INSTALL_PREFIX}/lib/cmake/foo + -Dbar_DIR=${CMAKE_INSTALL_PREFIX}/lib/cmake/bar + ) +endfunction() + +run_ExportImport_test(SharedDep) diff --git a/Tests/RunCMake/ExportImport/SharedDep-export.cmake b/Tests/RunCMake/ExportImport/SharedDep-export.cmake new file mode 100644 index 0000000..2da3e47 --- /dev/null +++ b/Tests/RunCMake/ExportImport/SharedDep-export.cmake @@ -0,0 +1,13 @@ +enable_language(C) + +add_library(foo SHARED foo.c) +install(TARGETS foo EXPORT foo) +install(EXPORT foo DESTINATION lib/cmake/foo) +install(FILES foo-config.cmake.in RENAME foo-config.cmake DESTINATION lib/cmake/foo) + +add_library(bar SHARED bar.c) +target_link_libraries(bar PRIVATE foo) +# 'foo' only appears in IMPORTED_LINK_DEPENDENT_LIBRARIES, and so is not enforced on import. +install(TARGETS bar EXPORT bar) +install(EXPORT bar DESTINATION lib/cmake/bar) +install(FILES bar-config.cmake.in RENAME bar-config.cmake DESTINATION lib/cmake/bar) diff --git a/Tests/RunCMake/ExportImport/SharedDep-import.cmake b/Tests/RunCMake/ExportImport/SharedDep-import.cmake new file mode 100644 index 0000000..2e2c2f6 --- /dev/null +++ b/Tests/RunCMake/ExportImport/SharedDep-import.cmake @@ -0,0 +1 @@ +find_package(bar REQUIRED CONFIG NO_DEFAULT_PATH) diff --git a/Tests/RunCMake/ExportImport/bar-config.cmake.in b/Tests/RunCMake/ExportImport/bar-config.cmake.in new file mode 100644 index 0000000..9148046 --- /dev/null +++ b/Tests/RunCMake/ExportImport/bar-config.cmake.in @@ -0,0 +1,2 @@ +# find_dependency(foo) intentionally left out for this test case +include(${CMAKE_CURRENT_LIST_DIR}/bar.cmake) diff --git a/Tests/RunCMake/ExportImport/bar.c b/Tests/RunCMake/ExportImport/bar.c new file mode 100644 index 0000000..19adca9 --- /dev/null +++ b/Tests/RunCMake/ExportImport/bar.c @@ -0,0 +1,12 @@ +#if defined(_WIN32) +__declspec(dllimport) +#endif + int foo(void); + +#ifdef _WIN32 +__declspec(dllexport) +#endif + int bar(void) +{ + return foo(); +} diff --git a/Tests/RunCMake/ExportImport/foo-config.cmake.in b/Tests/RunCMake/ExportImport/foo-config.cmake.in new file mode 100644 index 0000000..b038138 --- /dev/null +++ b/Tests/RunCMake/ExportImport/foo-config.cmake.in @@ -0,0 +1 @@ +include(${CMAKE_CURRENT_LIST_DIR}/foo.cmake) diff --git a/Tests/RunCMake/ExportImport/foo.c b/Tests/RunCMake/ExportImport/foo.c new file mode 100644 index 0000000..8794965 --- /dev/null +++ b/Tests/RunCMake/ExportImport/foo.c @@ -0,0 +1,7 @@ +#ifdef _WIN32 +__declspec(dllexport) +#endif + int foo(void) +{ + return 0; +} |