LINUX.ORG.RU

CMake не понимаю почему

 ,


0

2

Добрый день!

Есть такой 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?

Ответ на: комментарий от pon4ik

И логировал, и док читал.

Убрал в родительском файле add_compile_definitions, добавил их во вложенной директории. Переменные имеют правильное значение, а компиляция идет только после второго вызова cmake.

braboar ()