2015-04-07 3 views
2

Я добавляю компонент, построенный с помощью CMake, в более крупный проект, который в настоящее время использует make-файлы. Существует один «конфигурационный» make-файл, который содержит некоторую логику, которая, среди прочего, устанавливает целевые каталоги в форме make-переменных. В конфигурации Makefiles включена в текущей сборке, установив окр вар MAKEFILES и фактические сборки Makefiles ссылки на эти varaibles при создании и ссылки на артефакты в этих каталогах, так, например:Использовать переменные makefile в сценарии CMake

# in config.mk 
... 
MY_TARGET_LIB_DIR=... 

# in a build makefile 
TGT_LIB=$(MY_TARGET_LIB_DIR)/libsomething.so 

# in another build makefile 
LDFLAGS=-L$(MY_TARGET_LIB_DIR) 

То, что я хотел бы сделать использует это в make-файлах, сгенерированных CMake, т. е. CMake генерирует мне make-файл, который создает библиотеку (статический в этом случае) в каталоге, на который ссылается переменная MY_TARGET_LIB_DIR, а другая, которая ссылается на библиотеку в этом каталоге.

Я пытался сделать что-то вроде

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY $(MY_TARGET_LIB_DIR)) 

но не повезло - это только не вызывает Makefile генерироваться для вывода в подкаталог буквально под названием $(MY_TARGET_LIB_DIR). Есть ли решение для этого?

ответ

0

Нет, вы не можете сообщить, что Makefile, созданный с помощью CMake, использовать переменные из других Make-файлов, отличных от CMake. Они также не могут анализировать переданные аргументы из оболочки.

Вы можете передавать переменные во время настройки на cmake -D<variable>=<value>, вот и все. Но обычно вы не хотите настраивать во время make-прогона.

+0

Вы, кажется, неправильно поняли мой вопрос - я не пытаюсь разбирать любые аргументы, переданные из оболочки. То, что я пытаюсь сделать, это использовать varaible, определенный в существующем make-файле, возможно, имея буквальную, неэкранированную строку '$ (variable_name)' в файле makefile, сгенерированном CMake. Передача значения через -D может быть решением, но как бы получить значение переменной? Должен ли я запускать CMake из make-файла для создания другого make-файла? – AndrzejJ

+0

У меня вопрос, мой ответ был слишком коротким. С помощью -D вы можете просто использовать переменную, чтобы понять ваши файлы CMake. Но в целом вы не хотите запускать cmake (который настроен) для каждого запуска сборки. – usr1234567

+0

Я знаю о -D, но мне нужно значение varaible, чтобы установить его, не так ли? Проблема в том, что я запускаю CMake из оболочки, и у меня нет значения оттуда - это переменная makefile, поэтому (если я не пропущу что-то), ее значение доступно только при запуске make (путем включения config.mk из моего примера). – AndrzejJ

1

Это довольно легко сделать с помощью ${ENV[...]}, так как Сделать автоматический экспорт всех переменных в окружающую среду.

Пример:

[ttt] cat CMakeLists.txt 
cmake_minimum_required(VERSION 3.0) 
project(ttt) 

add_custom_target(t 
    COMMAND echo `printenv ZZZZ`... 
    #VERBATIM 
    ) 

Итак, мы можем изменить ZZZZпосле на этапе генерации, в make время:.

[ttt] cmake . 
-- Configuring done 
-- Generating done 
-- Build files have been written to: /tmp/ttt 
[ttt] 
[ttt] 
[ttt] make ZZZZ=foobar t 
foobar... 
Built target t 
[ttt] ZZZZ=buzzquux make t 
buzzquux... 
Built target t 
[ttt] 
[ttt] 
[ttt] export ZZZZ=bbb 
[ttt] make t 
bbb... 
Built target t 

Это поучительно проверить сгенерированные мейкфайлы (особенно, когда все пошло не так):

[ttt] grep -C2 ZZZZ CMakeFiles/t.dir/build.make 

CMakeFiles/t: 
    echo `printenv ZZZZ`... 

t : CMakeFiles/t