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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.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使用新版CMP0077(允许从变量设置选项)_Cmake - Fatal编程技术网

如何强制cmake使用新版CMP0077(允许从变量设置选项)

如何强制cmake使用新版CMP0077(允许从变量设置选项),cmake,Cmake,我正试图将Howard Hinnant的date库添加为我构建的子目录。以下是简单的设置: $ git clone https://github.com/HowardHinnant/date.git $ cat CMakeLists.txt cmake_minimum_required(VERSION 3.18) project(date_test) set(BUILD_TZ_LIB ON) set(USE_SYSTEM_TZ_DB ON) set(ENABLE_DATE_TESTING OF

我正试图将Howard Hinnant的
date
库添加为我构建的子目录。以下是简单的设置:

$ git clone https://github.com/HowardHinnant/date.git
$ cat CMakeLists.txt
cmake_minimum_required(VERSION 3.18)
project(date_test)

set(BUILD_TZ_LIB ON)
set(USE_SYSTEM_TZ_DB ON)
set(ENABLE_DATE_TESTING OFF)
add_subdirectory(date)
这里发生的事情不多。当我尝试使用cmake 3.18.3按原样配置此构建时,我得到了一系列输出,如:

CMake Warning (dev) at date/CMakeLists.txt:30 (option):
  Policy CMP0077 is not set: option() honors normal variables.  Run "cmake
  --help-policy CMP0077" for policy details.  Use the cmake_policy command to
  set the policy and suppress this warning.

  For compatibility with older versions of CMake, option is clearing the
  normal variable 'USE_SYSTEM_TZ_DB'.
This warning is for project developers.  Use -Wno-dev to suppress it.

CMake Warning (dev) at date/CMakeLists.txt:34 (option):
  Policy CMP0077 is not set: option() honors normal variables.  Run "cmake
  --help-policy CMP0077" for policy details.  Use the cmake_policy command to
  set the policy and suppress this warning.

  For compatibility with older versions of CMake, option is clearing the
  normal variable 'ENABLE_DATE_TESTING'.
This warning is for project developers.  Use -Wno-dev to suppress it.

CMake Warning (dev) at date/CMakeLists.txt:37 (option):
  Policy CMP0077 is not set: option() honors normal variables.  Run "cmake
  --help-policy CMP0077" for policy details.  Use the cmake_policy command to
  set the policy and suppress this warning.

  For compatibility with older versions of CMake, option is clearing the
  normal variable 'BUILD_TZ_LIB'.
This warning is for project developers.  Use -Wno-dev to suppress it.

# date: USE_SYSTEM_TZ_DB OFF
# date: MANUAL_TZ_DB OFF
# date: USE_TZ_DB_IN_DOT OFF
# date: BUILD_SHARED_LIBS OFF
# date: ENABLE_DATE_TESTING OFF
# date: DISABLE_STRING_VIEW OFF
值得注意的是,我的变量被忽略了(
USE\u SYSTEM\u TZ\u DB
OFF
,当我希望它是
ON
时)

如果我按照错误所述操作,并添加
cmake\u策略(设置CMP0077 NEW)
,则。。。我得到了完全一样的东西。关于策略的相同警告消息。同样忽略了我设置的变量


有没有办法设置这些变量并将它们传播到
日期
构建中,或者我必须将它们声明为
缓存内部
变量?

通过
设置设置该策略的默认值(CMAKE\u policy\u default\u CMP0077 NEW)
在调用将日期库添加到项目中的
add_子目录之前,可以解决此问题

据报道,

命令cmake_minimum_required(版本)和cmake_policy(版本),默认情况下,在给定版本取消设置后引入休假策略。将CMAKE\U POLICY\U DEFAULT\U CMP设置为OLD或NEW以指定策略CMP的默认值,其中是策略编号


当未设置
CMAKE_POLICY\u DEFAULT\u CMP0077
时,在日期库的
CMakeLists.txt
中调用
CMAKE_minimum\u required(3.7版)
将该策略的值重置为旧行为。如果CMake没有做到这一点,那么通过
FetchContent
或git子模块包含的子项目的构建可能很容易中断,如果父项目更新其CMakeLists.txt以要求更新版本。

根据文档,CMake 3.13中引入了,因此,默认情况下,3.13版或更高版本的任何
cmake\u minimum\u所需的调用都应启用该功能。似乎您的
date/CMakeLists.txt
使用较小的版本指定了
cmake\u所需的最小值。您需要更改该调用以使用较新版本,或者在该调用之后发出
cmake\u策略(SET CMP0077 NEW)
。但是
unset(BUILD\u TZ\u LIB)unset(BUILD\u TZ\u LIB CACHE)
然后
SET
it?@Tsyvarev我不控制
date
,date建议使用
FetchContent
来使用库。另一方面,这似乎很有趣:
cmake\u最低要求(3.7版)
:3.2不是最新的cmake版本吗?@Barry My bad。3.2 < 3.7 < 3.20. 我没有看到0。那个似乎有效。我不明白为什么,但我完全同意。@Barry我已经扩展了答案,解释了为什么它在以前不起作用的地方起作用。