cmake add_error在$(CMAKE_SOURCE_error)上失败

i5desfxk  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(101)

我使用git子模块管理我的依赖项,并使用cmake构建我的项目。到目前为止,这对所有依赖项都很好,除了一个(WebKit,我需要从源代码中获取它,因为我必须更改它的某些部分)。该项目使用“CMAKE_SOURCE_BLOG”,.到处都是,这导致父项目的SOURCE_BLOG,因此,cmake在配置阶段失败。
有没有更好的方法来将更大更复杂的项目包含在父cmake项目中?我希望有一种方法可以更好地封装子项目,这样这些问题就不会再出现了。

fcg9iug3

fcg9iug31#

我认为在WebKit中使用CMAKE_SOURCE_DIR是一个bug。他们应该使用PROJECT_SOURCE_DIR。请参阅Fraser对more details的回答。
您可以尝试在 checkout 后、运行CMake之前修补WebKit的代码。
另外,你可以开一个问题来要求开发者改进,或者更好的方法是创建一个pull request。

gfttwv5a

gfttwv5a2#

有没有更好的方法来将更大更复杂的项目包含在父cmake项目中?我希望有一种方法可以更好地封装子项目,这样这些问题就不会再出现了。
注:这个问题有点开放式,所以我会在这里漫谈一下。
你可以像上面指出的那样修补Webkit的代码。这是一个很好的/有效的建议。但是它确实让我认为Webkit设计了他们的项目通过package manager安装和使用。他们没有考虑项目被add_subdirectory使用。通常当我在流行的项目中看到CMAKE_SOURCE_DIR时,情况就是这样。
这是一个库的选择。不是所有的库都被设计为通过add_subdirectory使用。事实上,相当多的库只打算是installed,然后是found。这取决于库维护人员来决定他们想要支持什么。
我个人认为,使用大型复杂项目的最佳方式是使用像vcpkgconan等包管理器。
它使得处理像boost这样的更大的依赖关系变得非常棒。这对你的项目来说是绝对关键的。
注意事项:我对vcpkg有一点偏爱,因为我对它有贡献,并使它在使用boost,openssl等的封闭源代码生产环境中工作。
它会一次性构建你的依赖项。然后你就可以用find_package找到它们。更好的是它提供了二进制缓存。当你有大量的依赖项时,这对构建性能来说是非常棒的(特别是在没有ccache的Windows上)。
包管理器的好处是,一般来说,它使您不必太关心您正在吸收的CMake代码的质量。

# vcpkg does this all under the hood for you
cd webkit
cmake -S . B build ...
cmake --build build ...
cmake --install build ...

字符串
包管理器透明地为您处理所有这些。
既然你只关心已安装的文件(公共头文件、库文件等),那么你所需要的就是:

# NOTE: This is just an example. I'm not familiar with Webkit.

# NOTE: The library must add packaging support for this to work nicely!
# https://cmake.org/cmake/help/latest/guide/importing-exporting/index.html
find_package(WebKit CONFIG)

# Ready to use libraries
target_link_libraries(foobar PRIVATE WebKit::foobar)


你已经准备好出发了。
像vcpkg这样的工具更好的一点是,它可以很好地处理不支持CMake的项目。
例如,Make仍然很受欢迎。
它将在幕后执行以下操作

cd make_project
make ...
make install ...


在这种情况下,您可以通过CMake的其他find功能找到所需的文件。

find_file(...

find_library(...

etc.


add_subdirectory有它的优点(易于使用)和缺点(难以处理大项目)find_package有它的优点(性能/更干净的CMake代码)和缺点(需要包管理器,更多的初始设置,需要学习另一个工具)
这取决于你的项目,但就我个人而言,我一直喜欢使用包管理器来提高构建性能。
注意:如果需要的话,你也可以将两种方法合并结合起来。天空是极限。每个人都有自己的情况。
第二个注意事项:还有其他的解决方案,如FetchContent和CPM。我已经使用过它们,目前仍然喜欢vcpkg。

相关问题