Я генерирую привязки 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 — это просто пример, характерный для моего случая, но этот вопрос носит более общий характер.
Задача ещё не решена.
Других решений пока нет …