我如何让 CMake 相信文件扩展名 .swig 等同于 .i?
如何为其他文件扩展名执行此操作?
上下文
我将 CMake(版本 2.8,最低 2.6)与 Swig 一起使用。如果我将我的 swig 接口(interface)文件设置为具有 .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 模块,该模块导出我期望它按照 native.(swig|i) 文件导出的所有功能。
最佳答案
查看 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
文件。
关于CMake 将文件扩展名视为另一个文件扩展名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17246231/