Как выполнить пользовательскую команду в CMake с "незагрязненной" средой? - PullRequest
0 голосов
/ 09 октября 2019

Проблема: у меня есть add_custom_command, который вызывает внешний инструмент, который выполняет сборку некоторой внешней библиотеки с помощью gmake. Вывод gmake регистрируется в файле журнала.

CMake использует Makefile Unix в качестве цели генератора и устанавливает $(VERBOSE).SILENT. Эта опция каким-то образом наследуется gmake (возможно, через MAKEFLAGS), вызванным из инструмента, который был выполнен в файле верхнего уровня make, сгенерированном из add_custom_command. В результате файл журнала не содержит никакой полезной информации.

Это не идеально - используемый генератор CMake и его внутренние параметры случайно попали в мой внешний инструмент. Есть ли способ предотвратить это?

Вот код в CMakeLists, чтобы лучше проиллюстрировать проблему:

...
add_custom_command(OUTPUT "<some target name>"
                   COMMAND ${BUILDTOOL_COMMAND} # i.e. buildtool <buildtool args>
                   VERBATIM)
...

Для чего CMake генерирует файл build.make со следующими данными:

...
# Suppress display of executed commands.
$(VERBOSE).SILENT:

...

<some target name>: 
    buildtool <buildtool args>
...

Ответы [ 2 ]

0 голосов
/ 17 октября 2019

Передача VERBOSE=1 в субмарку не имеет никакого эффекта. Если ваша пользовательская команда имеет значение make любого типа, она получит установку без вывода сообщений через MAKEFLAGS из верхнего файла Makefile (сгенерированного cmake). Можно избавиться от --silent, явно настроив MAKEFLAGS перед вызовом make, то есть:

$ cat Makefile
all:
        env -i MAKEFLAGS=$(subst s,,$(MAKEFLAGS)) make -f Makefile2

$(VERBOSE).SILENT:
$ cat Makefile2
all:
        echo "In Makefile2: $@"
        echo "MAKEFLAGS = $(MAKEFLAGS)"

Выход (-k предназначен только для проверки того, что только -sфлаг убирается):

$ make -k
echo "In Makefile2: all"
In Makefile2: all
echo "MAKEFLAGS = k"
MAKEFLAGS = k

Обратите внимание, что верхний уровень Makefile все еще молчит, а подфайл печатается как обычно.

Вы можете попытаться обновить COMMANDadd_custom_command соответственно. Рабочий пример:

$ cat CMakeLists.txt
add_custom_command(
    OUTPUT bar
    COMMAND env "MAKEFLAGS=$(subst s,,$(MAKEFLAGS))" make -f ../Makefile2
    VERBATIM
    )

add_custom_target(foo DEPENDS bar)

Вывод:

$ cmake .
...
$ make foo
[100%] Generating bar
make[4]: Entering directory '/path/to/dir'
echo "In Makefile2: all"
In Makefile2: all
echo "MAKEFLAGS = w"
MAKEFLAGS = w
make[4]: Leaving directory '/path/to/dir'
[100%] Built target foo
0 голосов
/ 09 октября 2019

Итак, вероятно, здесь происходит то, что значение переменной VERBOSE экспортируется в дочернюю среду, включая ваш "buildtool" (что бы это ни было). И ваши make-файлы, которые вызываются buildtool , также используют эту же переменную для управления подробным выводом, поэтому установка переменной VERBOSE в CMake вызывает такую ​​же настройку многословия в make-файлах, вызываемых buildtool.

Я ничего не знаю о "buildtool", поэтому я понятия не имею, какой ресурс вы можете использовать для исправления этого.

Если вы вызывали make напрямую, вы можете просто переопределить его в командной строке, что-то вроде:

add_custom_command(OUTPUT "<some target name>"
                   COMMAND make VERBOSE=1
                   VERBATIM)

для принудительного VERBOSE=1 независимо от настроек среды.

Вы должны выяснить, как сделать аналогичную вещь с "buildtool", который я ожидаю. Возможно, это сработает, если «buildtool» перенаправит переменные в make.

...