CMake не жаловался на несуществующий файл? - PullRequest
0 голосов
/ 04 июля 2018

Я знаю, что, вероятно, нет никакого обходного пути к этому, но мне нужно сгенерировать исходный файл dllmain.c для моей модели .dll. Это делается вместе с исполняемым файлом, который извлекает для меня некоторую важную информацию, поэтому мой текущий CMakeLists выглядит следующим образом

add_executable(main ${SOURCE} otherListSourcesGoHere)

add_custom_command(
    TARGET main
    POST_BUILD
    COMMAND main.exe <--- Main built from above
    COMMAND ${CMAKE_COMMAND} -E sleep 1
    COMMAND python ${PYTHON_SOURCE_DIR}/jtox.py
    COMMAND ${CMAKE_COMMAND} -E sleep 1
    COMMAND python ${PYTHON_SOURCE_DIR}/dllgen.py <--- Python script generating a 
                                                       sourcefile for my DLL
    COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_DIR}/build/dllmain.c ${PROJECT_DIR}
)

add_library(
    ${CMAKE_PROJECT_NAME}
    SHARED
    ${PROJECT_DIR}/dllmain.c
    otherListSoucrsGoHereAswell
)

Но, разумеется, поскольку файл dllmain.c не существует до завершения и запуска exe-файла, я не могу его использовать, так как он вернет ошибку. Возможно ли выполнить это как-то без необходимости запуска двух CMakeLists?

РЕДАКТИРОВАТЬ 1 С помощью @Angew я узнал, что вы можете указать вывод файла в add_custom_command, поэтому в настоящее время у меня есть это вместо

add_executable(main ${SOURCE} otherListSourcesGoHere)

add_custom_command(
    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/dllmain.c
    COMMAND main
    COMMAND ${CMAKE_COMMAND} -E sleep 1
    COMMAND python ${PYTHON_SOURCE_DIR}/jtox.py
    COMMAND ${CMAKE_COMMAND} -E sleep 1
    COMMAND python ${PYTHON_SOURCE_DIR}/dllgen.py -o ${CMAKE_CURRENT_BINARY_DIR}/dllmain.c
)

add_library(
    ${CMAKE_PROJECT_NAME}
    SHARED
    ${CMAKE_CURRENT_BINARY_DIR}/dllmain.c
    otherListSoucrsGoHereAswell
)

Но у меня есть ошибка

CMakeFiles\bil.dir\build.make:60: recipe for target '../dllmain.c' failed
CMakeFiles\Makefile2:66: recipe for target 'CMakeFiles/bil.dir/all' failed
makefile:82: recipe for target 'all' failed

Кажется, я не нашел решения. Как я могу отладить эту проблему?

РЕДАКТИРОВАТЬ 2

Я исправил эту проблему, добавив DEPENDS main в add_custom_command

add_custom_command(
    OUTPUT ${PROJECT_DIR}/dllmain.c
    DEPENDS main
    COMMAND echo "Executing main.exe"
    COMMAND main.exe
    COMMAND ${CMAKE_COMMAND} -E sleep 1
    COMMAND echo "JSON to XML with Python"
    COMMAND python ${PYTHON_SOURCE_DIR}/jtox.py
    COMMAND ${CMAKE_COMMAND} -E sleep 1
    COMMAND python ${PYTHON_SOURCE_DIR}/dllgen.py -o ${PROJECT_DIR}

)

1 Ответ

0 голосов
/ 04 июля 2018

Правильный способ сделать это - указать CMake, как сгенерировать файл, а не делать это «вручную» и хранить его в секрете от CMake. Для этого измените свой CMakeList следующим образом:

add_executable(main ${SOURCE} otherListSourcesGoHere)

add_custom_command(
    OUTPUT ${PROJECT_DIR}/dllmain.c
    COMMAND main
    COMMAND ${CMAKE_COMMAND} -E sleep 1
    COMMAND python ${PYTHON_SOURCE_DIR}/jtox.py
    COMMAND ${CMAKE_COMMAND} -E sleep 1
    COMMAND python ${PYTHON_SOURCE_DIR}/dllgen.py
    COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_DIR}/build/dllmain.c ${PROJECT_DIR}
)

add_library(
    ${CMAKE_PROJECT_NAME}
    SHARED
    ${PROJECT_DIR}/dllmain.c
    otherListSoucrsGoHereAswell
)

Таким образом, CMake будет знать, что файл ${PROJECT_DIR}/dllmain.c сгенерирован, а также как его сгенерировать. Он правильно заменит main исполняемым файлом, созданным из цели main, и введет правильную зависимость сборки.


Примечание: вам следует подумать об изменении dllgen.py, чтобы он мог сгенерировать файл в каталоге по вашему выбору и создать его в двоичном каталоге. Таким образом, вы не будете загрязнять свое исходное дерево артефактами сборки, что является очень желательным свойством: оно позволяет вам вернуться в первоначальное состояние, просто удалив двоичный каталог. С этим изменением CMakeList может выглядеть так:

add_executable(main ${SOURCE} otherListSourcesGoHere)

add_custom_command(
    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/dllmain.c
    COMMAND main
    COMMAND ${CMAKE_COMMAND} -E sleep 1
    COMMAND python ${PYTHON_SOURCE_DIR}/jtox.py
    COMMAND ${CMAKE_COMMAND} -E sleep 1
    COMMAND python ${PYTHON_SOURCE_DIR}/dllgen.py -o ${CMAKE_CURRENT_BINARY_DIR}/dllmain.c
)

add_library(
    ${CMAKE_PROJECT_NAME}
    SHARED
    ${CMAKE_CURRENT_BINARY_DIR}/dllmain.c
    otherListSoucrsGoHereAswell
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...