如何强制cmake使用新版CMP0077(允许从变量设置选项)
我正试图将Howard Hinnant的如何强制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
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我已经扩展了答案,解释了为什么它在以前不起作用的地方起作用。