| 
					
				 | 
			
			
				@@ -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() 
			 |