Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Makefile 如何在CMake中使用“执行自定义命令”;“未受污染”;环境_Makefile_Cmake_Gnu Make - Fatal编程技术网

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