67 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
import("core.project.depend")
 | 
						|
local genList = {}
 | 
						|
function cmd_compile(genfile, sourcefile, template, macro, define)
 | 
						|
    if genList[genfile] then 
 | 
						|
        return 
 | 
						|
    end
 | 
						|
    import("find_sdk")
 | 
						|
    local meta = find_sdk.find_my_program("refl")
 | 
						|
    template = template or path.join(meta.sdkdir, "template")
 | 
						|
    if not macro then --优先使用库定义
 | 
						|
        macro = path.join(os.projectdir(), "engine/3rdparty/zlib/include/refl/macro.h")
 | 
						|
        if not os.exists(macro) then
 | 
						|
            macro = path.join(os.curdir(), "macro.h")
 | 
						|
        end
 | 
						|
    end
 | 
						|
    argv = {"build", sourcefile, "-o", genfile, "-t", template, "-m", macro}
 | 
						|
    if define then
 | 
						|
        table.insert(argv, "-d")
 | 
						|
        table.insert(argv, define)
 | 
						|
    end
 | 
						|
    genList[genfile] = true
 | 
						|
    print("cmd_meta_compile", genfile)
 | 
						|
    os.execv(meta.program, argv)
 | 
						|
    return argv
 | 
						|
end
 | 
						|
 | 
						|
function _listen_gen_file(target, batch, template, macro, define)
 | 
						|
    genfile, sourcefile = batch[1], batch[2]
 | 
						|
    local dependfile = target:dependfile(genfile)
 | 
						|
    depend.on_changed(
 | 
						|
        function()
 | 
						|
            cmd_compile(batch[1], batch[2], template, macro, define)
 | 
						|
        end,
 | 
						|
        {dependfile = dependfile, files = sourcefile}
 | 
						|
    )
 | 
						|
end
 | 
						|
function gen(target)
 | 
						|
    local gen_batch = target:data("codegen.batch")
 | 
						|
    if not gen_batch then
 | 
						|
        return
 | 
						|
    end
 | 
						|
    local template = target:extraconf("rules", "c++.codegen", "template")
 | 
						|
    local macro = target:extraconf("rules", "c++.codegen", "macro")
 | 
						|
    local define = target:extraconf("rules", "c++.codegen", "define")
 | 
						|
    for _, batch in ipairs(gen_batch) do
 | 
						|
        if batch[2] then
 | 
						|
            _listen_gen_file(target, batch, template, macro, define)
 | 
						|
        end
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
function main(target, headerfiles)
 | 
						|
    local sourcedir = path.join(target:autogendir({root = true}), target:plat(), "inl")
 | 
						|
    if not os.isdir(sourcedir) then
 | 
						|
        os.mkdir(sourcedir)
 | 
						|
    end
 | 
						|
    target:add("includedirs", sourcedir, {public = true})
 | 
						|
    local gen_batch = {}
 | 
						|
    for idx, headerfile in pairs(headerfiles) do
 | 
						|
        -- batch
 | 
						|
        sourcefile = path.join(sourcedir, path.basename(headerfile) .. "_gen.inl")
 | 
						|
        table.insert(gen_batch, {sourcefile, headerfile})
 | 
						|
    end
 | 
						|
    -- save unit batch
 | 
						|
    target:data_set("codegen.batch", gen_batch)
 | 
						|
end
 |