xmake在xmake.lua中提供了 $(varname)
的语法,来支持内置变量的获取,例如:
add_cxflags("-I$(buildir)")
它将会在在实际编译的时候,将内置的 buildir
变量转换为实际的构建输出目录:-I./build
并且这些变量在自定义脚本中,也是可以支持的,例如:
target("test")
after_build(target)
print("build ok for $(plat)!")
end
这将会在编译完后,输出:
build ok for macosx!
这些内置变量,大部分都是通过配置的时候,缓存的配置参数中获取,例如:
$ xmake config --plat=macosx
也有些内置变量,不需要通过配置中获取到,例如:
print("$(os)")
print("$(host)")
print("$(tmpdir)")
print("$(curdir)")
最近在xmake中,用lua的协程实现了多任务编译,效果还是不错的,不过后来发现一个问题:
如果所有编译进程都在处理编译,没有退出的时候,xmake的lua主进程会不断地在这些任务间,不停的切换轮询进程的状态,但是有没有机会执行其他任务,导致cpu过高,抢占了编译进程的cpu时间。。
那如果在等不到完成的进程时候,加入sleep等待呢,又会导致编译速度变慢,没法合理利用cpu。。
因此,为了解决这个问题,我打算扩展下lua的接口,实现了一个跨平台的多进程等待接口: process.waitlist
实现多个未完成进程的同时等待,让出xmake主进程的cpu时间,给其他编译进程充分利用
xmake中的lua代码如下:
-- wait processes
local tasks_finished = {}
local procs_count = #procs
if procs_count > 0 then
-- wait them
local procinfos = process.waitlist(procs, ifelse(procs_count < jobs, 0, -1))
for _, procinfo in ipairs(procinfos) do
-- the process info
local proc = procinfo[1]
local procid = procinfo[2]
local status = procinfo[3]
-- check
assert(procs[procid] == proc)
-- resume this task
local job_task = tasks[procid]
local job_proc = coroutine.resume(job_task, 1, status)
-- the other process is pending for this task?
if coroutine.status(job_task) ~= "dead" then
-- check
assert(job_proc)
-- update the pending process
procs[procid] = job_proc
-- this task has been finised?
else
-- mark this task as finised
tasks_finished[procid] = true
end
end
end
xmake run -d program ...
windows/linux/macosx
等大部分pc平台import
根目录错误问题xmake默认在编译完程序后,可以通过以下命令运行指定目标程序:
$xmake run [target] [arguments] ...
并且在linux/macosx下面,目前已经支持关联调试器,去直接调试指定目标了,只需要加上-d/--debug
参数选项:
$xmake run -d [target] [arguments] ...
默认情况下,xmake在macosx下用的是lldb,在linux下用的是gdb,调试器xmake会在配置的时候去自动检测,如果需要指定调试器路径,可以手动去配置它:
$xmake f --debugger=/usr/bin/gdb
$xmake run -d demo
需要注意的是,目前windows上还没有支持,不过已经在计划中了,后续不久就会去支持它。。