CMake 将文件扩展名视为另一个文件扩展名

use*_*ser 3 cmake

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

对于其他文件扩展名,我该如何执行此操作?

语境

我将 CMake(版本 2.8,最低版本 2.6)与 Swig 一起使用。如果我将 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}
)
Run Code Online (Sandbox Code Playgroud)

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

Gui*_*ume 5

查看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()
Run Code Online (Sandbox Code Playgroud)

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

set(swig_dot_i_files your.i files.i)
swig_add_module(thoughtjack_native tcl ${swig_dot_i_files})
Run Code Online (Sandbox Code Playgroud)

该解决方案具有一些良好的特性:例如,对 的修改.swig将使目标重新构建,因为存在.i文件与.swig文件之间的依赖关系。