cmake 如何有选择地启用或禁用-Werror参数在我的项目中的整个目录?

niknxzdl  于 2022-11-11  发布在  其他
关注(0)|答案(1)|浏览(397)

我有一个项目,我想使用-Werror,让我们把它的目录命名为proj。在proj/external中有一个目录,这是一个例外,所以我不想使用-Werror
有没有办法为cmake中的整个目录创建一个异常,以便使用或不使用编译器参数?

lf5gs5x2

lf5gs5x21#

CMake 2.34+方案

如果项目所需的最低CMake版本等于或高于v3.24,则可以使用the CMAKE_COMPILE_WARNING_AS_ERROR variable
此变量用于初始化所有目标上的COMPILE_WARNING_AS_ERROR属性。
因此,只需在每个变量作用域的顶部将变量设置为所需的值,您希望在该作用域中使用特定的值。CMake非缓存变量的作用域为目录和函数。
对于外部项目的变量作用域的特定情况,* 如果您使用add_subdirectory * 添加它,我假设您不希望触及外部项目的CMakeLists.txt文件,因此您可以使用函数 Package 对add_subdirectory的调用,并在函数内设置变量,然后调用函数。
此方法有几个优点:

  • 跨平台,样板文件更少:不再显式编写生成器表达式来为每个编译器使用正确的标志。
  • 允许使用者覆写:并不是所有的用户都希望在构建时将警告作为错误。这个新特性附带了一个--compile-no-warning-as-error命令行标志,当dev在CMakeLists.txt文件中设置该变量/target-property时,用户可以使用该标志来禁用该变量的任何效果。

3.24之前版本的解决方案:如果通过add_subdirectoryFetchContent添加外部目录

proj子目录下的CMakeLists.txt文件中,执行以下操作


# add `-Werror` to the current directory's `COMPILE_OPTIONS`

add_compile_options(-Werror)

# retrieve a copy of the current directory's `COMPILE_OPTIONS`

get_directory_property(old_dir_compile_options COMPILE_OPTIONS)

# modify the actual value of the current directory's `COMPILE_OPTIONS` (copy from above line remains unchanged). subdirectories inherit a copy of their parent's `COMPILE_OPTIONS` at the time the subdirectory is processed.

add_compile_options(-Wno-error)

# add you subdirectory (whichever way you do it)

# add_subdirectory(external ...)

# FetchContent_MakeAvailable(...)

# restore the current directory's old `COMPILE_OPTIONS`

set_directory_properties(PROPERTIES COMPILE_OPTIONS "${old_dir_compile_options}")

文件:

如果通过ExternalProject_Add添加

您可能不需要做任何事情,除非外部项目本身正在添加-Werror,在这种情况下,我不知道您是否可以对此做任何事情。

强制性警告/备注:

  • -Werror是gcc和friends(clang等)的标志。如果你想支持MSVC,你需要通过if(...)或生成器表达式来放置保护。
  • 是否使用-Werror并不是没有争议的。如果您希望支持其他用户使用您的项目,并且希望满足争论的双方,请使用某种机制来保护CMake选项后面的这些配置行,或者将它们隔离到您的本地版本中。

相关问题