4 set(CMAKE_PCH_WARN_INVALID OFF)
6 if(CMAKE_CXX_COMPILE_OPTIONS_USE_PCH)
7 add_definitions(-DHAVE_PCH_SUPPORT)
10 ######################################################################
12 file(WRITE ${CMAKE_BINARY_DIR}/CONFIG/config.hxx "/*empty*/\n")
14 file(WRITE ${CMAKE_BINARY_DIR}/pch.cxx [=[
20 file(WRITE ${CMAKE_BINARY_DIR}/string.hxx [=[
28 string(const char* s) {
32 const char* c_str() const {
39 add_library(pch-generator OBJECT ${CMAKE_BINARY_DIR}/pch.cxx)
40 set_property(TARGET pch-generator PROPERTY POSITION_INDEPENDENT_CODE ON)
41 target_precompile_headers(pch-generator PRIVATE ${CMAKE_BINARY_DIR}/string.hxx)
43 target_include_directories(pch-generator PRIVATE ${CMAKE_BINARY_DIR}/CONFIG)
45 ######################################################################
47 file(WRITE ${CMAKE_BINARY_DIR}/message.cxx [=[
48 #include "message.hxx"
50 #ifndef HAVE_PCH_SUPPORT
56 static std::string greeting("hi there");
57 return greeting.c_str();
61 file(WRITE ${CMAKE_BINARY_DIR}/message.hxx [=[
63 #ifdef WIN32_BUILD_SHARED
65 #define MESSAGE_EXPORT __declspec(dllexport)
67 #define MESSAGE_EXPORT __declspec(dllimport)
70 #define MESSAGE_EXPORT
73 MESSAGE_EXPORT const char* message();
76 ######################################################################
78 file(WRITE ${CMAKE_BINARY_DIR}/main.cxx [=[
79 #include "message.hxx"
84 return strcmp(message(), "hi there");
88 ######################################################################
92 function(add_library_and_executable type)
93 add_library(message_${type} ${type} ${CMAKE_BINARY_DIR}/message.cxx)
94 target_precompile_headers(message_${type} REUSE_FROM pch-generator)
96 set_property(TARGET message_${type} PROPERTY POSITION_INDEPENDENT_CODE ON)
97 set_property(TARGET message_${type} PROPERTY DEFINE_SYMBOL "")
99 if (WIN32 AND type STREQUAL "SHARED")
100 file(WRITE ${CMAKE_BINARY_DIR}/SHARED/config.hxx [=[
101 #define BUILD_LIBRARY
102 #define WIN32_BUILD_SHARED
104 target_include_directories(message_${type} PRIVATE ${CMAKE_BINARY_DIR}/SHARED)
106 # Workaround for VS2008, the compiler fails with
107 # c1xx : fatal error C1083: Cannot open source file: '_WINDLL': No such file or directory
108 file(WRITE ${CMAKE_BINARY_DIR}/_WINDLL "/*empty*/\n")
110 target_include_directories(message_${type} PRIVATE ${CMAKE_BINARY_DIR}/CONFIG)
113 add_executable(main_${type} ${CMAKE_BINARY_DIR}/main.cxx)
114 target_include_directories(main_${type} PRIVATE ${CMAKE_BINARY_DIR})
116 if (WIN32 AND type STREQUAL "SHARED")
117 file(WRITE ${CMAKE_BINARY_DIR}/main_SHARED/config.hxx "#define WIN32_BUILD_SHARED\n")
118 target_include_directories(main_${type} PRIVATE ${CMAKE_BINARY_DIR}/main_SHARED)
120 target_include_directories(main_${type} PRIVATE ${CMAKE_BINARY_DIR}/CONFIG)
123 target_link_libraries(main_${type} PRIVATE message_${type})
125 add_test(NAME main_${type} COMMAND main_${type})
128 foreach(type OBJECT STATIC SHARED)
129 add_library_and_executable(${type})