Closed twinstar6980 closed 1 year ago
生成的 CMakeLists.txt 中,有的路径是用 \ 分割的,但 CMake 扫描时会报错
改了下,再试试。xmake update -s dev
在 xmake 中使用 set_languages 设置了 c / c++ 的语言标准,但生成的 CMakeLists.txt 中没有 set(CMAKE_CXX_STANDARD ...) 语句,还需要手动加上。
有的,用的 target_compile_features(testcmake PRIVATE cxx_std_17)
因为要对每个 target 单独设置,CMAKE_CXX_STANDARD 只能用于全局。
add_custom_command(OUTPUT output_core_84AA7D9F
COMMAND echo [ 0%]: compiling.module.release $core$interface$implement
COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_SOURCE_DIR}/build/.objs/core/windows/x64/release/core/interface
COMMAND "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.34.31933/bin/HostX64/x64/cl.exe" -nologo -O2 -fp:fast -std:c++latest -IC:\Users\TwinKleS\Documents\Code\TwinKleS\ToolKit\CoreX -Ithird_party\zlib -D_SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING -DM_system_windows -DM_system=\"windows\" -DM_compiler_msvc -DM_compiler=\"msvc\" -DM_build_release -DM_build=\"release\" -D_CRT_SECURE_NO_WARNINGS -DFMT_HEADER_ONLY -DJS_STRICT_NAN_BOXING -DCONFIG_BIGNUM /EHsc -experimental:module /utf-8 /bigobj /permissive- /Zc:preprocessor /Wall /wd4820 /wd4100 /wd4189 /wd4458 /wd4514 /wd4710 /wd4711 /wd4668 /wd4061 /wd5264 /wd4927 /wd4065 /wd4946 /wd5262 -DNDEBUG -TP -c ${CMAKE_SOURCE_DIR}/core/interface/implement.cpp -Fo${CMAKE_SOURCE_DIR}/build/.objs/core/windows/x64/release/core/interface/implement.cpp.obj -ifcOutput ${CMAKE_SOURCE_DIR}/build/.gens/core/windows/x64/release/rules/modules/cache/$core$interface$implement.ifc -interface
VERBATIM
)
add files 的情况下更新后没问题了,但当我使用 c++modules 时,生成的 add custom command 里的路径依然是 \ ,会导致cmake报错。
这个命令哪来的?你自己的 custom rule 里面的?rule 的 batchcmd 里面,对 path 参数需要 path(xx) 去 wrap 的,才会自动处理路径,参考内置 rule
我没在生成的 cmakelists 里找到 target_compile_features 。
肯定有的,仔细找下
# this is the build file for project
# it is autogenerated by the xmake build system.
# do not edit by hand.
# project
cmake_minimum_required(VERSION 3.15.0)
cmake_policy(SET CMP0091 NEW)
project(testcmake LANGUAGES CXX C)
# target
add_executable(testcmake "")
set_target_properties(testcmake PROPERTIES OUTPUT_NAME "testcmake")
set_target_properties(testcmake PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/build/macosx/x86_64/release")
target_compile_options(testcmake PRIVATE
$<$<COMPILE_LANGUAGE:C>:-target>
$<$<COMPILE_LANGUAGE:CXX>:-target>
$<$<COMPILE_LANGUAGE:C>:x86_64-apple-macos12.6>
$<$<COMPILE_LANGUAGE:CXX>:x86_64-apple-macos12.6>
$<$<COMPILE_LANGUAGE:C>:-isysroot>
$<$<COMPILE_LANGUAGE:CXX>:-isysroot>
$<$<COMPILE_LANGUAGE:C>:/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.0.sdk>
$<$<COMPILE_LANGUAGE:CXX>:/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.0.sdk>
$<$<COMPILE_LANGUAGE:C>:-DNDEBUG>
$<$<COMPILE_LANGUAGE:CXX>:-DNDEBUG>
)
set_target_properties(testcmake PROPERTIES CXX_EXTENSIONS OFF)
target_compile_features(testcmake PRIVATE cxx_std_17) ------------------------> 这里
if(MSVC)
target_compile_options(testcmake PRIVATE $<$<CONFIG:Release>:-Ox -fp:fast>)
else()
target_compile_options(testcmake PRIVATE -O3)
endif()
if(MSVC)
else()
target_compile_options(testcmake PRIVATE -fvisibility=hidden)
endif()
if(MSVC)
set_property(TARGET testcmake PROPERTY
MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
endif()
target_link_libraries(testcmake PRIVATE
z
)
target_link_options(testcmake PRIVATE
-target
x86_64-apple-macos12.6
-isysroot
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.0.sdk
-stdlib=libc++
)
target_sources(testcmake PRIVATE
src/main.cpp
)
不行,自己调下这块代码
xmake :
target('core')
set_languages('c++20')
--set_languages('cxxlatest')
set_kind('binary')
add_files('/m.mpp')
add_files('/main.cpp')
生成的 cmake :
# this is the build file for project
# it is autogenerated by the xmake build system.
# do not edit by hand.
# project
cmake_minimum_required(VERSION 3.15.0)
cmake_policy(SET CMP0091 NEW)
project(core LANGUAGES CXX C)
# target
add_executable(core "")
set_target_properties(core PROPERTIES OUTPUT_NAME "core")
set_target_properties(core PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/build/windows/x64/release")
add_custom_command(OUTPUT output_core_96DF34E5
COMMAND echo [ 0%]: compiling.module.release X
COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_SOURCE_DIR}/build/.objs/core/windows/x64/release
COMMAND "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.34.31933/bin/HostX64/x64/cl.exe" -nologo -std:c++20 /EHsc -experimental:module -TP -c ${CMAKE_SOURCE_DIR}/m.mpp -Fo${CMAKE_SOURCE_DIR}/build/.objs/core/windows/x64/release/m.mpp.obj -ifcOutput ${CMAKE_SOURCE_DIR}/build/.gens/core/windows/x64/release/rules/modules/cache/X.ifc -interface
VERBATIM
)
add_custom_target(target_core_96DF34E5
DEPENDS output_core_96DF34E5
)
add_dependencies(core target_core_96DF34E5)
target_compile_options(core PRIVATE
$<$<COMPILE_LANGUAGE:CXX>:-experimental:module>
)
set_target_properties(core PROPERTIES CXX_EXTENSIONS OFF)
target_compile_features(core PRIVATE cxx_std_20)
if(MSVC)
set_property(TARGET core PROPERTY
MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
endif()
target_link_libraries(core PRIVATE
${CMAKE_SOURCE_DIR}/build/.objs/core/windows/x64/release/m.mpp.obj
)
target_sources(core PRIVATE
main.cpp
)
去掉 add_files('./m.mpp') 后生成的 cmake :
# this is the build file for project
# it is autogenerated by the xmake build system.
# do not edit by hand.
# project
cmake_minimum_required(VERSION 3.15.0)
cmake_policy(SET CMP0091 NEW)
project(core LANGUAGES CXX C)
# target
add_executable(core "")
set_target_properties(core PROPERTIES OUTPUT_NAME "core")
set_target_properties(core PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/build/windows/x64/release")
set_target_properties(core PROPERTIES CXX_EXTENSIONS OFF)
target_compile_features(core PRIVATE cxx_std_20)
if(MSVC)
set_property(TARGET core PROPERTY
MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
endif()
target_sources(core PRIVATE
main.cpp
)
如果我再加一句 add_includedirs('./inc/a') 的话,command里就会多出 -Iinc\a
,是 \
而不是 /
- 看 _add_target_languages 函数里没给 cxxlatest 适配,orz
这个暂时没有很好的适配方案,所以我一直没去搞,cmake 里面我没找到类似 latest 的设置,不能直接写死 c++20 对应 cxxlatest,因为生成的 cmakelist 可能会在不同的编译器上编译使用,也可能会被分发到其他用户设备,不同版本的编译 支持 std 力度不同,有可能是 lastest->c++23,有可能是 c++20 也有可能是 c++17 (老的编译器)
所以建议写明 c++20 或者 c++23 等。。除非哪天 cmake 直接支持了 latest 设置,这样 cmake 内部会根据当前编译器的支持力度,选择合适的 std flags
当然,如果是 msvc,可以改用 flags 的方式,直接设置 -std:c++latest 到 cmakelist 来搞,但这也不通用,对 gcc/clang 无效。
如果我再加一句 add_includedirs('./inc/a') 的话,command里就会多出 -Iinc\a ,是 \ 而不是 /
可以的么,我这 ok。。
add_rules("mode.debug", "mode.release")
set_languages("c++17")
target("testcmake")
set_kind("binary")
add_files("src/*.cpp")
add_includedirs("./inc/a")
# this is the build file for project
# it is autogenerated by the xmake build system.
# do not edit by hand.
# project
cmake_minimum_required(VERSION 3.15.0)
cmake_policy(SET CMP0091 NEW)
project(testcmake LANGUAGES CXX C)
# target
add_executable(testcmake "")
set_target_properties(testcmake PROPERTIES OUTPUT_NAME "testcmake")
set_target_properties(testcmake PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/build/windows/x64/release")
target_include_directories(testcmake PRIVATE
inc/a <--------------------------------------------
)
target_compile_options(testcmake PRIVATE
$<$<COMPILE_LANGUAGE:C>:-DNDEBUG>
$<$<COMPILE_LANGUAGE:CXX>:-DNDEBUG>
)
set_target_properties(testcmake PROPERTIES CXX_EXTENSIONS OFF)
target_compile_features(testcmake PRIVATE cxx_std_17)
if(MSVC)
target_compile_options(testcmake PRIVATE $<$<CONFIG:Release>:-Ox -fp:fast>)
else()
target_compile_options(testcmake PRIVATE -O3)
endif()
if(MSVC)
else()
target_compile_options(testcmake PRIVATE -fvisibility=hidden)
endif()
if(MSVC)
set_property(TARGET testcmake PROPERTY
MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
endif()
target_sources(testcmake PRIVATE
src/main.cpp
)
不是那个,我是说在有 mpp 的情况下,生成的 cmake 会多出 add_custom_command(OUTPUT ...
,这时候再使用 add_includedirs 的话,add_custom_command 的 command 里会多出 -Iinc\a
。
还有一个问题,不知道是不是单纯 clang 的锅,我试着在我的项目里使用 c++ modules ,但在 windows msvc 下编译通过的工程,在 wsl 2 下用 clang 编译就会报出 missing '#include "xxx.h"
(工程内的头文件) ,但在全局模块片段里是 include 了的(每个头文件也都用了 pargam once);切换到 vmware 的 ubuntu 下 clang 编译,会报 build/mapper.txt reading failed 什么的。
只有在使用 modules 时出现了这种错误,传统的 cpp+h 则没有问题,可能是我项目的原因(只有一个 cpp 和 mpp ,全局模块片段里面 include 了100多个 hpp 和其他依赖),我新建了一个小项目尝试但没有复现出这个错误。
还有一个问题,不知道是不是单纯 clang 的锅,我试着在我的项目里使用 c++ modules ,但在 windows msvc 下编译通过的工程,在 wsl 2 下用 clang 编译就会报出
missing '#include "xxx.h"
(工程内的头文件) ,但在全局模块片段里是 include 了的(每个头文件也都用了 pargam once);切换到 vmware 的 ubuntu 下 clang 编译,会报 build/mapper.txt reading failed 什么的。 只有在使用 modules 时出现了这种错误,传统的 cpp+h 则没有问题,可能是我项目的原因(只有一个 cpp 和 mpp ,全局模块片段里面 include 了100多个 hpp 和其他依赖),我新建了一个小项目尝试但没有复现出这个错误。
目前 clang 对 module 支持力度最弱,遇到问题也是正常。。可以先尝试更新到 dev 看看是否 work ,最近做过很多 modules 方面的改进。 xmake update -s dev
如果还是不行,多半是 clang 的问题。
不是那个,我是说在有 mpp 的情况下,生成的 cmake 会多出
add_custom_command(OUTPUT ...
,这时候再使用 add_includedirs 的话,add_custom_command 的 command 里会多出-Iinc\a
。
modules 的 cmakelists 生成支持还不完善,建议最好直接使用 xmake 编译。
emm是用 xmake 编译,但是有些 IDE 需要分析 cmake ,VS 用 vsxmake 是没什么问题,但 clion 好像只支持 cmake ,cmake 生成有问题的话会影响编码时的提示功能(clion 默认 std 好像是14,没在 cmake 里设置 std 的话会导致用到高版本特性的代码飘黄or红
但是有些 IDE 需要分析 cmake
带 modules 的分析,目前各家应该支持也不完善,至少我知道 vscode cpptools 目前还不支持带 modules 的 compile_commands,Clion 就不好说了,就看现在 cmake 都仅仅支持 msvc 的 modules 的程度,我感觉悬,即使生成对 cmakelists.txt ,也不一定能够支持带 modules 的 intelligense.
但是有些 IDE 需要分析 cmake
带 modules 的分析,目前各家应该支持也不完善,至少我知道 vscode cpptools 目前还不支持带 modules 的 compile_commands,Clion 就不好说了,就看现在 cmake 都仅仅支持 msvc 的 modules 的程度,我感觉悬,即使生成对 cmakelists.txt ,也不一定能够支持带 modules 的 intelligense.
umm,我试了下,clion 支持分析 modules ,vs 的 resharper c++ 有实验性的 modules 支持(虽然我的项目让 resharper 罢工了orz),就算抛开 modules ,也应该避免生成的 cmake 文件里 command 的路径符被视作转义符的问题,至少能让 clion 正常分析工程,知道使用的 c++ standard 是什么,否则写个 c++ 17 的代码都会显示警告,写个 concept 都会飘红。。
还有一个问题,不知道是不是单纯 clang 的锅,我试着在我的项目里使用 c++ modules ,但在 windows msvc 下编译通过的工程,在 wsl 2 下用 clang 编译就会报出
missing '#include "xxx.h"
(工程内的头文件) ,但在全局模块片段里是 include 了的(每个头文件也都用了 pargam once);切换到 vmware 的 ubuntu 下 clang 编译,会报 build/mapper.txt reading failed 什么的。 只有在使用 modules 时出现了这种错误,传统的 cpp+h 则没有问题,可能是我项目的原因(只有一个 cpp 和 mpp ,全局模块片段里面 include 了100多个 hpp 和其他依赖),我新建了一个小项目尝试但没有复现出这个错误。目前 clang 对 module 支持力度最弱,遇到问题也是正常。。可以先尝试更新到 dev 看看是否 work ,最近做过很多 modules 方面的改进。 xmake update -s dev
如果还是不行,多半是 clang 的问题。
运行 update 命令报错了,我直接把 /usr/share/xmake chmod 777 后成功,是 bug 么?
不是,仅仅通过官网一键安装脚本安装的,才支持 xmake update 自更新。
如果你是 apt 或者 pacman 装到系统目录的,是无法执行 xmake update,没权限替换。
建议使用一键脚本安装,内置 xmake update 以及 auto complete 等完整特性支持。
不是那个,我是说在有 mpp 的情况下,生成的 cmake 会多出
add_custom_command(OUTPUT ...
,这时候再使用 add_includedirs 的话,add_custom_command 的 command 里会多出-Iinc\a
。
这是因为 modules 里面命令,目前对 project generator 处理上还不完善,有些路径没处理。。可以等 https://github.com/xmake-io/xmake/pull/3182 这个 patch 后再试试,我改进了下
更新下试试,xmake update -s dev 应该可以了
更新后没问题了,麻烦作者了👌
Xmake 版本
2.7.3
操作系统版本和架构
Windows 11 22H2
描述问题
生成的 CMakeLists.txt 中,有的路径是用 \ 分割的,但 CMake 扫描时会报错
在 xmake 中使用 set_languages 设置了 c / c++ 的语言标准,但生成的 CMakeLists.txt 中没有 set(CMAKE_CXX_STANDARD ...) 语句,还需要手动加上。
期待的结果
工程配置
No response
附加信息和错误日志
No response