diff options
author | Cristian Adam <cristian.adam@gmail.com> | 2021-01-22 13:47:27 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2021-02-02 20:03:55 (GMT) |
commit | c450d66daa44c5314c84eb7252eb14a2dfd874a4 (patch) | |
tree | a0873cb5c5da7c29f0ef8f9b38fb8c28a39d4b13 /Tests/RunCMake/PrecompileHeaders | |
parent | 9e2e96f5ada39fd3e688f59baf6cc5a8b65ed6e3 (diff) | |
download | CMake-c450d66daa44c5314c84eb7252eb14a2dfd874a4.zip CMake-c450d66daa44c5314c84eb7252eb14a2dfd874a4.tar.gz CMake-c450d66daa44c5314c84eb7252eb14a2dfd874a4.tar.bz2 |
PCH: Remove restrictions for REUSE_FROM signature for MSVC
Fixes: #20201
Diffstat (limited to 'Tests/RunCMake/PrecompileHeaders')
-rw-r--r-- | Tests/RunCMake/PrecompileHeaders/PchReuseFromObjLib.cmake | 131 | ||||
-rw-r--r-- | Tests/RunCMake/PrecompileHeaders/RunCMakeTest.cmake | 1 |
2 files changed, 132 insertions, 0 deletions
diff --git a/Tests/RunCMake/PrecompileHeaders/PchReuseFromObjLib.cmake b/Tests/RunCMake/PrecompileHeaders/PchReuseFromObjLib.cmake new file mode 100644 index 0000000..ba504a3 --- /dev/null +++ b/Tests/RunCMake/PrecompileHeaders/PchReuseFromObjLib.cmake @@ -0,0 +1,131 @@ +cmake_minimum_required(VERSION 3.18) + +project(PchReuseFromObjLib) + +set(CMAKE_PCH_WARN_INVALID OFF) + +if(CMAKE_CXX_COMPILE_OPTIONS_USE_PCH) + add_definitions(-DHAVE_PCH_SUPPORT) +endif() + +###################################################################### + +file(WRITE ${CMAKE_BINARY_DIR}/CONFIG/config.hxx "/*empty*/\n") + +file(WRITE ${CMAKE_BINARY_DIR}/pch.cxx [=[ +void nothing() +{ +} +]=]) + +file(WRITE ${CMAKE_BINARY_DIR}/string.hxx [=[ +#include <string.h> + +namespace std { + struct string + { + char storage[20]; + + string(const char* s) { + strcpy(storage, s); + } + + const char* c_str() const { + return storage; + } + }; +} +]=]) + +add_library(pch-generator OBJECT ${CMAKE_BINARY_DIR}/pch.cxx) +set_property(TARGET pch-generator PROPERTY POSITION_INDEPENDENT_CODE ON) +target_precompile_headers(pch-generator PRIVATE ${CMAKE_BINARY_DIR}/string.hxx) + +target_include_directories(pch-generator PRIVATE ${CMAKE_BINARY_DIR}/CONFIG) + +###################################################################### + +file(WRITE ${CMAKE_BINARY_DIR}/message.cxx [=[ +#include "message.hxx" + +#ifndef HAVE_PCH_SUPPORT + #include "string.hxx" +#endif + +const char* message() +{ + static std::string greeting("hi there"); + return greeting.c_str(); +} +]=]) + +file(WRITE ${CMAKE_BINARY_DIR}/message.hxx [=[ +#include "config.hxx" +#ifdef WIN32_BUILD_SHARED + #ifdef BUILD_LIBRARY + #define MESSAGE_EXPORT __declspec(dllexport) + #else + #define MESSAGE_EXPORT __declspec(dllimport) + #endif +#else + #define MESSAGE_EXPORT +#endif + +MESSAGE_EXPORT const char* message(); +]=]) + +###################################################################### + +file(WRITE ${CMAKE_BINARY_DIR}/main.cxx [=[ +#include "message.hxx" +#include <string.h> + +int main() +{ + return strcmp(message(), "hi there"); +} +]=]) + +###################################################################### + +enable_testing() + +function(add_library_and_executable type) + add_library(message_${type} ${type} ${CMAKE_BINARY_DIR}/message.cxx) + target_precompile_headers(message_${type} REUSE_FROM pch-generator) + + set_property(TARGET message_${type} PROPERTY POSITION_INDEPENDENT_CODE ON) + set_property(TARGET message_${type} PROPERTY DEFINE_SYMBOL "") + + if (WIN32 AND type STREQUAL "SHARED") + file(WRITE ${CMAKE_BINARY_DIR}/SHARED/config.hxx [=[ + #define BUILD_LIBRARY + #define WIN32_BUILD_SHARED + ]=]) + target_include_directories(message_${type} PRIVATE ${CMAKE_BINARY_DIR}/SHARED) + + # Workaround for VS2008, the compiler fails with + # c1xx : fatal error C1083: Cannot open source file: '_WINDLL': No such file or directory + file(WRITE ${CMAKE_BINARY_DIR}/_WINDLL "/*empty*/\n") + else() + target_include_directories(message_${type} PRIVATE ${CMAKE_BINARY_DIR}/CONFIG) + endif() + + add_executable(main_${type} ${CMAKE_BINARY_DIR}/main.cxx) + target_include_directories(main_${type} PRIVATE ${CMAKE_BINARY_DIR}) + + if (WIN32 AND type STREQUAL "SHARED") + file(WRITE ${CMAKE_BINARY_DIR}/main_SHARED/config.hxx "#define WIN32_BUILD_SHARED\n") + target_include_directories(main_${type} PRIVATE ${CMAKE_BINARY_DIR}/main_SHARED) + else() + target_include_directories(main_${type} PRIVATE ${CMAKE_BINARY_DIR}/CONFIG) + endif() + + target_link_libraries(main_${type} PRIVATE message_${type}) + + add_test(NAME main_${type} COMMAND main_${type}) +endfunction() + +foreach(type OBJECT STATIC SHARED) + add_library_and_executable(${type}) +endforeach() diff --git a/Tests/RunCMake/PrecompileHeaders/RunCMakeTest.cmake b/Tests/RunCMake/PrecompileHeaders/RunCMakeTest.cmake index 74670ba..a5a3770 100644 --- a/Tests/RunCMake/PrecompileHeaders/RunCMakeTest.cmake +++ b/Tests/RunCMake/PrecompileHeaders/RunCMakeTest.cmake @@ -26,3 +26,4 @@ if(RunCMake_GENERATOR MATCHES "Make|Ninja") run_cmake(PchInstantiateTemplates) endif() endif() +run_test(PchReuseFromObjLib) |