簡體   English   中英

如何在“未污染”環境下在 CMake 中執行自定義命令?

[英]How to execute custom command in CMake with "unpolluted" environment?

問題:我有一個add_custom_command調用一個外部工具,該工具通過gmake構建一些外部庫。 gmake output 被記錄到日志文件中。

CMake 使用 Unix Makefiles 作為生成器目標,並設置$(VERBOSE).SILENT 這個選項以某種方式被 gmake 繼承(可能通過MAKEFLAGS )從工具中調用,該工具在從add_custom_command生成的頂級 make 文件中執行。 因此,日志文件不包含任何有用的信息。

這並不理想 - 使用的 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>
...

所以,這里可能發生的事情是VERBOSE變量的值被導出到孩子的環境,包括你的“buildtool”(不管是什么)。 而且,由 buildtool 調用的 makefile使用相同的變量來控制詳細 output,因此 CMake 中的VERBOSE變量的設置導致在調用 buildtool 的 makefile 中設置相同的詳細程度。

我對“buildtool”一無所知,所以我不知道你可能有什么辦法來解決這個問題。

如果您直接調用 make 那么您可以在命令行上覆蓋它,例如:

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

無論環境設置如何,都強制VERBOSE=1

你必須弄清楚如何用我期望的“buildtool”做類似的事情。 如果“buildtool”將變量設置轉發到make ,也許它會這樣做。

VERBOSE=1傳遞給 sub-make 無效。 當您的自定義命令是make類型的時,它將通過MAKEFLAGS從頂部 Makefile(由cmake生成的那個)接收其靜默設置。 可以通過在調用make之前顯式設置MAKEFLAGS來擺脫--silent ,即:

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

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

Output ( -k僅用於檢查是否僅剝離了-s標志):

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

請注意,頂級Makefile仍然保持沉默,而子 makefile 照常打印。

您可以嘗試相應地更新您的add_custom_command 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)

Output:

$ 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM