Przeglądaj źródła

PCH: Propagate INTERFACE_PRECOMPILE_HEADERS in install(EXPORT)

This was accidentally left out of commit 0467a2f91b (PCH: add
PRECOMPILE_HEADERS to special properties, 2015-03-12).  Also add a test
case for `install(EXPORT)` and `export()` propagation of precompiled
headers.

Fixes: #19741
Brad King 6 lat temu
rodzic
commit
c54448e185

+ 3 - 0
Source/cmExportInstallFileGenerator.cxx

@@ -94,6 +94,9 @@ bool cmExportInstallFileGenerator::GenerateMainFile(std::ostream& os)
     this->PopulateInterfaceProperty("INTERFACE_COMPILE_OPTIONS", gt,
                                     cmGeneratorExpression::InstallInterface,
                                     properties, missingTargets);
+    this->PopulateInterfaceProperty("INTERFACE_PRECOMPILE_HEADERS", gt,
+                                    cmGeneratorExpression::InstallInterface,
+                                    properties, missingTargets);
     this->PopulateInterfaceProperty("INTERFACE_AUTOUIC_OPTIONS", gt,
                                     cmGeneratorExpression::InstallInterface,
                                     properties, missingTargets);

+ 11 - 1
Tests/ExportImport/Export/Interface/CMakeLists.txt

@@ -6,6 +6,12 @@ set_property(TARGET headeronly PROPERTY INTERFACE_INCLUDE_DIRECTORIES
 )
 set_property(TARGET headeronly PROPERTY INTERFACE_COMPILE_DEFINITIONS "HEADERONLY_DEFINE")
 
+add_library(pch_iface INTERFACE)
+target_precompile_headers(pch_iface INTERFACE
+  "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/pch/pch.h>"
+  "$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/include/pch/pch.h>"
+  )
+
 include(GenerateExportHeader)
 add_library(sharedlib SHARED sharedlib.cpp)
 generate_export_header(sharedlib)
@@ -45,7 +51,7 @@ set_property(TARGET cmakeonly PROPERTY custom_property CustomPropertyValue)
 set_property(TARGET cmakeonly PROPERTY EXPORT_PROPERTIES custom_property)
 
 install(TARGETS headeronly sharediface use_auto_type use_c_restrict source_target
-                cmakeonly
+                pch_iface cmakeonly
   EXPORT expInterface
 )
 install(TARGETS sharedlib
@@ -60,6 +66,10 @@ install(FILES
   headeronly/headeronly.h
   DESTINATION include/headeronly
 )
+install(FILES
+  pch/pch.h
+  DESTINATION include/pch
+)
 install(FILES
   sharedlib/sharedlib.h
   "${CMAKE_CURRENT_BINARY_DIR}/sharedlib_export.h"

+ 1 - 0
Tests/ExportImport/Export/Interface/pch/pch.h

@@ -0,0 +1 @@
+#define PCH_PCH_H_INCLUDED

+ 11 - 0
Tests/ExportImport/Import/Interface/CMakeLists.txt

@@ -98,6 +98,17 @@ set_property(TARGET exp::sharediface APPEND PROPERTY INTERFACE_LINK_LIBRARIES de
 add_executable(interfacetest_exp interfacetest.cpp)
 target_link_libraries(interfacetest_exp exp::sharediface)
 
+if(NOT CMAKE_OSX_ARCHITECTURES MATCHES "[;$]" OR CMAKE_GENERATOR STREQUAL "Xcode")
+  add_executable(pch_iface_test_bld pch_iface_test.cpp)
+  target_link_libraries(pch_iface_test_bld bld::pch_iface)
+  add_executable(pch_iface_test_exp pch_iface_test.cpp)
+  target_link_libraries(pch_iface_test_exp exp::pch_iface)
+  if(CMAKE_CXX_COMPILE_OPTIONS_USE_PCH)
+    target_compile_definitions(pch_iface_test_bld PRIVATE EXPECT_PCH)
+    target_compile_definitions(pch_iface_test_exp PRIVATE EXPECT_PCH)
+  endif()
+endif()
+
 do_try_compile(exp)
 
 foreach(ns exp bld)

+ 16 - 0
Tests/ExportImport/Import/Interface/pch_iface_test.cpp

@@ -0,0 +1,16 @@
+#ifdef EXPECT_PCH
+// Verify that pch/pch.h was included via '-include ...' or equivalent.
+#  ifndef PCH_PCH_H_INCLUDED
+#    error "Expected PCH_PCH_H_INCLUDED."
+#  endif
+#elif defined(__PGIC__) || defined(__ibmxl__)
+// No PCH expected but these compilers define macros below.
+#elif defined(__GNUC__) || defined(__clang__) || defined(_INTEL_COMPILER) ||  \
+  defined(_MSC_VER)
+#  error "Expected EXPECT_PCH for this compiler."
+#endif
+
+int main()
+{
+  return 0;
+}