一种获取 CMake 信息的方法 #6345
SineStriker
started this conversation in
Ideas
Replies: 2 comments 11 replies
-
你可以提 pr 过来改进下 |
Beta Was this translation helpful? Give feedback.
1 reply
-
不过产生 build.ninja 还得额外安装 ninja ,有局限的,find_package 阶段,是没法自动帮用户装这些,只能依赖用户提前安装。 |
Beta Was this translation helpful? Give feedback.
10 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
看了一下这个文件:
xmake/modules/package/manager/cmake/find_package.lua
注意到目前 xmake 是直接手撕 vcproj 来获取目标的信息的,这样通用性差,而且容易出问题。
我想了一种结合 CMake 和 ninja 的方式:
假设我们要获取一个 C++ 库 QWindowKit 的信息,首先准备下面几个文件:
main.cpp
main-info.json.in
:CMakeLists.txt
执行命令:
cmake --no-warn-unused-cli -B build -G Ninja \ -DCMAKE_BUILD_TYPE:STRING=Debug \ -DQT_DIR:STRING=C:/Qt/5.15.2/msvc2019_64/lib/cmake/Qt5 \ -DQt5_DIR:STRING=C:/Qt/5.15.2/msvc2019_64/lib/cmake/Qt5 \ -DQWindowKit_DIR:STRING=C:/qwindowkit/build/install/lib/cmake/QWindowKit \ -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE
等待 CMake Configure 完成后,build 目录会生成
build.ninja
和main-info.json
。main-info.json
build.ninja
下面需要结合 CMake 输出的信息和 Ninja 中的信息来综合筛选。
main-info.json
里应该是完整的main-info.json
里是获取不到完整的依赖库列表的的,因为里面可能包含 CMake 目标名字而不是路径,但是从build.ninja
的LINK_LIBRARIES
里可以获取到。main-info.json
里很有可能包含无法解析的生成表达式,所以需要看build.ninja
的FLAGS
和LINK_FLAGS
提取顺序:
main-info.json
里获取到的信息完全不包含生成表达式($<CONFIG>
这种),那么就直接用build.ninja
里获取这样,获取到的信息大概率是精确的,除了会多一些可能没必要链接的系统库。
注意事项:
CMAKE_CXX_COMPILER
这样的工具链信息。CMakeLists.txt
中禁用了CMAKE_CXX_FLAGS
这些变量,CMake 还是会自作主张加一些参数,比如/subsystem:console
、/MDd
这种,这种只能看平台相关的 CMake Module,然后提前把相关的变量禁用掉。还有一些其他问题,可能 xmake 没考虑周全。比如,不是所有的库都能通过
find_package(XXX CONFIG REQUIRED)
直接查找的,比如 Qt 就需要查找两次,而且带上模块名。Beta Was this translation helpful? Give feedback.
All reactions