Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix for NOTFOUND issue in some (or all) cases. #11

Closed
wants to merge 8 commits into from
144 changes: 100 additions & 44 deletions CMakePCHCompiler.cmake
Expand Up @@ -51,15 +51,34 @@ function(target_precompiled_header) # target [...] header
if(ARGS_REUSE AND NOT TARGET "${ARGS_REUSE}")
message(SEND_ERROR "Re-use target \"${ARGS_REUSE}\" does not exist.")
return()
endif()
endif()
foreach(target ${ARGS_UNPARSED_ARGUMENTS})
if(NOT TARGET "${target}")
message(SEND_ERROR "Target \"${target}\" does not exist.")
return()
endif()
if(ARGS_REUSE)
set(pch_target ${ARGS_REUSE}.pch)
set(target_dir
${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${pch_target}.dir
)
else()
set(pch_target ${target}.pch)
set(target_dir
${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${pch_target}.dir
)
endif()
if(MSVC)
# ensure pdb goes to the same location, otherwise we get C2859
get_filename_component(
pdb_dir
"${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${target}.dir"
ABSOLUTE
)
get_filename_component(win_pch "${target_dir}/${header}.pch" ABSOLUTE)
get_filename_component(win_header "${header}" ABSOLUTE)
endif()
if(NOT ARGS_REUSE)
if(ARGS_TYPE)
set(header_type ${ARGS_TYPE})
elseif(lang STREQUAL C)
Expand All @@ -70,42 +89,67 @@ function(target_precompiled_header) # target [...] header
message(WARNING "Unknown header type for language ${lang}")
set(header_type "c++-header")
endif()
if(MSVC)
# ensure pdb goes to the same location, otherwise we get C2859
file(TO_NATIVE_PATH
"${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${target}.dir"
pdb_dir
)
if(MSVC)
# /Yc - create precompiled header
# /Fp - exact location for precompiled header
# /Fd - specify directory for pdb output
set(flags "/Yc /Fd${pdb_dir}\\")
#https://gitlab.kitware.com/cmake/cmake/issues/17060
# don't forget the slash on the end. (How did this ever work?)
# /FI - force include of precompiled header
set(flags "/Yc\"${win_header}\" /Fp\"${win_pch}\" /FI\"${win_header}\"") # /Fd\"${pdb_dir}\\\\\"

#3.9.0 is required to work with MSVC2015's XML file because of an MSVC bug.
#So, instead of /Fd\"${pdb_dir}\\\\\" why not COMPILE_PDB_OUTPUT_DIRECTORY?
set_source_files_properties(
${header}
PROPERTIES
LANGUAGE ${lang}
COMPILE_FLAGS ${flags}
#COMPILE_PDB_OUTPUT_DIRECTORY ${pdb_dir}) ##/Fd\"${pdb_dir}\\\\\"
)

add_library(${pch_target} ${header})

#Note, this adds debug/release/etc. onto the end.
set_target_properties(${pch_target} PROPERTIES
COMPILE_PDB_OUTPUT_DIRECTORY ${pdb_dir}) ##/Fd\"${pdb_dir}\\\\\"
else()
set(flags "-x ${header_type}")
set_source_files_properties(
${header}
PROPERTIES
LANGUAGE ${lang}PCH
COMPILE_FLAGS ${flags}
)
add_library(${pch_target} OBJECT ${header})
endif()
set_source_files_properties(
${header}
PROPERTIES
LANGUAGE ${lang}PCH
COMPILE_FLAGS ${flags}
)
add_library(${target}.pch OBJECT ${header})
set(pch_target ${target}.pch)
endif()
add_dependencies(${target} ${pch_target})
set(target_dir
${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${pch_target}.dir
)

if(MSVC)
get_filename_component(win_header "${header}" NAME)
file(TO_NATIVE_PATH "${target_dir}/${header}.pch" win_pch)
#Note, this adds debug/release/etc. onto the end.
set_target_properties(${target} PROPERTIES
COMPILE_PDB_OUTPUT_DIRECTORY ${pdb_dir}) ##/Fd\"${pdb_dir}\\\\\"
#Careful: set_target_properties is destructive
# /Yu - use given include as precompiled header
# /Fp - exact location for precompiled header
# /Fd - specify directory for pdb output
#https://gitlab.kitware.com/cmake/cmake/issues/17060
# don't forget the slash on the end. (How did this ever work?)
# /FI - force include of precompiled header
set(flags "/Yu${win_header} /Fp${win_pch} /FI${win_header}")
target_compile_options(${target} PRIVATE
"/Yu\"${win_header}\""
"/Fp\"${win_pch}\""
"/FI\"${win_header}\""
##"/Fd\"${pdb_dir}\\\\\""
)
target_link_libraries(${target} PRIVATE ${pch_target})
else()
set(flags "-include ${target_dir}/${header}")
#Careful: set_target_properties is destructive
target_compile_options(${target} PRIVATE
-include "${target_dir}/${header}"
)
endif()
set_target_properties(${target} PROPERTIES COMPILE_FLAGS "${flags}")
add_dependencies(${target} ${pch_target})

if(NOT ARGS_REUSE)
if(NOT DEFINED CMAKE_PCH_COMPILER_TARGETS)
Expand Down Expand Up @@ -212,19 +256,22 @@ endmacro()

# copies all compile definitions, flags and options to .pch subtarget
function(__watch_pch_last_hook variable access value)

list(LENGTH CMAKE_PCH_COMPILER_TARGETS length)
foreach(index RANGE -${length} -1)
list(GET CMAKE_PCH_COMPILER_TARGETS ${index} target)
list(GET CMAKE_PCH_COMPILER_TARGET_FLAGS ${index} flags)
set(pch_target ${target}.pch)
foreach(property
COMPILE_DEFINITIONS
COMPILE_DEFINITIONS_DEBUG
COMPILE_DEFINITIONS_MINSIZEREL
COMPILE_DEFINITIONS_RELEASE
COMPILE_DEFINITIONS_RELWITHDEBINFO
COMPILE_FLAGS
COMPILE_OPTIONS
if(0!=length)
foreach(index RANGE -${length} -1)
list(GET CMAKE_PCH_COMPILER_TARGETS ${index} target)
list(GET CMAKE_PCH_COMPILER_TARGET_FLAGS ${index} flags)
set(pch_target ${target}.pch)
foreach(property
COMPILE_DEFINITIONS
COMPILE_DEFINITIONS_DEBUG
COMPILE_DEFINITIONS_MINSIZEREL
COMPILE_DEFINITIONS_RELEASE
COMPILE_DEFINITIONS_RELWITHDEBINFO
COMPILE_OPTIONS
INCLUDE_DIRECTORIES
CXX_STANDARD
)
get_target_property(value ${target} ${property})
# remove compile flags that we inserted by
Expand All @@ -233,15 +280,24 @@ function(__watch_pch_last_hook variable access value)
string(REPLACE "${flags}" "" value "${value}")
endif()
if(NOT value STREQUAL "value-NOTFOUND")
set_target_properties(
"${pch_target}"
PROPERTIES
"${property}"
"${value}"
)
if(property STREQUAL "CXX_STANDARD")
if(NOT MSVC)
target_compile_options(
"${pch_target}"
PRIVATE "-std=gnu++${value}"
)
endif()
else()
set_target_properties(
"${pch_target}"
PROPERTIES
"${property}"
"${value}"
)
endif()
endif()
endforeach()
endforeach()
endif()
endfunction()

# copies all custom compiler settings to PCH compiler
Expand Down