cmake 如何强制覆盖find_package()

6tqwzwtp  于 2023-03-23  发布在  其他
关注(0)|答案(1)|浏览(161)

我想用Brotli的自定义版本来构建curl,但我不知道该怎么做。
我试着写一个FindBrotli.cmake,但是curl自带了它,覆盖了CMAKE_MODULE_PATH,所以我的永远不会被使用。目前我擦除curl的FindBrotli.cmake文件,但是这不是一个可以接受的解决方案,有时我不想重载FindBrotli.cmake

mzaanser

mzaanser1#

CMake有多种模式来查找find_package()的依赖关系。默认的 module 模式在某些地方查找Find*.cmake文件,config 模式查找*Config.cmake文件,到目前为止,我看到的基本上是带有一些自动化的模块变体,因此参数处理是无用的。在我的例子中,我创建了一个目录,并在其中创建了BrotliConfig.cmake,内容如下:

if (NOT BROTLI_FOUND) # Necessary because the file may be invoked multiple times
    message(NOTICE "Using injected BrotliConfig.cmake")
    set(BROTLI_INCLUDE_DIRS "...")
    set(BROTLI_LIBRARIES "...")
    # Not done in my case but you can use this to create a target
    add_library(BROTLI::BROTLI UNKNOWN IMPORTED)
    set_target_properties(BROTLI::BROTLI PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${BROTLI_INCLUDE_DIRS}" IMPORTED_LOCATION "...")
endif()

然后告诉CMake使用我的配置,我在命令行上设置:

我认为所有的-DPackageName_ROOT=/path/to/...都可以被一个CMake选项替换,但我不是CMakeMaven,目前的解决方案让我满意。

相关问题