Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.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
如何捕获CMake命令行参数?_Cmake - Fatal编程技术网

如何捕获CMake命令行参数?

如何捕获CMake命令行参数?,cmake,Cmake,我想在生成的脚本中记录传递给cmake的参数。例如,“my config.in”将由cmake处理,其定义如下: config=“@CMAKE_ARGS@” 在cmake之后,my config将包含一行内容如下: config=“-DLINUX-DUSE\u FOO=y-DCMAKE\u INSTALL\u PREFIX=/usr” 我尝试了CMAKE_参数,CMAKE_选项,但失败了。没有文件提到这一点-(我不知道有任何变量提供此信息,但您可以自己生成它(附带一些限制条件) 传递给CMake

我想在生成的脚本中记录传递给cmake的参数。例如,“my config.in”将由cmake处理,其定义如下:

config=“@CMAKE_ARGS@”

cmake
之后,
my config
将包含一行内容如下:

config=“-DLINUX-DUSE\u FOO=y-DCMAKE\u INSTALL\u PREFIX=/usr”


我尝试了
CMAKE_参数
CMAKE_选项
,但失败了。没有文件提到这一点-(

我不知道有任何变量提供此信息,但您可以自己生成它(附带一些限制条件)

传递给CMake的任何
-D
参数都会添加到构建目录中的缓存文件
CMakeCache.txt
,并在后续调用过程中重新应用,而无需再次在命令行上指定

因此,在您的示例中,如果您首先按照

cmake ../.. -DCMAKE_INSTALL_PREFIX:PATH=/usr
然后,您会发现接下来的运行非常简单

cmake .
仍将
CMAKE\u INSTALL\u前缀设置为
/usr


如果您要从
CMAKE_ARGS
中查找的是命令行上从每次调用CMAKE中定义的变量的完整列表,那么下面应该可以做到这一点:

get_cmake_property(CACHE_VARS CACHE_VARIABLES)
foreach(CACHE_VAR ${CACHE_VARS})
  get_property(CACHE_VAR_HELPSTRING CACHE ${CACHE_VAR} PROPERTY HELPSTRING)
  if(CACHE_VAR_HELPSTRING STREQUAL "No help, variable specified on the command line.")
    get_property(CACHE_VAR_TYPE CACHE ${CACHE_VAR} PROPERTY TYPE)
    if(CACHE_VAR_TYPE STREQUAL "UNINITIALIZED")
      set(CACHE_VAR_TYPE)
    else()
      set(CACHE_VAR_TYPE :${CACHE_VAR_TYPE})
    endif()
    set(CMAKE_ARGS "${CMAKE_ARGS} -D${CACHE_VAR}${CACHE_VAR_TYPE}=\"${${CACHE_VAR}}\"")
  endif()
endforeach()
message("CMAKE_ARGS: ${CMAKE_ARGS}")
这有点脆弱,因为它取决于这样一个事实:通过命令行设置的每个变量都有短语“无帮助,在命令行上指定了变量”指定为其
HELPSTRING
属性。如果CMake更改此默认值
HELPSTRING
,则必须相应地更新
If
语句



如果这不是您想要显示的内容,而是当前执行的参数,那么我认为除了破解CMAKE的源代码之外,没有其他方法可以做到这一点!但是,我希望这不是您想要的,因为以前的所有命令行参数每次都会有效地被应用。

tore CMake命令行参数是一个名为
~/bin/CMake
(***1)的包装器脚本,它有两个功能:

  • 创建存储命令行参数的
    /cmake\u call.sh
  • 使用命令行参数调用real
    cmake
    可执行文件
~/bin/cmake
#代码如下所示

!/usr/bin/env bash
#
#将此文件放入以下位置:~/bin/cmake
#(具有可执行权限)
#
#这是cmake的包装纸!
#*它调用cmake——请参见脚本的最后一行
#它还:
#*在当前目录(构建目录)中创建文件cmake_call.sh
#它存储带有所有cmake标志的cmake调用等。
#(它还存储对cmake的连续调用,以便您可以跟踪所有cmake调用)
#
#您只需使用:./cmake_call.sh!!!!!!!!!重新调用最后一条cmake命令行即可!!!!!!!!!!
#
#未创建cmake_call.sh
#调用cmake时不带任何标志,
#或者当使用--help,-E,-P等标志调用它时(请参阅非存储参数--您可能需要修改它以满足您的需要)
SCRIPT_PATH=$(readlink-f“$BASH_SOURCE”)
SCRIPT\u DIR=$(dirname“$SCRIPT\u PATH”)
#http://stackoverflow.com/a/13864829
如果[-z${SUDO_USER+x}];那么
#变量SUDO_用户未设置
user=$user
其他的
用户=$SUDO\u用户
fi
#http://stackoverflow.com/a/34621068
path_append(){path_remove$1$2;export$1=“${!1}:$2”;}
path_prepend(){path_remove$1$2;export$1=“$2:${!1}”}
路径_remove(){export$1=“`echo-n${!1}| awk-v RS=:-v ORS=:'$1!=“$2'”| sed's/:$/'”;}
path_remove path~/bin#调用cmake时(在此脚本底部),不要再次调用此脚本!
#在没有参数的情况下调用时,不要创建cmake_call.sh
如果[[-z“$@]”;则
cmake“$@”
出口
fi
#变量NON_STORE_参数存储标志,如果存在,将导致不创建cmake_call.sh
read-r-d''非存储参数$(pwd)/cmake\u call.sh
echo“echo cmake\”\$ARGS\”>$(pwd)/cmake\u call.sh
echo“eval cmake\”\$ARGS\”>$(pwd)/cmake\u call.sh
#echo“eval which cmake”>$(pwd)/cmake_call.sh
chmod+x$(pwd)/cmake_call.sh
chown$user:$(pwd)/cmake_call.sh
cmake“$@”
用法:

mkdir构建
光盘制作
cmake-DCMAKE\u BUILD\u TYPE=Debug-DCMAKE\u INSTALL\u PREFIX=$(pwd)/INSTALL。。
这将创建具有以下内容的
cmake_call.sh

!/usr/bin/env bash
#http://stackoverflow.com/a/34621068
路径_remove(){export$1=“`echo-n${!1}| awk-v RS=:-v ORS=:'$1!=“$2'”| sed's/:$/'”;}
path_remove path~/bin#调用cmake时(在这个脚本的底部),不要调用~/bin/cmake,而是真正的cmake!
ARGS='“-DCMAKE\u BUILD\u TYPE=Debug”“-DCMAKE\u INSTALL\u PREFIX=$(pwd)/INSTALL”“…”
echo cmake“$ARGS”
评估cmake“$ARGS”
最后第三行存储cmake参数。 现在,您只需调用以下命令即可重新调用所使用的确切命令行:

/cmake\u call.sh
脚注:


(***1)
~/bin/cmake
通常位于路径中,因为
~/.profile
。在第一次创建
~/bin/cmake
时,可能需要注销并重新登录。profile可以看到
~/bin
实现相同目标的一种非常特定于Linux的方法:

if(${CMAKE_SYSTEM_NAME} STREQUAL Linux)
    file(STRINGS /proc/self/status _cmake_process_status)

    # Grab the PID of the parent process
    string(REGEX MATCH "PPid:[ \t]*([0-9]*)" _ ${_cmake_process_status})

    # Grab the absolute path of the parent process
    file(READ_SYMLINK /proc/${CMAKE_MATCH_1}/exe _cmake_parent_process_path)

    # Compute CMake arguments only if CMake was not invoked by the native build
    # system, to avoid dropping user specified options on re-triggers.
    if(NOT ${_cmake_parent_process_path} STREQUAL ${CMAKE_MAKE_PROGRAM})
        execute_process(COMMAND bash -c "tr '\\0' ' ' < /proc/$PPID/cmdline"
                        OUTPUT_VARIABLE _cmake_args)

        string(STRIP "${_cmake_args}" _cmake_args)

        set(CMAKE_ARGS "${_cmake_args}"
            CACHE STRING "CMake command line args (set by end user)" FORCE)
    endif()
    message(STATUS "User Specified CMake Arguments: ${CMAKE_ARGS}")
endif()
if(${CMAKE\u SYSTEM\u NAME}STREQUAL Linux)
文件(STRINGS/proc/self/status\u cmake\u process\u status)
#获取父进程的PID
字符串(正则表达式匹配“PPid:[\t]*([0-9]*)”。${{u cmake\u process\u status})
#获取父进程的绝对路径
文件(读取\u SYMLINK/proc/${CMAKE\u MATCH\u 1}/exe\CMAKE\u parent\u process\u path)
#仅当本机生成未调用CMake时计算CMake参数
#系统,以避免在重新触发器上删除用户指定的选项。
if(非${cmake\U parent\U process\U path}STREQUAL${cmake\U MAKE\U PROGRAM})
执行进程(命令bash-c“tr'\\0'