在 cygwin 上使用 cmake 的问题

Issues using cmake on cygwin

我有一个以前 linux 只在 makefile 中的项目。

我已经成功地将它迁移到 cmake 并且工作正常,它在纯 linux (makefile --> so) 和纯 windows (visual studio --> dll 中编译) 没有问题。它还在 linux 上为 windows 编译得很好(使用 mingw --> dll)。

但是,对于集成和脚本兼容性问题,我必须为 windows (dll) 生成和构建代码,但是在 cygwin 环境中(cygwin 的 gcc 提供了一个 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

我搜索了一下,找到了,所以这似乎只是一种设置目录的方法。 我已经手动尝试 运行 结果是一样的:

$ 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 in verbose mode 提供更多信息:

$ 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

按照 Fred 的建议,我使用 --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()

谢谢大家!