Как неожиданно выяснилось, предыдущие варианты (раз, два, три) оказались неправильными. Публикую окончательный правильный вариант использование precompiled headers при компиляции nmake или в Visual Studio 2008:
CMakeLists.txt
macro( use_precompiled_header SRC_LIST_VAR HDR_FILE SRC_FILE ) get_filename_component( PCH_HEADER ${HDR_FILE} NAME ) get_filename_component( PCH_BINARY ${HDR_FILE} NAME_WE ) set( PCH_BINARY "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${PCH_BINARY}.pch" ) if (MSVC) set( SRC_LIST ${${SRC_LIST_VAR}} ) set_source_files_properties( ${SRC_LIST} PROPERTIES COMPILE_FLAGS "/Yu${PCH_HEADER} /Fp${PCH_BINARY}" OBJECT_DEPENDS "${PCH_BINARY}" ) set_source_files_properties( ${SRC_FILE} PROPERTIES COMPILE_FLAGS "/Yc${PCH_HEADER} /Fp${PCH_BINARY}" OBJECT_OUTPUTS "${PCH_BINARY}" OBJECT_DEPENDS "" ) endif(MSVC) endmacro( use_precompiled_header ) |
Особенное внимание обратите на использование:
file( GLOB_RECURSE CORE_SRC *.cpp ) use_precompiled_header( CORE_SRC precompiled.h precompiled.cpp ) |
CORE_SRC — это НАЗВАНИЕ переменной, а не сама переменная.
P.S. С версии CMake 3.16.0 доступна команда target_precompiled_headers(), которая позволяет без лишних усилий работать с precompiled headers.