我有一个以前仅在makefile中是linux的项目。
我已经成功地将其迁移到cmake,并且工作正常,它可以在纯linux(makefile-> so)和纯Windows(visual studio-> dll)中编译而没有问题。它还可以在Linux上针对Windows(使用mingw-> dll)进行编译。
但是,对于集成和脚本兼容性问题,我必须为cygwin环境(由cygwin的gcc提供dll)在Windows(dll)上生成和构建代码,就像以前使用的旧makefile一样。 (由于外部限制,我必须这样做)
我已经在cygwin上安装了“ make”和“ cmake”软件包。
当我尝试在cygwin控制台中生成makefile时,它卡住了:
$ 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
我搜索并找到了this thread,所以这似乎只是设置目录的一种方法。 我尝试过手动运行它,结果是一样的:
$ cmake -H../Sources -B. --check-build-system CMakeFiles/Makefile.cmake 0
[ -- misc CMake prints from my CMakeLists.txt -- ]
-- Configuring done
[ -- stuck - nothing happens here -- ]
我不知道自己在做什么错,被困住了,有人可以帮我吗?
编辑:以详细模式运行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
答案 0 :(得分:0)
按照弗雷德的建议,我使用--trace
来获取更多信息-> Configuring done
之后绝对没有任何内容。
然后,按照Tsyvarev的建议,我将CMakeLists简化到了可以的最低限度。然后,我逐点添加了一些内容,直到发现问题为止。
它来自包含驱动器号(例如“ E:/ ...”)的cmake路径变量,这些变量使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()
谢谢大家!