Добрый день!
Есть такой CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
find_package(Hg)
if (HG_FOUND)
message("HG found")
HG_WC_INFO(${PROJECT_SOURCE_DIR} prj1)
set (SHORT_CHANGESET ${prj1_WC_REVISION})
set (HEX 0x)
set (LONG_CHANGESET ${HEX}${prj1_WC_CHANGESET})
message("Changeset: " ${SHORT_CHANGESET})
message("Number: " ${LONG_CHANGESET})
add_compile_options(-DSHORT_CHANGESET=${SHORT_CHANGESET}
-DLONG_CHANGESET=${LONG_CHANGESET})
endif()
add_subdirectory(prj2)
add_subdirectory(prj3)
И, соответственно, в директории prj2 CMakeLists.txt
cmake_minimum_required(VERSION 2.6)
set (SOURCES cpp1.cpp cpp2.cpp cpp1.def)
set (SHORT_CHANGESET "" CACHE STRING "Mercurial short changeset")
set (LONG_CHANGESET "" CACHE STRING "Mercurial long changeset")
add_library(HardwareInterface SHARED ${SOURCES})
add_definitions(/DSHORT_CHANGESET=${SHORT_CHANGESET} /DLONG_CHANGESET=${LONG_CHANGESET})
add_definitions(/MT)
Где-то в недрах cpp1.cpp SHORT_CHANGESET и LONG_CHANGESET используются.
Так вот, компилируется все это только при условии, что cmake запускается два раза - после первого запуска ошибки раскрывания макросов, а после второго - все ОК.
Я не автор кода, только собираю его. В чем причина такого поведения cmake?