3

我如何说服 CMake 文件扩展名 .swig 等同于 .i?

我将如何为其他文件扩展名执行此操作?

语境

我在 Swig 中使用 CMake(版本 2.8,最低 2.6)。如果我将 swig 接口文件设置为具有 .i 扩展名,那么一切都会自动运行(我最终会得到一个可从目标语言解释器 tclsh 加载的工作 .dll“模块”)。如果我给它 .swig 扩展名,CMake 不知道如何处理它。我想在我的编辑器中使用一个扩展而不是另一个扩展来减少语法高亮。

现有的 CMake 文件

应评论者的要求,这是 mah' 文件:

find_package(swig REQUIRED)
include(${SWIG_USE_FILE})

find_package(tcl REQUIRED)
include_directories(${TCL_INCLUDE_PATH})

set(CMAKE_SWIG_FLAGS -prefix thoughtjack -namespace)

link_directories(${OEEG_BINARY_DIR}/oeeg)

set(swig_interface_files native.i)
set_source_files_properties(${swig_interface_files} PROPERTIES CPLUSPLUS ON)
file(GLOB_RECURSE native_source_files *.cpp *.c)

swig_add_module(thoughtjack_native tcl ${swig_interface_files} ${native_source_files})
swig_link_libraries(thoughtjack_native ${TCL_LIBRARY} oeeg)

file(GLOB script_files ${CMAKE_CURRENT_SOURCE_DIR}/*.tcl)
install(FILES ${script_files} DESTINATION opt/thoughtjack)
install(TARGETS thoughtjack_native DESTINATION opt/thoughtjack)

add_custom_target(
  thoughtjack
  DEPENDS thoughtjack_native
  SOURCES ${script_files}
)

custom_xyz 位与“源”位和其他装饰一起告诉 CMake 通过 MSVS 解决方案文件提供这些。如前所述,只需将文件从 .swig 重命名为 .i(如此处所示)即可为我提供一个工作的、可加载的 Tcl 模块,该模块可以按照 native.(swig|i) 文件导出我期望的所有功能。

4

1 回答 1

4

查看UseSwig模块的源代码后,它被硬编码为只使用匹配的文件名.i,所以你不能让它使用别的东西。

现在,CMake 可以通过添加规则来帮助您将.swig文件复制到.i需要的时间:

set(swig_dot_swig_files your.swig files.swig)

foreach(item IN LISTS swig_swig_files)
    get_filename_component(itembase ${item} NAME_WE)
    add_custom_command(
        OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${itembase}.i"
        COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/${item}" "${CMAKE_CURRENT_BINARY_DIR}/${itembase}.i"
        DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/${item}"
    )
endforeach()

然后您可以将这些文件提供给swig_add_module

set(swig_dot_i_files your.i files.i)
swig_add_module(thoughtjack_native tcl ${swig_dot_i_files})

这个解决方案有一些好的特性:例如,修改.swig将重建目标,因为.i文件之间存在依赖关系.swig

于 2013-06-23T14:38:53.773 回答