Как неожиданно выяснилось, предыдущие варианты (раз, два, три) оказались неправильными. Публикую окончательный правильный вариант использование 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.