Skip to content
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

custom toolchain xmake once success,but xmake again raise exception #3545

Closed
gongyi-cn opened this issue Mar 21, 2023 · 7 comments
Closed

custom toolchain xmake once success,but xmake again raise exception #3545

gongyi-cn opened this issue Mar 21, 2023 · 7 comments
Labels
Milestone

Comments

@gongyi-cn
Copy link

gongyi-cn commented Mar 21, 2023

Xmake Version

2.7.7

Operating System Version and Architecture

Windows 10 专业版22H2

Describe Bug

my toolchain is armcc, but I don't install mdk, so I add it by custom toolchain reference xmake manual.
1.xmake build is ok when first build target.
2.But if I don't xmake clean, then xmake build it again , it raise execption

我的工具链是armcc,但是我没有安装mdk,希望使用xmake的custom toolchain功能添加armcc
问题的复现步骤为:
1.第一次执行xmake构建成功,构建日志参考Expected Behavior
2.不执行xmake clean,再次执行xmake进行构建,发生异常
(如果xmake clean后再构建不会出现异常)
我刚开始学习xmake,搜索了已有issue,并查看了手册没有找到该问题,能否帮忙确认是否为bug?
非常感谢

Expected Behavior

#first build success log
PS D:\code\arm_test\issue> xmake -v
[ 25%]: cache compiling.release arm\main.c
armcc -c -ID:/software/ARMCompiler5.05u1/include -g -O0 --cpu=Cortex-R5 -o build.objs\arm\windows\x64\release\arm\main.c.obj arm\main.c
[ 50%]: linking.release arm.axf
armlink -o build\windows\x64\release\arm.axf build.objs\arm\windows\x64\release\arm\main.c.obj --cpu=Cortex-R5
[100%]: build ok!
PS D:\code\arm_test\issue>

Project Configuration

PS D:\code\arm_test\issue> xmake -vD
checking for armcc ... ok
checking for the c compiler (cc) ... armcc
error: @programdir\modules\private\async\runjobs.lua:256: @programdir\modules\private\tools\armcc\parse_deps.lua:68: attempt to index a nil value (local 'includefile')
stack traceback:
[@programdir\modules\private\tools\armcc\parse_deps.lua:68]:
[@programdir\modules\core\project\depend.lua:32]: in function '_load_depfiles'
[@programdir\modules\core\project\depend.lua:63]: in function 'load'
[@programdir\modules\private\action\build\object.lua:46]: in function 'script'
[@programdir\modules\private\action\build\object.lua:104]: in function 'build_object'
[@programdir\modules\private\action\build\object.lua:129]: in function 'jobfunc'
[@programdir\modules\private\async\runjobs.lua:232]:

stack traceback:
[C]: in function 'error'
@programdir\core\base\os.lua:898: in function 'os.raiselevel'
(...tail calls...)
@programdir\modules\private\async\runjobs.lua:256: in field 'catch'
@programdir\core\sandbox\modules\try.lua:123: in global 'try'
@programdir\modules\private\async\runjobs.lua:218: in upvalue 'cotask'
@programdir\core\base\scheduler.lua:404: in function <@programdir\core\base\scheduler.lua:397>

PS D:\code\arm_test\issue> xmake f -cvD
checking for platform ... windows
checking for architecture ... x64
checkinfo: cannot runv(vswhere.exe -?), No such file or directory
checking for vswhere.exe ... no
checkinfo: cannot runv(vswhere.exe -?), No such file or directory
checking for vswhere ... no
checking for Microsoft Visual Studio (x64) version ... no
checkinfo: cannot runv(clang.exe --version), No such file or directory
checking for clang ... no
checkinfo: cannot runv(zig.exe version), No such file or directory
checking for zig ... no
checkinfo: cannot runv(zig.exe version), No such file or directory
checking for zig ... no
checking for armcc.exe ... ok
checking for armlink ... ok
checking for the linker (ld) ... armlink
configure
{
buildir = build
ccache = true
clean = true
plat = windows
mode = release
kind = static
arch = x64
ndk_stdcxx = true
host = windows
}

-- this is my project xmake.lua file content, source file only a main.c(printf hello world)
toolchain("custom_armcc")
set_homepage("https://www2.keil.com/mdk5/compiler/5")
set_description("ARM Compiler Version 5 of Keil MDK")

set_kind("cross")
set_toolset("cc", "armcc")
set_toolset("cxx", "armcc")
set_toolset("ld", "armlink")
set_toolset("ar", "armar")
set_toolset("as", "armasm")

-- check toolchain
on_check(function (toolchain)
    return import("lib.detect.find_tool")("custom_armcc")
end)

toolchain_end()

