diff options
Diffstat (limited to 'Tests/RunCMake/PrecompileHeaders/PchReuseFromObjLib.cmake')
-rw-r--r-- | Tests/RunCMake/PrecompileHeaders/PchReuseFromObjLib.cmake | 131 |
1 files changed, 131 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() |