On Saturday 06 January 2007 18:42, you wrote: > Am Freitag, den 05.01.2007, 01:14 +0100 schrieb Axel Roebel: > > GET_TARGET_PROPERTY(_targetType ${_PCH_current_target} TYPE) > > SET(PHC_MASTER_INCLUDE_FILE ${_input}) > > > > CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/cmModules/PCHCheckDependencies.cxx.i > >n ${CMAKE_CURRENT_BINARY_DIR}/${_targetName}_gchdep.cxx) > > Axel, this forces everyone to use "cmModules" as the name of the folder > were to save PCHSupport.cmake . > > I suggest to use a macro to create the file: > > MACRO(_PCH_WRITE_GCHDEP_CXX _targetName _include_file) > > FILE(WRITE ${CMAKE_CURRENT_BINARY_DIR}/${_targetName}_gchdep.cxx > "#include \"${_include_file}\" > int testfunction() > { > return 0; > } > " > ) > > ENDMACRO(_PCH_WRITE_GCHDEP_CXX ) > > and use it like this: > > GET_TARGET_PROPERTY(_targetType ${_PCH_current_target} TYPE) > _PCH_WRITE_GCHDEP_CXX(${_targetName} ${_input} ) > IF(${_targetType} STREQUAL SHARED_LIBRARY) > ADD_LIBRARY(${_targetName}_gchdep SHARED > ${CMAKE_CURRENT_BINARY_DIR}/${_targetName}_gchdep.cxx) > ELSE(${_targetType} STREQUAL SHARED_LIBRARY) > ADD_LIBRARY(${_targetName}_gchdep STATIC > ${CMAKE_CURRENT_BINARY_DIR}/${_targetName}_gchdep.cxx) > ENDIF(${_targetType} STREQUAL SHARED_LIBRARY) > > > This worked for me.
For me as well, so here it is. > BTW: Consider to use pchdep not gchdep, since gch is related to gcc > only. I changed the names but it seems that the output the directory is always called gch. Cheers, Axel > MfG Maik -- Axel Roebel IRCAM Analysis/Synthesis Team Phone: ++33-1-4478 4845 | Fax: ++33-1-4478 1540
# - Try to find precompiled headers support for GCC 3.4 and 4.x # Once done this will define: # # Variable: # PCHSupport_FOUND # # Macro: # ADD_PRECOMPILED_HEADER IF(CMAKE_COMPILER_IS_GNUCXX) EXEC_PROGRAM( ${CMAKE_CXX_COMPILER} ARGS ${CMAKE_CXX_COMPILER_ARG1} -dumpversion OUTPUT_VARIABLE gcc_compiler_version) MESSAGE("GCC Version: ${gcc_compiler_version}") IF(gcc_compiler_version MATCHES "4\\.[0-9]\\.[0-9]") SET(PCHSupport_FOUND TRUE) ELSE(gcc_compiler_version MATCHES "4\\.[0-9]\\.[0-9]") IF(gcc_compiler_version MATCHES "3\\.4\\.[0-9]") SET(PCHSupport_FOUND TRUE) ENDIF(gcc_compiler_version MATCHES "3\\.4\\.[0-9]") ENDIF(gcc_compiler_version MATCHES "4\\.[0-9]\\.[0-9]") SET(_PCH_include_prefix "-I") ELSE(CMAKE_COMPILER_IS_GNUCXX) IF(WIN32) SET(PCHSupport_FOUND TRUE) # for experimental msvc support SET(_PCH_include_prefix "/I") ELSE(WIN32) SET(PCHSupport_FOUND FALSE) ENDIF(WIN32) ENDIF(CMAKE_COMPILER_IS_GNUCXX) MACRO(_PCH_GET_COMPILE_FLAGS _out_compile_flags) STRING(TOUPPER "CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}" _flags_var_name) SET(${_out_compile_flags} ${${_flags_var_name}} ) IF(CMAKE_COMPILER_IS_GNUCXX) GET_TARGET_PROPERTY(_targetType ${_PCH_current_target} TYPE) IF(${_targetType} STREQUAL SHARED_LIBRARY) LIST(APPEND ${_out_compile_flags} "${${_out_compile_flags}} -fPIC") ENDIF(${_targetType} STREQUAL SHARED_LIBRARY) ELSE(CMAKE_COMPILER_IS_GNUCXX) ## TODO ... ? or does it work out of the box ENDIF(CMAKE_COMPILER_IS_GNUCXX) GET_DIRECTORY_PROPERTY(DIRINC INCLUDE_DIRECTORIES ) FOREACH(item ${DIRINC}) LIST(APPEND ${_out_compile_flags} "${_PCH_include_prefix}${item}") ENDFOREACH(item) GET_DIRECTORY_PROPERTY(_directory_flags DEFINITIONS) #MESSAGE("_directory_flags ${_directory_flags}" ) LIST(APPEND ${_out_compile_flags} ${_directory_flags}) LIST(APPEND ${_out_compile_flags} ${CMAKE_CXX_FLAGS} ) SEPARATE_ARGUMENTS(${_out_compile_flags}) ENDMACRO(_PCH_GET_COMPILE_FLAGS) MACRO(_PCH_WRITE_PCHDEP_CXX _targetName _include_file) FILE(WRITE ${CMAKE_CURRENT_BINARY_DIR}/${_targetName}_pchdep.cxx "#include \"${_include_file}\" int testfunction() { return 0; } " ) ENDMACRO(_PCH_WRITE_PCHDEP_CXX ) MACRO(_PCH_GET_COMPILE_COMMAND out_command _input _output) FILE(TO_NATIVE_PATH ${_input} _native_input) FILE(TO_NATIVE_PATH ${_output} _native_output) IF(CMAKE_COMPILER_IS_GNUCXX) IF(CMAKE_CXX_COMPILER_ARG1) # remove leading space in compiler argument STRING(REGEX REPLACE "^ +" "" pchsupport_compiler_cxx_arg1 ${CMAKE_CXX_COMPILER_ARG1}) SET(${out_command} ${CMAKE_CXX_COMPILER} ${pchsupport_compiler_cxx_arg1} ${_compile_FLAGS} -x c++-header -o ${_output} ${_input} ) ELSE(CMAKE_CXX_COMPILER_ARG1) SET(${out_command} ${CMAKE_CXX_COMPILER} ${_compile_FLAGS} -x c++-header -o ${_output} ${_input} ) ENDIF(CMAKE_CXX_COMPILER_ARG1) ELSE(CMAKE_COMPILER_IS_GNUCXX) SET(_dummy_str "#include <${_input}>") FILE(WRITE ${CMAKE_CURRENT_BINARY_DIR}/pch_dummy.cpp ${_dummy_str}) SET(${out_command} ${CMAKE_CXX_COMPILER} ${_compile_FLAGS} /c /Fp${_native_output} /Yc${_native_input} pch_dummy.cpp ) #/out:${_output} ENDIF(CMAKE_COMPILER_IS_GNUCXX) ENDMACRO(_PCH_GET_COMPILE_COMMAND ) MACRO(_PCH_GET_TARGET_COMPILE_FLAGS _cflags _header_name _pch_path ) FILE(TO_NATIVE_PATH ${_pch_path} _native_pch_path) message(${_native_pch_path}) IF(CMAKE_COMPILER_IS_GNUCXX) set(${_cflags} "-include ${CMAKE_CURRENT_BINARY_DIR}/${_header_name} -Winvalid-pch" ) ELSE(CMAKE_COMPILER_IS_GNUCXX) set(${_cflags} "/Fp${_native_pch_path} /Yu${_header_name}" ) ENDIF(CMAKE_COMPILER_IS_GNUCXX) ENDMACRO(_PCH_GET_TARGET_COMPILE_FLAGS ) MACRO(ADD_PRECOMPILED_HEADER _targetName _input ) SET(_PCH_current_target ${_targetName}) IF(NOT CMAKE_BUILD_TYPE) MESSAGE(FATAL_ERROR "This is the ADD_PRECOMPILED_HEADER macro. " "You must set CMAKE_BUILD_TYPE!" ) ENDIF(NOT CMAKE_BUILD_TYPE) GET_FILENAME_COMPONENT(_name ${_input} NAME) GET_FILENAME_COMPONENT(_path ${_input} PATH) SET(_outdir "${CMAKE_CURRENT_BINARY_DIR}/${_name}.gch") SET(_output "${_outdir}/${_targetName}_${CMAKE_BUILD_TYPE}.h++") GET_TARGET_PROPERTY(_targetType ${_PCH_current_target} TYPE) _PCH_WRITE_PCHDEP_CXX(${_targetName} ${_input} ) IF(${_targetType} STREQUAL SHARED_LIBRARY) ADD_LIBRARY(${_targetName}_pchdep SHARED ${CMAKE_CURRENT_BINARY_DIR}/${_targetName}_pchdep.cxx) ELSE(${_targetType} STREQUAL SHARED_LIBRARY) ADD_LIBRARY(${_targetName}_pchdep STATIC ${CMAKE_CURRENT_BINARY_DIR}/${_targetName}_pchdep.cxx) ENDIF(${_targetType} STREQUAL SHARED_LIBRARY) ADD_CUSTOM_COMMAND( OUTPUT ${_outdir} COMMAND mkdir ${_outdir} # TODO: {CMAKE_COMMAND} -E ... !doesn't work in win32 ) _PCH_GET_COMPILE_FLAGS(_compile_FLAGS) #MESSAGE("_compile_FLAGS: ${_compile_FLAGS}") #message("COMMAND ${CMAKE_CXX_COMPILER} ${_compile_FLAGS} -x c++-header -o ${_output} ${_input}") ADD_CUSTOM_COMMAND( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${_name} COMMAND ${CMAKE_COMMAND} -E copy ${_input} ${CMAKE_CURRENT_BINARY_DIR}/${_name} # ensure same directory! Required by gcc ) #message("_command ${_input} ${_output}") _PCH_GET_COMPILE_COMMAND(_command ${_input} ${_output} ) #message(${_input} ) # message("${_command}") ADD_CUSTOM_COMMAND( OUTPUT ${_output} COMMAND ${_command} DEPENDS ${_input} ${_outdir} ${CMAKE_CURRENT_BINARY_DIR}/${_name} ${_targetName}_pchdep ) ADD_CUSTOM_TARGET(${_targetName}_gch DEPENDS ${_output} ) ADD_DEPENDENCIES(${_targetName} ${_targetName}_gch ) _PCH_GET_TARGET_COMPILE_FLAGS(_target_cflags ${_name} ${_output}) SET_TARGET_PROPERTIES(${_targetName} PROPERTIES COMPILE_FLAGS ${_target_cflags} ) ENDMACRO(ADD_PRECOMPILED_HEADER)
_______________________________________________ CMake mailing list CMake@cmake.org http://www.cmake.org/mailman/listinfo/cmake