Проблемы с использованием cmake на cygwin - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть проект, который ранее был linux только в makefile.

Я успешно перенес его в cmake, и он отлично работает, он компилируется в чистый linux (makefile -> so) и чистые окна (визуальныйстудия -> dll) без проблем.Он также прекрасно компилируется в Linux для Windows (используя mingw -> dll).

Однако, для проблем интеграции и совместимости скриптов, я должен сгенерировать и собрать код для Windows (DLL), но в среде Cygwin(с gg от cygwin, предоставляющего dll), как это делал старый make-файл.(Я должен сделать это из-за внешних ограничений)

Я установил пакеты «make» и «cmake» на мой cygwin.

Когда я пытаюсь сгенерировать make-файл вКонсоль cygwin застревает:

$ cmake -G "Unix Makefiles" ../Sources
[ -- misc CMake prints from my CMakeLists.txt -- ]
-- Configuring done
[ -- stuck - nothing happens here -- ]

Когда я останавливаю его (ctrl-C), он ничего не говорит, и файл «Makefile» присутствует в моем каталоге сборки, поэтому я пытаюсь скомпилировать его:

$ make
[ -- misc CMake prints from my CMakeLists.txt -- ]
-- Configuring done
[ -- stuck - nothing happens here -- ]

Кажется, что он заново генерируется заново (я снова получаю отпечатки cmake, файл Makefile исчезает, затем снова появляется, и команда снова застревает на той же стадии).

На этот раз, когда я его останавливаю, выводится следующее сообщение:

$ make
[ -- misc CMake prints from my CMakeLists.txt -- ]
-- Configuring done
make: *** [Makefile:224: cmake_check_build_system] Interrupt

Я попытался найти Makefile, и кажется, что это следующая команда, которая блокирует:

cmake_check_build_system:
    $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-    build-system CMakeFiles/Makefile.cmake 0
.PHONY : cmake_check_build_system

Я искал и нашел эту ветку , так что, похоже, это просто способ установить каталоги.Я пытался запустить его вручную, и результат тот же:

$ cmake -H../Sources -B. --check-build-system CMakeFiles/Makefile.cmake 0
[ -- misc CMake prints from my CMakeLists.txt -- ]
-- Configuring done
[ -- stuck - nothing happens here -- ]

Я не знаю, что я делаю неправильно, и я застрял, кто-нибудь может мне помочь?


Edit: запуск make в подробном режиме дает немного больше информации:

$ make VERBOSE=1
/usr/bin/cmake.exe -H/cygdrive/e/Projects/MyProject/Sources -B/cygdrive/e/Projects/MyProject/Build_Cygwin --check-build-system CMakeFiles/Makefile.cmake 0
Re-run cmake: build system dependency is missing
[ -- misc CMake prints from my CMakeLists.txt -- ]
-- Configuring done

1 Ответ

0 голосов
/ 03 декабря 2018

Как предположил Фред, я использовал --trace для получения дополнительной информации -> после Configuring done.

не было абсолютно ничего. Затем, как предложил Цыварев, я упростил списки CMakeLists до минимума.где это было нормально.Затем я добавлял что-то по крупицам, пока не обнаружил проблему.

Это происходило от переменных пути cmake, которые содержали буквы дисков (например, «E: / ...»), которые заставляли cmake сходить с ума и застревать.

Я сделал небольшой макрос для исправления всех переменных пути, заменив буквы дисков на «/ cygdrive / [буква диска] / ...», и после их исправления все вернулось в нормальное состояние.Для интересующихся:

macro(PatchPath PATHTOPATCH OUTPUT_VAR)
if(${TARGET_SYSTEM_TYPE} MATCHES "cygwin")
    string(SUBSTRING ${PATHTOPATCH} 0 1 CYG_DRIVE)
    string(TOLOWER ${CYG_DRIVE} CYG_DRIVE)
    string(SUBSTRING ${PATHTOPATCH} 2 -1 TMP_END_OF_PATH)
    set(${OUTPUT_VAR} "/cygdrive/${CYG_DRIVE}${TMP_END_OF_PATH}")
endif()
endmacro()

Спасибо всем!

...