module ('general-gnu-gcc-rules', package.seeall) require "general-rules" local function link_program (p_targets, p_sources, p_environment) local cmd = "g++ -o " .. p_targets:at (0):full_name () for _, itm in ipairs (p_environment:items ('LIB_PATH')) do for _, pth in ipairs (dmt.resolve_possible_paths (itm)) do cmd = cmd .. " -L" .. pth end end for _, itm in p_sources:nodes () do cmd = cmd .. " " .. itm:full_name () end for _, itm in ipairs (p_environment:items ('LIB')) do cmd = cmd .. " -l".. itm end return cmd end local function link_static_library (p_targets, p_sources, p_environment) local cmd = "ar rs " .. p_targets:at (0):full_name () for _, itm in p_sources:nodes () do cmd = cmd .. " " .. itm:full_name () end return cmd end local function link_shared_library (p_targets, p_sources, p_environment) local cmd = "g++ -shared -o " .. p_targets:at (0):full_name () for _, itm in ipairs (p_environment:items ('LIB_PATH')) do for _, pth in ipairs (dmt.resolve_possible_paths (itm)) do cmd = cmd .. " -L" .. pth end end for _, itm in p_sources:nodes () do cmd = cmd .. " " .. itm:full_name () end for _, itm in ipairs (p_environment:items ('LIB')) do cmd = cmd .. " -l".. itm end return cmd end local function static_library_name (p_in_name) local str = string.reverse (p_in_name) local idx = 0 for cnt = 1, #str do if string.sub (str, cnt, cnt) == '/' or string.sub (str, cnt, cnt) == '\\' then idx = -cnt break end end str = string.sub (p_in_name, 1, idx) .. 'lib' .. string.sub (p_in_name, idx + 1) .. '.a' return str end local function shared_library_name (p_in_name) local str = string.reverse (p_in_name) local idx = 0 for cnt = 1, #str do if string.sub (str, cnt, cnt) == '/' or string.sub (str, cnt, cnt) == '\\' then idx = -cnt break end end str = string.sub (p_in_name, 1, idx) .. 'lib' .. string.sub (p_in_name, idx + 1) .. '.so' return str end local function define_rules () dmt.associate_suffix ("static-object", "o") dmt.associate_suffix ("shared-object", "os") dmt.associate_generator ("static-library", static_library_name) dmt.associate_generator ("shared-library", shared_library_name) end local function register_builders () local tcn = dmt.tool_chain ("gnu-gcc") tcn:add_builder ("link-program", link_program) tcn:add_builder ("link-static-library", link_static_library) tcn:add_builder ("link-shared-library", link_shared_library) end function init_module () define_rules () register_builders () dmt.set_tool_chain ("gnu-gcc") end init_module ()