用cmake重新使用静态库的自定义生成文件

我想这将是一个通用的问题,包括与cmake内现有的makefile的图书馆; 但是这是我的背景 –

我试图将Scintilla包含在另一个CMake项目中,并且遇到以下问题:

在Linux上,scintilla在(例如) ${CMAKE_CURRENT_SOURCE_DIR}/scintilla/gtk目录中有一个makefile。 如果你运行在这个目录下(像往常一样),你会得到一个${CMAKE_CURRENT_SOURCE_DIR}/scintilla/bin/scintilla.a文件 – 我猜(这个是静态库)。

现在,如果我尝试使用cmake的ADD_LIBRARY ,我必须在cmake中手动指定scintilla的源代码 – 我宁可不要ADD_LIBRARY ,因为我已经有一个makefile。 所以,我宁愿打电话给通常的闪烁体 – 然后指示CMAKE以某种方式引用scintilla.a 。 ( 我想这样做不能保证跨平台的兼容性 – 但是请注意,目前跨平台对我来说不是问题;我只是想构build闪烁体作为这个项目的一部分,已经使用cmake,只能在Linux中

所以,我已经尝试了一下:

 ADD_CUSTOM_COMMAND( OUTPUT scintilla.a COMMAND ${CMAKE_MAKE_PROGRAM} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/scintilla/gtk COMMENT "Original scintilla makefile target" ) 

…然后,add_custom_command添加一个“ 没有输出的目标 ”; 所以我正在尝试几种方法来构build,所有这些都失败了(错误给出的评论):

 ADD_CUSTOM_TARGET(scintilla STATIC DEPENDS scintilla.a) # Target "scintilla" of type UTILITY may not be linked into another target. ADD_LIBRARY(scintilla STATIC DEPENDS scintilla.a) # Cannot find source file "DEPENDS". ADD_LIBRARY(scintilla STATIC) # You have called ADD_LIBRARY for library scintilla without any source files. ADD_DEPENDENCIES(scintilla scintilla.a) 

我明显地引用了一个noma与cmake – 所以,是否有可能有cmake运行一个预先存在的makefile,并“捕获”其输出库文件,使其他组件的cmake项目可以链接它?

非常感谢任何答案,
干杯!

编辑:可能重复: CMake:我如何依靠自定义目标的输出? – 堆栈溢出 – 然而,在这里破损似乎是由于需要专门有一个 ,其余的cmake项目将承认…

  • 另一个相关的: cmake – 添加一个自定义命令与文件名作为目标 – Stack Overflow ; 但是,它特别从源文件(我想避免)build立一个可执行文件。

Solutions Collecting From Web of "用cmake重新使用静态库的自定义生成文件"

您也可以使用导入的目标和像这样的自定义目标:

 # set the output destination set(SCINTILLA_LIBRARY ${CMAKE_CURRENT_SOURCE_DIR}/scintilla/gtk/scintilla.a) # create a custom target called build_scintilla that is part of ALL # and will run each time you type make add_custom_target(build_scintilla ALL COMMAND ${CMAKE_MAKE_PROGRAM} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/scintilla/gtk COMMENT "Original scintilla makefile target") # now create an imported static target add_library(scintilla STATIC IMPORTED) # Import target "scintilla" for configuration "" set_property(TARGET scintilla APPEND PROPERTY IMPORTED_CONFIGURATIONS NOCONFIG) set_target_properties(scintilla PROPERTIES IMPORTED_LOCATION_NOCONFIG "${SCINTILLA_LIBRARY}") # now you can use scintilla as if it were a regular cmake built target in your project add_dependencies(scintilla build_scintilla) add_executable(foo foo.c) target_link_libraries(foo scintilla) # note, this will only work on linux/unix platforms, also it does building # in the source tree which is also sort of bad style and keeps out of source # builds from working. 

好吧,我觉得我有点 基本上,在构建闪烁体的CMakeLists.txt中,我只用了这个:

 ADD_CUSTOM_TARGET( scintilla.a ALL COMMAND ${CMAKE_MAKE_PROGRAM} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/scintilla/gtk COMMENT "Original scintilla makefile target" ) 

…然后,稍微复杂一点的部分是在项目的其他地方找到正确的cmake文件,其中定义了${PROJECT_NAME} – 以添加依赖关系:

 ADD_DEPENDENCIES(${PROJECT_NAME} scintilla.a) 

最后,图书馆需要链接。

请注意,在此前的命令, scintilla.a只是一个名称/标签/标识符/字符串( 所以它可以是其他任何东西,如scintilla--a或什么东西 ); 但是对于链接 – 需要实际的`scintilla.a文件的完整路径(在这个项目中,这个文件最终在一个变量${SCINTILLA_LIBRARY} )。 在这个项目中,链接基本上是通过一种形式的

 list(APPEND PROJ_LIBRARIES ${SCINTILLA_LIBRARY} ) 

…我真的不知道如何cmake后来处理实际的链接(但它似乎工作)

为了保持一致性,我尝试使用${SCINTILLA_LIBRARY}而不是scintilla.a作为ADD_CUSTOM_TARGET中的标识符,但出现错误:“ 目标名称不能包含斜线,使用ADD_CUSTOM_COMMAND生成文件 ”。 所以可能用ADD_CUSTOM_COMMAND可以解决这个问题,但是我认为它“ 定义了一个可以在构建过程中执行的新命令,命名的输出应该被列为目标中的源文件,被生成 “… …现在我完全困惑,所以什么是文件,什么是标签,什么是目标 – 所以我想我会离开这个(而不是修复它,如果它不坏:))

那么,最终知道一个更正确的方法来做到这一点还是很好的,
干杯!