CMake/FindDoxygen: MSYS2 中的路径处理

CMake/FindDoxygen: Path handling in MSYS2

我正在尝试通过 find_package(Doxygen ...)doxygen_add_docs() 添加目标以使用 Doxygen 生成 API 文档到我的 CMake 项目中。我在 Windows 10 上的 MSYS2 环境中。出于某种原因,CMake 和 Doxygen 似乎无法以预期的方式处理路径(参见示例)。

起初,Doxygen 抱怨它无法创建输出目录。 CMake 准备的 DOXYGEN_OUTPUT_DIRECTORY 是一个 Windows 正斜杠路径。 Doxygen 似乎无法将其识别为绝对路径,并以 Unix 格式 (/c/Users/...) 将其工作目录作为前缀。我通过执行生成的目标以及使用生成的 Doxyfile.doc 手动调用 Doxygen 来尝试此操作。如果我使用 cygpath.

将路径转换为 ​​Unix 路径,它会起作用

第二个问题是关于寻找。我将 GraphViz 安装为本机 Windows 包,通常 MSYS2 CMake 会找到它。然后,在 FindDoxygen.cmake 中,DOXYGEN_DOT_PATH 被设置为点可执行文件的路径部分,并被 file(TO_NATIVE_PATH ...) 修改,因为我在 Windows 上。手动尝试这个我可以看到它将路径设置为 "C:/Program Files (x86)/Graphviz/bin" 并将其转换为 "C:/Program\ Files\ (x86)/Graphviz/bin"。后者以 Doxyfile.doc 结束。如果我在那里删除反斜杠,它就可以工作。我想 Doxygen 认为这些旨在将空格转义为路径分隔符的反斜杠。

对于第一个问题,我有一个(希望)可移植的解决方法,但第二个问题我只能在不执行转换步骤的情况下从 Find 模块手动重复检索 DOXYGEN_DOT_PATH 才能解决。这感觉不是一个好的解决方案。
我在这里是否遗漏了有关 CMake 中路径处理的内容,例如一些文档或 setting/policy?
无论如何,这是否是预期的行为,尤其是。对于 file(TO_NATIVE_PATH ...),在 MSYS2 中?

例子

非常基本的示例:只需 CMakeLists.txt 即可生成 Makefile 并调用 Doxygen。 make doc 的输出显示了上述 2 个问题 - #1 的错误,#2 的警告。

CMakeLists.txt

cmake_minimum_required(VERSION 3.19)

project(DoxyTest VERSION 0.1)

find_package(Doxygen OPTIONAL_COMPONENTS dot)

doxygen_add_docs(doc)

正在尝试构建文档目标

$ cmake -G"MSYS Makefiles" ..
-- The C compiler identification is GNU 10.2.0
-- The CXX compiler identification is GNU 10.2.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: C:/msys64/mingw64/bin/gcc.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: C:/msys64/mingw64/bin/g++.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found Doxygen: C:/msys64/usr/bin/doxygen.exe (found version "1.9.1 (ec8203f43232e7e7b16b1c85351c7c48d128f924)") found components: doxygen dot
-- Configuring done
-- Generating done
-- Build files have been written to: C:/Users/myUser/tmp/foo/build

$ make doc
Scanning dependencies of target doc
[100%] Generate API documentation for doc
warning: the dot tool could not be found at C:/Program\ Files\ (x86)/Graphviz/bin
Doxygen version used: 1.9.1 (ec8203f43232e7e7b16b1c85351c7c48d128f924)
error: Could not create output directory /C/Users/myUser/tmp/foo/C:/Users/myUser/tmp/foo/build/html
Exiting...
make[3]: *** [CMakeFiles/doc.dir/build.make:78: CMakeFiles/doc] Error 1
make[2]: *** [CMakeFiles/Makefile2:95: CMakeFiles/doc.dir/all] Error 2
make[1]: *** [CMakeFiles/Makefile2:102: CMakeFiles/doc.dir/rule] Error 2
make: *** [Makefile:137: doc] Error 2

原来在 MSYS2 环境中没有安装正确的 Doxygen 包。

我使用 MinGW64 shell,它使用 mingw-w64-x86_64-* 包中的二进制文件。该问题的 CMake 输出显示 C 和 CXX 编译器的二进制文件在 C:/msys64/mingw64/ 下(以及 CMake 二进制文件),而 Doxygen 在 C:/msys64/usr/bin/.

安装 mingw-w64-x86_64-doxygen 解决了这个问题。现在,CMake 输出显示 MSYS2 MinGW64 位 shell 和 API 文档生成中的 Doxygen 的 mingw64 路径完美无缺。尝试 MSYS2 MSYS shell 也可以使用 C:/msys64/usr/bin/.

中的二进制文件与 CMake 一起正常工作