target("arm")
-- set_default(false)
set_kind("binary")
add_files("arm/*.c")
add_includedirs("D:/software/ARMCompiler5.05u1/include")
set_policy("check.auto_ignore_flags", false)
set_policy("check.auto_map_flags", false)
set_extension(".axf")
set_toolchains('custom_armcc')
add_cflags("-g", "-O0", "--cpu=Cortex-R5")
add_ldflags("--cpu=Cortex-R5")

Additional Information and Error Logs

PS D:\code\arm_test\issue> xmake -v
error: ...mdir\core\sandbox\modules\import\core\base\scheduler.lua:56: attempt to index a nil value (local 'includefile')
stack traceback:
@programdir\core\base\utils.lua:290: in function <@programdir\core\base\utils.lua:280>
[C]: in function 'error'
@programdir\core\base\os.lua:898: in function 'base/os.raiselevel'
(...tail calls...)
...mdir\core\sandbox\modules\import\core\base\scheduler.lua:56: in field 'co_start_withopt'
@programdir\modules\private\async\runjobs.lua:217: in function <@programdir\modules\private\async\runjobs.lua:162>
[C]: in function 'xpcall'
@programdir\core\base\utils.lua:280: in function 'sandbox/modules/utils.trycall'
@programdir\core\base\scheduler.lua:520: in function 'base/scheduler.co_group_begin'
...mdir\core\sandbox\modules\import\core\base\scheduler.lua:94: in field 'co_group_begin'
@programdir\modules\private\async\runjobs.lua:162: in function <@programdir\modules\private\async\runjobs.lua:56>
(...tail calls...)
@programdir\actions\build\build.lua:259: in function <@programdir\actions\build\build.lua:247>
(...tail calls...)
@programdir\actions\build\main.lua:108: in global '_do_build'
@programdir\actions\build\main.lua:155: in function <@programdir\actions\build\main.lua:149>
[C]: in function 'xpcall'
@programdir\core\base\utils.lua:280: in function 'sandbox/modules/utils.trycall'
@programdir\core\sandbox\modules\try.lua:117: in global 'try'
@programdir\actions\build\main.lua:147: in function <@programdir\actions\build\main.lua:113>
(...tail calls...)
[C]: in function 'xpcall'
@programdir\core\base\utils.lua:280: in function 'sandbox/modules/utils.trycall'
(...tail calls...)
@programdir\core\base\task.lua:501: in function 'base/task.run'
@programdir\core\main.lua:297: in upvalue 'cotask'
@programdir\core\base\scheduler.lua:404: in function <@programdir\core\base\scheduler.lua:397>

@gongyi-cn gongyi-cn added the bug label Mar 21, 2023
@waruqi
Copy link
Member

waruqi commented Mar 22, 2023

不是有内置 armcc 工具链么,干嘛不用?

贴下完整 xmake f -cvD 配置的命令和 logs,还有 xmake -vD

@gongyi-cn
Copy link
Author

非常感谢回复,因为我没有安装mdk只安装了armcc,所以没有使用内置选项,同时我也想使用自定义工具链功能。
下面是xmake f -cvD和xmake -vD的信息:

PS D:\code\arm_test\issue> xmake -vD
checking for armcc ... ok
checking for the c compiler (cc) ... armcc
error: @programdir\modules\private\async\runjobs.lua:256: @programdir\modules\private\tools\armcc\parse_deps.lua:68: attempt to index a nil value (local 'includefile')
stack traceback:
[@programdir\modules\private\tools\armcc\parse_deps.lua:68]:
[@programdir\modules\core\project\depend.lua:32]: in function '_load_depfiles'
[@programdir\modules\core\project\depend.lua:63]: in function 'load'
[@programdir\modules\private\action\build\object.lua:46]: in function 'script'
[@programdir\modules\private\action\build\object.lua:104]: in function 'build_object'
[@programdir\modules\private\action\build\object.lua:129]: in function 'jobfunc'
[@programdir\modules\private\async\runjobs.lua:232]:

stack traceback:
[C]: in function 'error'
@programdir\core\base\os.lua:898: in function 'os.raiselevel'
(...tail calls...)
@programdir\modules\private\async\runjobs.lua:256: in field 'catch'
@programdir\core\sandbox\modules\try.lua:123: in global 'try'
@programdir\modules\private\async\runjobs.lua:218: in upvalue 'cotask'
@programdir\core\base\scheduler.lua:404: in function <@programdir\core\base\scheduler.lua:397>

