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

时间:2013-06-22 00:42:29

标签: cmake

如何说服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位有'sources'位和其他装饰,告诉CMake通过MSVS解决方案文件提供这些。如上所述,只需将文件从.swig重命名为.i(如此处所示),即可为我提供一个可加载的可运行Tcl模块,该模块根据本机。(swig | i)文件导出我期望的所有功能。 / p>

1 个答案:

答案 0 :(得分: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文件的依赖关系。