gpt4 book ai didi

c++ - cmake + 痛饮 + 依赖项

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:28:20 26 4
gpt4 key购买 nike

今天我尝试使用“cmake + swig”的组合来为我的代码生成绑定(bind)。基本上它有效:

set(SWIG_EXECUTABLE "/usr/bin/swig")
find_package(SWIG REQUIRED)
include(${CMAKE_CURRENT_SOURCE_DIR}/UseSWIG.cmake)

set(CMAKE_SWIG_FLAGS -package example)
set(CMAKE_SWIG_OUTDIR "${CMAKE_CURRENT_SOURCE_DIR}/example")
set_source_files_properties(native.i PROPERTIES CPLUSPLUS ON)
SWIG_ADD_MODULE(core Java native.i lib.cpp)
include_directories(${CMAKE_CURRENT_SOURCE_DIR})

用这样的 native.i:

%module native
%include "lib.hpp"
%{
#include "lib.hpp"
%}

但如果我更改 lib.hpp 构建系统 cmake build 则不会调用 swig 重新生成代码。所以我必须 touch native.i 才能让它工作,这很烦人。

我发现 swig-M 选项可以生成依赖项,知道如何使用它来修复 UseSWIG.cmake 吗?

UseSWIG.cmake 仅使用 add_custom_command 进行生成,所以我需要以某种方式 add_custom_command 依赖于动态文件集,不是静态的?

最佳答案

我相信我已经找到了解决您的请求的方法。

我目前正在使用一个解决方案,其中添加了所有相关依赖项,以便 SWIG 重新生成接口(interface),无论何时修改任何解析的 header 。

这个想法是制作一个自定义目标,除了删除生成的接口(interface)文件外,它还涉及一个虚拟文件。我在下面为一个名为 fnm 的项目提供了解决方案,其中包含一个包装器 swig_fnm

# Method to make swig_fnm.i depend on input headers
execute_process(COMMAND swig -M -python -c++ -I${CMAKE_CURRENT_BINARY_DIR}/.. -I${CMAKE_CURRENT_SOURCE_DIR}/.. swig_fnm.i
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
OUTPUT_VARIABLE swig_deps
INPUT_FILE swig_fnm.i)
# Match all lines except the first one until " \"
string(REGEX MATCHALL "\n [^ ]+" temp ${swig_deps})

# Valid dependency extensions
set(valid_ext .h .hpp)

# Dependency list
set(swig_deps_actual)
foreach(t ${temp})
string(STRIP "${t}" t)

# Add to dependency list
if (EXISTS "${t}")
set(filter)
get_filename_component(filter "${t}" EXT)
if (";${valid_ext};" MATCHES ";${filter};")
set(swig_deps_actual ${swig_deps_actual} "${t}")
endif()
endif()
endforeach()

# This makes configure run again, but does not regenerate the SWIG interface.
set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${swig_deps_actual})

# All headers except for the single .i file are ignored
swig_add_module(swig_fnm python swig_fnm.i ${swig_fnm_HEADERS} ${swig_deps_actual})

# Removes generated file (if any of the dependent files are changed)
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/swig.stamp
COMMAND ${CMAKE_COMMAND} -E remove ${swig_generated_file_fullname}
COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/swig.stamp
DEPENDS ${swig_deps_actual} # The dependent files
COMMENT "Removing old SWIG generated file" VERBATIM)

# Custom target for establishing dependency
add_custom_target(
swigtrick
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/swig.stamp)

# Dependency
add_dependencies(_swig_fnm swigtrick)

关于c++ - cmake + 痛饮 + 依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39358420/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com