我想在cmake中从目标生成pkgconfig文件。我开始写了这样的代码:
function(auto_pkgconfig TARGET)
get_target_property(INCLUDE_DIRS ${TARGET} INTERFACE_INCLUDE_DIRECTORIES)
string(REPLACE "$<BUILD_INTERFACE:" "$<0:" INCLUDE_DIRS "${INCLUDE_DIRS}")
string(REPLACE "$<INSTALL_INTERFACE:" "$<1:" INCLUDE_DIRS "${INCLUDE_DIRS}")
string(REPLACE "$<INSTALL_PREFIX>" "${CMAKE_INSTALL_PREFIX}" INCLUDE_DIRS "${INCLUDE_DIRS}")
file(GENERATE OUTPUT ${TARGET}.pc CONTENT "
Name: ${TARGET}
Cflags: -I$<JOIN:${INCLUDE_DIRS}, -I>
Libs: -L${CMAKE_INSTALL_PREFIX}/lib -l${TARGET}
")
install(FILES ${TARGET}.pc DESTINATION lib/pkgconfig)
endfunction()
这是一个简化的版本,但它基本上读取INTERFACE_INCLUDE_DIRECTORIES
属性并处理生成器表达式的INSTALL_INTERFACE
,只要在调用auto_pkgconfig
之前设置了include目录,就可以很好地工作,如下所示:
add_library(foo foo.cpp)
target_include_directories(foo PUBLIC
$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/include>
${OTHER_INCLUDE_DIRS}
)
auto_pkgconfig(foo)
但是,有时属性是在调用auto_pkgconfig
之后设置的,如下所示:
add_library(foo foo.cpp)
auto_pkgconfig(foo)
target_include_directories(foo PUBLIC
$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/include>
${OTHER_INCLUDE_DIRS}
)
但是,这将无法正确读取include目录。我希望auto_pkgconfig
在设置完所有目标属性后运行。我可以使用生成器表达式,将auto_pkgconfig
修改为:
function(auto_pkgconfig TARGET)
file(GENERATE OUTPUT ${TARGET}.pc CONTENT "
Name: ${TARGET}
Cflags: -I$<JOIN:$<TARGET_PROPERTY:${TARGET},INTERFACE_INCLUDE_DIRECTORIES>, -I>
Libs: -L$<TARGET_FILE_DIR:${TARGET}> -l${TARGET}
")
install(FILES ${TARGET}.pc DESTINATION lib/pkgconfig)
endfunction()
但是,这将读取BUILD_INTERFACE
而不是INSTALL_INTERFACE
。因此,在设置目标属性之后,是否有其他方法可以读取它们?
2条答案
按热度按时间jmo0nnb31#
根据CMake文档,
INSTALL_INTERFACE
的内容只有在调用install(EXPORT)
时才可用。除非它们扩展了CMake,否则最好执行其他操作来生成PkgConfig文件。理想情况下,您应该对安装布局有足够的控制权,以使此操作变得容易。我们的想法是使用
install(EXPORT)
让CMake生成适当的脚本,然后 * 生成一个虚拟的CMake项目 *,它使用上面给出的file(GENERATE OUTPUT ...)
代码;虚拟项目将看到导出的属性,即INSTALL_INTERFACE
属性。我最初尝试使用
install(CODE [[ ... ]])
来实现这一点,但是它 * 也 * 看到$<BUILD_INTERFACE:...>
视图,我在CMake Discourse上询问过这一点。结果如下:
你应该难过才对。我也难过。
pqwbnv8z2#
编辑:离题,因为这里,pc文件是手动生成的
pkgconfig模板文件
动机:
模板文件:第一个月
CMakeLists.txt
基于:CMake generate pkg-config .pc
相关:将目标导出到cmake文件