Makefile 如何在CMake中使用“执行自定义命令”;“未受污染”;环境
问题: 我有一个Makefile 如何在CMake中使用“执行自定义命令”;“未受污染”;环境,makefile,cmake,gnu-make,Makefile,Cmake,Gnu Make,问题: 我有一个add\u custom\u命令,它调用一个外部工具,通过gmake构建一些外部库。gmake输出被记录到日志文件中 CMake使用Unix Makefiles作为生成器目标,并设置$(VERBOSE).SILENT。 该选项以某种方式被gmake继承(可能通过MAKEFLAGS)调用,该工具是在由add\u custom\u命令生成的顶级make文件中执行的。因此,日志文件不包含任何有用的信息 这不是理想的使用CMake生成器,它的内部选项无意中泄漏到我的外部工具中。有什么方法
add\u custom\u命令
,它调用一个外部工具,通过gmake
构建一些外部库。gmake输出被记录到日志文件中
CMake使用Unix Makefiles作为生成器目标,并设置$(VERBOSE).SILENT
。
该选项以某种方式被gmake继承(可能通过MAKEFLAGS
)调用,该工具是在由add\u custom\u命令
生成的顶级make文件中执行的。因此,日志文件不包含任何有用的信息
这不是理想的使用CMake生成器,它的内部选项无意中泄漏到我的外部工具中。有什么方法可以防止这种情况吗
以下是CMakeLists中的代码,以更好地说明问题:
...
add_custom_command(OUTPUT "<some target name>"
COMMAND ${BUILDTOOL_COMMAND} # i.e. buildtool <buildtool args>
VERBATIM)
...
因此,这里可能发生的情况是,
VERBOSE
变量的值被导出到子环境中,包括您的“buildtool”(不管是什么)。而且,buildtool调用的makefiles也使用相同的变量来控制详细输出,因此CMake中verbose
变量的设置会导致buildtool调用的makefiles中的详细设置相同
我对“buildtool”一窍不通,所以我不知道你有什么办法来解决这个问题
如果您直接调用make,则可以在命令行上覆盖它,例如:
add_custom_command(OUTPUT "<some target name>"
COMMAND make VERBOSE=1
VERBATIM)
添加自定义命令(输出“”
命令make VERBOSE=1
(逐字记录)
无论环境设置如何,强制VERBOSE=1
你必须弄清楚如何使用我期望的“buildtool”来做类似的事情。如果“buildtool”将变量设置转发给
make
将VERBOSE=1
传递给sub-make没有任何效果,那么可能就可以这样做了。当自定义命令为任何类型的make
时,它将通过顶部Makefile(由cmake
生成的文件)中的MAKEFLAGS
接收其静默设置。通过在调用make
之前显式设置MAKEFLAGS
,可以摆脱--silent
,即:
$ cat Makefile
all:
env -i MAKEFLAGS=$(subst s,,$(MAKEFLAGS)) make -f Makefile2
$(VERBOSE).SILENT:
输出(-k
仅用于检查是否仅剥离了-s
标志):
请注意,顶级的Makefile
仍然是静默的,而子Makefile照常打印
您可以尝试相应地更新的命令
。工作示例:
$ 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
能否提供此自定义命令的示例?您是否尝试通过在自定义命令中传递附加参数来修改传递给gmake
的MAKEFLAGS
?@squareskittles它只调用一个可执行文件/脚本,后者调用外部库的gmake,例如buildtool
。它没有办法指定MAKEFLAGS(除了通过env变量之外,这里似乎是这样)。您能解释一下set$(详细)。SILENT
?如何设置?为了什么?这会以何种方式影响子make makefiles?当你说“日志文件不包含任何有用的信息”时,如果你直接调用它,它会包含什么信息,而当你通过cmake规则调用它时,它会丢失什么信息?当你可以发布代码(几行)时,为什么要解释代码做什么和不做什么?这将消除许多澄清问题,我不知道。这正是CMake在Makefiles中生成的内容:#抑制已执行命令的显示$(详细)。无提示:
。似乎这个目标足以触发静默模式。
$ make -k
echo "In Makefile2: all"
In Makefile2: all
echo "MAKEFLAGS = k"
MAKEFLAGS = k
$ 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