我正在使用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
(Mono编译器)以生成最终可执行文件Test.exe
的自定义命令。
有没有办法做到这一点?我正在考虑在此命令之前添加另一个自定义命令,该命令使用ls
和grep
从输出二进制目录中获取所有*.cs
文件,但是问题是我不知道如何将返回的字符串存储在变量中。 SWIG部分只是针对我的案例的一个示例,但实际上这个问题更笼统。
答案 0 :(得分:0)
我能够成功使用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}
)