强制find_library再次搜索

时间:2014-03-23 15:07:32

标签: cmake

在我的CMake脚本中,我必须链接一个可以有两个不同名称的库,具体取决于缓存变量。

库可以是libMyLibrary.a或libMyLibraryCUDA.a,具体取决于CUDA_BACKEND是设置为ON还是OFF。 CUDA_BACKEND是缓存变量。两个库都在同一目录中,其路径在变量MYLIBRARY_ABSOLUTE_PATH中存储(在用户输入之后)。

if ( CUDA_BACKEND )
    set ( MYLIBRARY_NAME "MyLibraryCUDA" )
else ( CUDA_BACKEND )
    set ( MYLIBRARY_NAME "MyLibrary" )
endif ( CUDA_BACKEND )

find_library ( MYLIBRARY_LIBRARY
    NAMES "${MYLIBRARY_NAME}"
    PATHS "${MYLIBRARY_ABSOLUTE_PATH}/lib"
)

如果用户更改CUDA_BACKEND的值并运行cmake,则find_library不会再次运行,因为变量MYLIBRARY_LIBRARY包含有效路径(在the documentation之后):

  

一旦其中一个调用成功,结果变量将被设置并存储在缓存中,这样就不会再搜索任何调用。

所以,我的问题是:强制find_library再次搜索库的最简洁方法是CUDA_BACKEND更改的价值是什么?

1 个答案:

答案 0 :(得分:3)

经过一些测试后我可以提供的一个解决方案是在调用MYLIBRARY_LIBRARY之前手动将变量MYLIBRARY_LIBRARY-NOTFOUND设置为find_library

如果您希望仅在自上次配置后情况发生变化时才实际执行find_library(在这种情况下仅在用户更改CUDA_BACKEND时),您可以记录设置的最后状态并检查他们是否改变了下一个代码没有经过测试,但应该可以工作:

# Where CUDA_BACKEND is set
set (CUDA_BACKEND "OFF" CACHE STRING "Whether to use CUDA")
if ("${CUDA_BACKEND}" STREQ "${CUDA_BACKEND_LAST}")
    set (CUDA_BACKEND_CHANGED "OFF")
else ("${CUDA_BACKEND}" STREQ "${CUDA_BACKEND_LAST}")
    set (CUDA_BACKEND_CHANGED "ON")
endif ("${CUDA_BACKEND}" STREQ "${CUDA_BACKEND_LAST}")
set (CUDA_BACKEND_LAST "${CUDA_BACKEND}")

# Later on, where you define the name of the library
if ( CUDA_BACKEND )
    set ( MYLIBRARY_NAME "MyLibraryCUDA" )
else ( CUDA_BACKEND )
    set ( MYLIBRARY_NAME "MyLibrary" )
endif ( CUDA_BACKEND )

if (CUDA_BACKEND_CHANGED)
    set (MYLIBRARY_LIBRARY "MYLIBRARY_LIBRARY-NOTFOUND")
endif (CUDA_BACKEND_CHANGED)

find_library ( MYLIBRARY_LIBRARY
    NAMES "${MYLIBRARY_NAME}"
    PATHS "${MYLIBRARY_ABSOLUTE_PATH}/lib"
)