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

标签 cmake

我如何让 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/

相关文章:

安卓 CMake : Could NOT find OpenSSL

CMake的find_library无法找到没有版本、扩展名和lib前缀的库

android - Android 中 CMake 的 LOCAL_STATIC_LIBRARIES 的等价物是什么?

c++ - 在 Yocto 中使用 Cmake 构建 Qt5

c++ - 如何部分禁用 cmake C/C++ 自定义编译器检查

c++ - 使用基于编译器的 cmake 条件 CXX_FLAGS?

c++ - 如何创建继承自 Release 的 CMake 配置类型

cmake - QQuick与CMake : style does not work

c++ - 如何将 C++14 标准要求从基于 POCO 的项目更改为 C++17

cmake - check_library_exists 无法正常工作