Я генерирую привязки C # из кода C ++, используя CMake и SWIG. Вот часть 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
.
Есть ли способ сделать это? Я думал о добавлении другой пользовательской команды до этой, которая использует ls
и grep
, чтобы получить все файлы *.cs
из выходного двоичного каталога, но проблема в том, что я не знаю, как сохранить возвращенную строку в Переменная. Часть SWIG - это просто пример, характерный для моего случая, но этот вопрос носит более общий характер.