【问题标题】:Glob files in post build custom command in CMakeCMake 中构建后自定义命令中的 Glob 文件
【发布时间】:2018-11-08 10:50:16
【问题描述】:

我正在使用 CMake 和 SWIG 从 C++ 代码生成 C# 绑定。这是CMakeLists.txt 的一部分,它调用 SWIG 并以非自动方式执行我想做的事情:

...

find_package(SWIG REQUIRED)
include(${SWIG_USE_FILE})

set(CMAKE_SWIG_FLAGS "")

set_source_files_properties(matrixsharp.i PROPERTIES CPLUSPLUS ON)

include_directories("../include/")

set(SOURCE_FILES
    lmfont.cpp
    lmsize.cpp
    lmpoint.cpp
    lmpanel.cpp)

swig_add_module(matrixsharp csharp matrixsharp.i ${SOURCE_FILES})

swig_link_libraries(matrixsharp matrix
                    ...) # Library dependencies

# TODO Don't add the cs files manually but instead try to glob these during the post-build stage and then pass onto the mcs command
set(CSHARP_TEST_APP_SRC
    ${CMAKE_CURRENT_SOURCE_DIR}/TestApp.cs
    ${CMAKE_CURRENT_BINARY_DIR}/LmFont.cs
    ${CMAKE_CURRENT_BINARY_DIR}/LmSize.cs
    ${CMAKE_CURRENT_BINARY_DIR}/LmPoint.cs
    ${CMAKE_CURRENT_BINARY_DIR}/LmMatrixProtocol.cs
    ${CMAKE_CURRENT_BINARY_DIR}/LmPanelType.cs
    ${CMAKE_CURRENT_BINARY_DIR}/LmPanel.cs
    ${CMAKE_CURRENT_BINARY_DIR}/SWIGTYPE_p_unsigned_char.cs
    ${CMAKE_CURRENT_BINARY_DIR}/MatrixSharpPINVOKE.cs
)

add_custom_command(TARGET matrixsharp
    POST_BUILD
    COMMAND mcs ${CSHARP_TEST_APP_SRC}
                -out:Test.exe
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
    COMMENT "Building C# Test.exe"
)

在构建过程中,所有必需的*.cs 文件都会生成并放入二进制目录。由于Test.exe 需要所有C# 文件,如果我可以在构建后阶段(但在上面的自定义命令之前)以某种方式调用glob,将输出存储在一个变量中,然后将其传递给调用mcs(单声道编译器)生成最终可执行文件Test.exe的自定义命令。

有没有办法做到这一点?我正在考虑在此之前添加另一个自定义命令,该命令使用lsgrep 从输出二进制目录中获取所有*.cs 文件,但问题是我不知道如何将返回的字符串存储在一个变量。 SWIG 部分只是针对我的案例的一个示例,但问题本质上更为笼统。

【问题讨论】:

  • 您能在matrixsharp 定义中使用通配符吗? Mono docs 提到 recurse 参数可能会为您完成这项工作? ... add_custom_command(TARGET matrixsharp POST_BUILD COMMAND mcs -recurse:'${CMAKE_CURRENT_SOURCE_DIR}/*.cs' -out:Test.exe WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMENT "Building C# Test.exe")
  • 它有效。但是我认为最好尝试一种更通用的方法,一种超越 mcs 的方法。
  • 构建阶段没有CMake变量:它们都已经被替换到文件中,由构建程序处理( Visual Studio、make 或其他)。您可以尝试使用 environment 变量,但这也取决于操作系统和构建程序。

标签: c# c++ cmake post-build-event gmcs


【解决方案1】:

我能够为此成功使用SWIG_SUPPORT_FILES编辑:它不包含所有文件。

swig_add_library(foo
  TYPE SHARED
    LANGUAGE java
    SOURCES java.i
)
...
get_property(swigGeneratedFiles TARGET foo PROPERTY SWIG_SUPPORT_FILES)
add_jar(foobar
  ${swigGeneratedFiles}
)

【讨论】:

    猜你喜欢
    • 2021-10-20
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多