-
-
Notifications
You must be signed in to change notification settings - Fork 788
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
package.tools.cmake should use add_compile_options in preference to CMAKE_C_FLAGS and CMAKE_CXX_FLAGS #5826
Comments
如果是 add_requires/cmake.install 里面传递的 cflags 等参数,原本就没区分 debug/release,关键是现在内部还有个 get default cmake flags 的逻辑,会根据 package 的 mode ,去从 cmake 中取 DEBUG/RELEASE 的默认参数。这块还是要区分 mode 的。 所以这个区分逻辑还是要加的 另外目前这个 shrink 逻辑,只对 value string > 128 生效,并不是全开的,因为我暂时不确定它的稳定性和兼容性,如果要支持这个,就得把这个 length 限制去掉才行 ,稳定性有待验证。 add_compile_options 使用上似乎也有些限制,分语言似乎无法直接一次传入多值,否则编译时候会报错,例如这种 我暂时只能拆分 flags 挨个设置,另外即使拆分了,flag 里面带有空格,也会又问题,需要额外的 坑也挺多,我暂时实现了初版,但我没把握它一定可靠。 add_link_options 无法区分 binary/shared ,暂时没用,改成这种,就直接对所有 binary/shared 生效了,会 break 。 |
目前的 patch ,ci 上测了些基础包 没啥问题,你这也可以测下,比如测一下带有各种 flags 的包 |
In the current patch, some basic packages have been tested on ci. There is no problem. You can also test it, such as testing packages with various flags. |
generator expression 也可以区分mode的:
cmake指定多个flag需要引号引起来,比如 |
Generator expression can also distinguish modes:
cmake needs to specify multiple flags in quotation marks, such as |
如果不使用新的 add_linker_options API的话,希望能加上 set(CMAKE_MODULE_LINKER_FLAGS ${CMAKE_SHARED_LINKER_FLAGS}) 目前Module用不了packagedeps |
If you don’t use the new add_linker_options API, I hope you can add set(CMAKE_MODULE_LINKER_FLAGS ${CMAKE_SHARED_LINKER_FLAGS}). Currently, Module cannot use packagedeps. |
引号刚就试过了,会挂,你可以试试 |
I just tried using quotation marks and it failed. You can try it. |
这里的 CMAKE_MODULE_LINKER_FLAGS 是指啥? c++ module?为啥用的是 shared flags |
https://cmake.org/cmake/help/latest/command/add_library.html
通俗来讲就是python里.pyd之类的动态库,不用来链接只用来LoadLibrary动态加载的 |
这样?再试试呢 1e9846e
这种,cmake 不会使用 shared linker flags? |
现在的 patch 可以了么 |
Is the current patch OK? |
是的,现在这样可以了 |
https://zhuanlan.zhihu.com/p/437404485
|
暂时没空看,你先调调,可以直接来个 pr 过来 |
I don’t have time to watch it at the moment. You can adjust it first. You can send me a PR directly. |
再试试 b6a04f8 |
Try again b6a04f8 |
还不行,有点问题,等这个 patch #5850 |
应该是 |
It should be |
不行,还有 |
改成 ; 后,编译直接报错了
|
After changing to ;, the compilation directly reported an error
|
感觉 add_compile_options 这个坑也挺多,加 flags 比直接设置 CMAKE_CXX_FLAGS 还麻烦,目前没啥好办法,如果拆成多个 add_compile_options 配置, 不行就只能先暂时禁用 add_compile_options 了。 你可以试试 有啥解决办法。 |
I feel that add_compile_options has a lot of pitfalls. Adding flags is more troublesome than directly setting CMAKE_CXX_FLAGS. There is currently no good solution. If it is split into multiple add_compile_options configurations, If not, you can only temporarily disable add_compile_options. You can try to find any solutions. |
我暂时先 revert 了,等回头有空再改进 |
I'll revert it for now, and I'll improve it later when I have time. |
你在什么场景下需要该功能?
目前由于cmake的bug https://gitlab.kitware.com/cmake/cmake/-/issues/15427 CMAKE_CXX_FLAGS 不仅会出现在编译过程,还会出现在链接过程中(视generator不同而行为不同),虽然大部分flag会被链接器忽略,但仍然留下了隐患;并且这个变量会在项目中被修改、覆盖,不一定能起到期待的效果。根据文档 https://cmake.org/cmake/help/latest/command/add_compile_options.html add_compile_options是新的加编译选项方式,更加安全、灵活(使用generator expression而不是硬编码语言)。使用add_compile_options的好处有三:
xmake/xmake/modules/package/tools/cmake.lua
Lines 1203 to 1235 in 578338f
目前xmake的shrink功能也为使用 add_compile_options 留下了空间。缺点仅仅是要求cmake 3.13,但目前cmake已经到3.31了,要求cmake 3.13并不过分。
此外,链接时也有更加灵活的add_link_options可用 https://cmake.org/cmake/help/latest/command/add_link_options.html 但不支持为静态库指定flag,并且现有方案没有显著bug。唯一问题是package.tools.cmake中缺少了CMAKE_MODULE_LINKER_FLAGS,这个变量指定为和shflags一样就行。
描述可能的解决方案
set(CMAKE_CXX_FLAGS ...)
等替换成add_compile_options($<$<COMPILE_LANGUAGE:CXX>:...>)
;set(CMAKE_MODULE_LINKER_FLAGS ${CMAKE_SHARED_LINKER_FLAGS})
或者改用新的add_link_options API描述你认为的候选方案
GPT 回复使用add_compile_options同时为C/C++指定compile option的方式:
在CMake中,使用
add_compile_options
配合生成表达式$<OR:...>
和$<COMPILE_LANGUAGE:...>
,可以根据不同的编程语言来指定编译选项,同时适用于C和C++。用法示例
假设我们希望在整个项目中为C和C++代码都添加某个编译选项,比如
-Wall
(开启所有警告),而-std=c99
仅应用于C代码:解释
$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-Wall>
:指定-Wall
选项适用于C和C++两种语言。$<COMPILE_LANGUAGE:C>:-std=c99>
:仅当编译C代码时才使用-std=c99
选项。这种写法使得CMake在编译时动态应用编译选项,并确保不同语言有适用的选项,提升了灵活性。
其他信息
CMAKE_CXX_FLAGS出现在链接中
The text was updated successfully, but these errors were encountered: