xmake-io / xmake

🔥 A cross-platform build utility based on Lua
https://xmake.io
Apache License 2.0
9.87k stars 776 forks source link

在if判断内通过set_config设置qt路径无效 #5454

Closed AKanTam closed 1 month ago

AKanTam commented 1 month ago

Xmake 版本

xmake v2.9.4+HEAD.e85b001f1

操作系统版本和架构

Windows 10 22H2

描述问题

我使用xmake进行qt的交叉编译,其中需要根据配置的架构选择不同的编译器(arm32/arm64)以及不同的qt,但是在实际使用中发现set_config函数在全局中使用是可以正确设置qt的,但在if is_arch("xxx") then内设置就无效,哪怕在set_config之后立马打印get_config也是空的 image image

期待的结果

希望能够通过如下所示方式根据不同的架构设置不同的qt路径 image

工程配置

add_rules("mode.debug", "mode.release")

-- set toolchain toolchain("arm64") set_kind("standalone") set_sdkdir("D:/Code/arm32/arm-gnu-toolchain-11.3.rel1-mingw-w64-i686-aarch64-none-linux-gnu") toolchain_end() toolchain("arm32") set_kind("standalone") set_sdkdir("D:/Code/arm32/gcc-arm-9.2-2019.12-mingw-w64-i686-arm-none-linux-gnueabihf") toolchain_end()

-- set_config("qt","D:/Softwares/Qt5.15.14-ARMv8")
-- set_config("qt","D:/Softwares/Qt5.15.14-ARMv7")

if is_arch("arm64-v8a") then set_targetdir("binarm64") set_toolchains("arm64") set_config("qt","D:/Softwares/Qt5.15.14-ARMv8") elseif is_arch("armv7","armv7s") then set_targetdir("binarm32") set_toolchains("arm32") set_config("qt","D:/Softwares/Qt5.15.14-ARMv7") elseif is_arch("x86","x64","x86_64") then set_targetdir("bin") set_plat("mingw") set_toolchains("mingw") end

target("widget") add_rules("qt.widgetapp")

add_headerfiles("src/*.h")
add_files("src/*.cpp")
add_files("src/mainwindow.ui")
-- add files with Q_OBJECT meta (only for qt.moc)
add_files("src/mainwindow.h")

附加信息和错误日志

PS D:\Code\qt\xmake\qtwidget> xmake -vD plat: linux arch: armv7
mode: release toolchain:
[ 85%]: linking.release widget D:\Code\arm32\gcc-arm-9.2-2019.12-mingw-w64-i686-arm-none-linux-gnueabihf\bin\arm-none-linux-gnueabihf-g++ -o binarm32\widget build.objs\widget\linux\armv7\release\src\main.cpp.o build.objs\widget\linux\armv7\release\src\mainwindow.cpp.o build.objs\widget\linux\armv7\release\gens\src\moc_mainwindow.cpp.o -LC:\Qt\6.7.0\mingw_64\lib -Wl,-rpath=C:\Qt\6.7.0\mingw_64\lib -s -lQt6Gui -lQt6Widgets -lQt6Core d:/code/arm32/gcc-arm-9.2-2019.12-mingw-w64-i686-arm-none-linux-gnueabihf/bin/../lib/gcc/arm-none-linux-gnueabihf/9.2.1/../../../../arm-none-linux-gnueabihf/bin/ld.exe: C:\Qt\6.7.0\mingw_64\lib\libQt6Widgets.a: error adding symbols: file format not recognized
collect2.exe: error: ld returned 1 exit status error: @programdir\core\main.lua:329: @programdir\actions\build\main.lua:148: @programdir\modules\async\runjobs.lua:325: @programdir\actions\build\kinds\binary.lua:53: @programdir\core\sandbox\modules\os.lua:378: execv(D:\Code\arm32\gcc-arm-9.2-2019.12-mingw-w64-i686-arm-none-linux-gnueabihf\bin\arm-none-linux-gnueabihf-g++ -o binarm32\widget build.objs\widget\linux\armv7\release\src\main.cpp.o build.objs\widget\linux\armv7\release\src\mainwindow.cpp.o build.objs\widget\linux\armv7\release\gens\src\moc_mainwindow.cpp.o -LC:\Qt\6.7.0\mingw_64\lib -Wl,-rpath=C:\Qt\6.7.0\mingw_64\lib -s -lQt6Gui -lQt6Widgets -lQt6Core) failed(1) stack traceback: [C]: in function 'error' [@programdir\core\base\os.lua:973]: [@programdir\core\sandbox\modules\os.lua:378]: in function 'execv' [@programdir\modules\core\tools\gcc.lua:583]: [C]: in function 'xpcall' [@programdir\core\base\utils.lua:275]: [@programdir\core\tool\linker.lua:222]: in function 'link' [@programdir\actions\build\kinds\binary.lua:53]: in function 'callback' [@programdir\modules\core\project\depend.lua:217]: in function 'on_changed' [@programdir\actions\build\kinds\binary.lua:41]: in function '_do_link_target' [@programdir\actions\build\kinds\binary.lua:83]: [@programdir\actions\build\kinds\binary.lua:110]: in function '_link_target' [@programdir\actions\build\kinds\binary.lua:138]: in function 'jobfunc' [@programdir\modules\async\runjobs.lua:241]: [C]: in function 'xpcall' [@programdir\core\base\utils.lua:275]: in function 'trycall' [@programdir\core\sandbox\modules\try.lua:117]: in function 'try' [@programdir\modules\async\runjobs.lua:223]: in function 'cotask' [@programdir\core\base\scheduler.lua:406]:

stack traceback: [C]: in function 'error' @programdir\core\base\os.lua:973: in function 'os.raiselevel' (...tail calls...) @programdir\core\main.lua:329: in upvalue 'cotask' @programdir\core\base\scheduler.lua:406: in function <@programdir\core\base\scheduler.lua:399>

Issues-translate-bot commented 1 month ago

Bot detected the issue body's language is not English, translate it automatically.


Title: Setting the qt path through set_config within the if judgment is invalid

waruqi commented 1 month ago

set_config 等价于 xmake f --xx 的设置,优先于 配置参数解析,而 is_arch 对标 xmake f --arch,要先解析完配置,才能获取值。当然没法生效了。set_config 只能在最顶层使用

Issues-translate-bot commented 1 month ago

Bot detected the issue body's language is not English, translate it automatically.


set_config is equivalent to the setting of xmake f --xx, which takes precedence over configuration parameter parsing, while is_arch is based on xmake f --arch, and the configuration must be parsed before the value can be obtained. Of course it won't take effect. set_config can only be used at the top level