【发布时间】:2022-01-05 20:06:25
【问题描述】:
我在我的项目中使用 CMake,我的项目的第三方库之一也是如此(为方便起见,包含在 add_subdirectory() 中)。我一直遇到奇怪的构建问题,我想我已经在第三方库的顶级 CMakeLists.txt 中将它们追踪到以下行:
set(CMAKE_DEBUG_POSTFIX "d" CACHE STRING "")
这会为我的整个项目设置CMAKE_DEBUG_POSTFIX(明确设置的任何子树除外),这会破坏我的构建。更糟糕的是,构建行为是依赖于顺序和时间的,在我的构建过程中,值会在干净构建之后更改,而不是在重建之后。 (追查很有趣。)
该库设置了许多名称以“XXXX_”开头的缓存变量,其中“XXXX”是库的名称。这对我来说很好,因为这些变量不太可能被其他人的代码使用。但是,当您的代码打算成为其他人项目的组件时,全局设置常用变量似乎是反社会的。它也很脆弱;如果我在顶级CMakeLists.txt 中使用set(XXXX <aValue>),那么库的set(XXXX CACHE...) 语句将被忽略。
相反,库应该只使用set(CMAKE_DEBUG_POSTFIX "d"),它为库的所有代码树设置变量,而不是其他人的。
这是库的构建代码中的错误吗?旨在成为优秀 CMake 公民的库是否应该避免使用 CACHE 变量,除非它们明确命名的私有变量除外?
【问题讨论】:
-
为什么不告诉我们那是什么库呢?通知该库的维护者。
-
"这是库构建代码中的错误吗?" - 要确定某些行为是否是项目的错误,需要了解项目的要求。最有可能的是,图书馆项目不打算作为子项目工作(通过
add_subdirectory)。因此,您以不受支持的方式使用它不是库的错误。 -
@KamilCuk 我故意不想关注图书馆本身,而是关注实践。如果这里的答案是“是的:这是不好的做法”,我会向他们提交拉取请求。
-
@Tsyvarev 非常正确。我已经澄清了我在问题中对
add_subdirectory()的使用。 (谢谢。) -
"相反,库应该只使用 set(CMAKE_DEBUG_POSTFIX "d"),它为库的所有代码树设置变量,而不是其他人的。"......不,他们不应该,因为那么当项目是顶级时,后缀不能被外部覆盖。