PS D:\code\arm_test\issue> xmake f -cvD
checking for platform ... windows
checking for architecture ... x64
checkinfo: cannot runv(vswhere.exe -?), No such file or directory
checking for vswhere.exe ... no
checkinfo: cannot runv(vswhere.exe -?), No such file or directory
checking for vswhere ... no
checking for Microsoft Visual Studio (x64) version ... no
checkinfo: cannot runv(clang.exe --version), No such file or directory
checking for clang ... no
checkinfo: cannot runv(zig.exe version), No such file or directory
checking for zig ... no
checkinfo: cannot runv(zig.exe version), No such file or directory
checking for zig ... no
checking for armcc.exe ... ok
checking for armlink ... ok
checking for the linker (ld) ... armlink
configure
{
buildir = build
ccache = true
clean = true
plat = windows
mode = release
kind = static
arch = x64
ndk_stdcxx = true
host = windows
}

@waruqi
Copy link
Member

waruqi commented Mar 22, 2023

这里返回 nil 了,

includefile = includefile:split(".o:", {plain = true})[2]

应该是 .d 文件解析问题,你可以直接调下这里,提个 pr 过来改进下。。

或者提供下出错的 depsdata 完整输入数据

@gongyi-cn
Copy link
Author

local plain = {plain = true}
line = line:replace("\\ ", space_placeholder, plain)
for _, includefile in ipairs(line:split('\n', plain)) do
if is_host("windows") and includefile:match("^%w\\:") then
includefile = includefile:replace("\\:", ":", plain)
end
includefile = includefile:replace(space_placeholder, ' ', plain)
includefile = includefile:split(".o:", {plain = true})[2]
includefile = includefile:replace(' ', '', plain)
if #includefile > 0 then
includefile = _normailize_dep(includefile, projectdir)

我增加了一些打印信息并修改了split参数为".obj'如下,虽然构建成功了,但是我不确定是否正确且规范?
local plain = {plain = true}
line = line:replace("\ ", space_placeholder, plain)
for _, includefile in ipairs(line:split('\n', plain)) do
print("##0",includefile)
if is_host("windows") and includefile:match("^%w\:") then
includefile = includefile:replace("\:", ":", plain)
end
print("##1",includefile)
includefile = includefile:replace(space_placeholder, ' ', plain)
print("##2",includefile)
includefile = includefile:split(".obj:", {plain = true})[2]
print("##3",includefile)
includefile = includefile:replace(' ', '', plain)
if #includefile > 0 then
includefile = _normailize_dep(includefile, projectdir)

修改后的打印信息

PS D:\code\arm_test\issue> xmake -vD
##0 build.objs\arm\windows\x64\release\arm\main.c.obj: arm\main.c
##1 build.objs\arm\windows\x64\release\arm\main.c.obj: arm\main.c
##2 build.objs\arm\windows\x64\release\arm\main.c.obj: arm\main.c
##3 arm\main.c
##0 build.objs\arm\windows\x64\release\arm\main.c.obj: D:\software\ARMCompiler5.05u1\bin..\include\stdio.h
##1 build.objs\arm\windows\x64\release\arm\main.c.obj: D:\software\ARMCompiler5.05u1\bin..\include\stdio.h
##2 build.objs\arm\windows\x64\release\arm\main.c.obj: D:\software\ARMCompiler5.05u1\bin..\include\stdio.h
##3 D:\software\ARMCompiler5.05u1\bin..\include\stdio.h
##0 build.objs\arm\windows\x64\release\arm\main.c.obj: D:\software\ARMCompiler5.05u1\bin..\include\stdlib.h
##1 build.objs\arm\windows\x64\release\arm\main.c.obj: D:\software\ARMCompiler5.05u1\bin..\include\stdlib.h
##2 build.objs\arm\windows\x64\release\arm\main.c.obj: D:\software\ARMCompiler5.05u1\bin..\include\stdlib.h
##3 D:\software\ARMCompiler5.05u1\bin..\include\stdlib.h

build cache stats:
cache directory: build.build_cache
cache hit rate: 0%
cache hit: 0
cache miss: 0
new cached files: 0
remote cache hit: 0
remote new cached files: 0
preprocess failed: 0
compile fallback count: 0

[100%]: build ok!

@waruqi
Copy link
Member

waruqi commented Mar 23, 2023

我大概知道了,用 armcc 等工具链,都属于交叉编译,你得切编译平台到 cross ,而不是用默认的 Windows 平台

xmake f -p cross --toolchain=armcc

否则会走到一些 windows 编译逻辑,导致一些问题,比如这个里面的 .obj 和 .o 处理。。

至于现在这个解析问题,我会修复,但建议还是切到 cross 上编译。。

waruqi added a commit that referenced this issue Mar 23, 2023
@waruqi
Copy link
Member

waruqi commented Mar 23, 2023

更新下 再试试

xmake update -s dev

@waruqi waruqi added this to the v2.7.8 milestone Mar 23, 2023
@gongyi-cn
Copy link
Author

好的,谢谢

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants