LINUX.ORG.RU

[cmake] Передать переменную вверх


0

0

Есть проект. Сейчас в нём два CMakeLists'а. Первый в корне проекта выполняет проверки и подключает папку с исходниками, второй в корне дерева исходников собирает статическую библиотеку. Появилась необходимость в случае провала одной из проверок подцепить ещё одну папку с исходниками вне дерева. Как бы это сделать? Теоретически можно набить все эти пути в первый CMakeLists, но это как-то неопрятно.

★★★★★

Первый в корне проекта выполняет проверки.... Появилась необходимость в случае провала одной из проверок подцепить ещё одну папку с исходниками вне дерева.

я вас не понял =)

Передать переменную вверх

зачем тогда это?

может вы имели ввиду нечто вроде этого?

./CMakeLists.txt

....
add_subdirectory (test1)
....
message(STATUS "типа проверка : ${bugaga}")
./test1/CMakeLists.txt
...
add_subdirectory(test2)
....
./test1/test2/CMakeLists.txt
...
option(bugaga "test")
set (bugaga "12345 test" CACHE STRING "test" FORCE)
...
тут происходит передача значения через CACHE

dhampire ★★★ ()
Ответ на: комментарий от dhampire

> может вы имели ввиду нечто вроде этого?

Конечно это. Что тут ещё можно было иметь в виду?
Я бы посоветовал ТС написать модулей для cmake, для проверки нужных зависимостей, чтоб не получалось, что внезапно что-то не собралось.

GArik ★★★ ()
Ответ на: комментарий от dhampire
.
|-- 3rdparty
|   |-- some.cpp
|   `-- some.h
|-- CMakeLists.txt
`-- src
    |-- CMakeLists.txt
    |-- some_my.cpp
    `-- some_my.h

Нужно передать в src/CMakeLists.txt как минимум список абсолютных путей до cpp-файлов в 3rdparty. При этом этот список может изменяться и следить за этими изменениями лень.

KblCb ★★★★★ ()
Ответ на: комментарий от KblCb
. 
|-- 3rdparty 
|   |-- some.cpp 
|   `-- some.h 
|-- _CMakeLists.txt_
`-- src 
    |-- *CMakeLists.txt* 
    |-- some_my.cpp 
    `-- some_my.h

_CMakeLists.txt_

....
option (spisok_up "spisok cpp in 3rdparty")
aux_source_directory(${PROJECT_SOURCE_DIR}/3rdparty spisok)
set (spisok_up "${spisok}" CACHE STRING "test" FORCE)
....
или

*CMakeLists.txt*

....
option (spisok_up "spisok cpp in 3rdparty")
aux_source_directory(${PROJECT_SOURCE_DIR}/../3rdparty spisok)
set (spisok_up "${spisok}" CACHE STRING "test" FORCE)
....

будет список cpp в папке 3rdparty, переменная содержащая этот список будет доступна во всем проекте.

dhampire ★★★ ()
Ответ на: комментарий от KblCb

А в чём смысл CACHE?

файлик CMakeCache.txt в верхней дире исходников. туда «кэшируются» переменные.

можно было ещё сделать так MARK_AS_ADVANCED(var1 var2)

dhampire ★★★ ()

А man на что ?

 set    Set a CMAKE variable to a given value.

          set(<variable> <value>
              [[CACHE <type> <docstring> [FORCE]] | PARENT_SCOPE])

........

       If PARENT_SCOPE is present, the variable will be set in the scope above the current scope. Each new directory or function
       creates a new scope. This command will set the value of a variable into the parent directory or calling function  (which?
       ever is applicable to the case at hand).

Reset ★★★★★ ()

Несколько способов.

1. Записать в кеш

set( my_variable my_value CACHE STRING "" )

Такая переменная будет видна не только в родительской директории, но и во всех остальных тоже, так что её имя должно быть уникальным. Кроме того её можно будет отредактировать руками, поэтому рекомендуется при завершении скрипта из кеша её очистить:

unset( my_variable CACHE )

2. Толкнуть переменную на один уровень видимости выше:

set( my_variable my_value PARENT_SCOPE )

Работает только на один уровень вложености. Если нужно поднять её ещё выше - в родительской области видимости нужно делать примерно такой хак:

set( my_variable "${my_variable}" PARENT_SCOPE )

Ещё желательно проверять есть ли вообще родительская области видимости, иначе CMake ругается:

if ( "${CMAKE_PARENT_LIST_FILE}" )
    set( my_variable my_value PARENT_SCOPE )
endif()
Dendy ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.