--- -- Create a source or binary release package. --- --- -- Helper function: run a command while hiding its output. --- local function execQuiet(cmd, ...) cmd = string.format(cmd, unpack(arg)) .. " > _output_.log 2> _error_.log" local z = os.execute(cmd) os.remove("_output_.log") os.remove("_error_.log") return z end --- -- Check the command line arguments, and show some help if needed. --- local usage = 'usage is: package \n' .. ' is the name of the release branch to target\n' .. ' is one of "source" or "binary"\n' if #_ARGS ~= 2 then error(usage, 0) end local branch = _ARGS[1] local kind = _ARGS[2] if kind ~= "source" and kind ~= "binary" then error(usage, 0) end -- -- Make sure I've got what I've need to be happy. -- local required = { "hg", "make", "gcc", "premake5", "zip" } for _, value in ipairs(required) do local z = execQuiet("%s --version", value) if z ~= 0 then error("required tool '" .. value .. "' not found", 0) end end -- -- Figure out what I'm making. -- local f = io.open("../src/host/premake.c", "r") local text = f:read("*a") f:close() local _, _, version = text:find('VERSION%s*"([%w%p]+)"') local pkgName = "premake-" .. version local pkgExt = ".zip" if not os.is("windows") and kind == "binary" then pkgExt = ".tar.gz" end -- -- Make sure I'm sure. -- printf("") printf("I am about to create a %s package", kind:upper()) printf(" ...named release/%s%s", pkgName, pkgExt) printf(" ...from the %s branch", branch) printf("") printf("Does this look right to you? If so, press [Enter] to begin.") io.read() -- -- Pull down the release branch. -- print("Preparing release folder") os.chdir("..") os.mkdir("release") os.chdir("release") os.rmdir(pkgName) print("Cloning source code") local z = os.executef("hg clone .. -r %s %s", branch, pkgName) if z ~= 0 then error("clone failed", 0) end -- -- Make absolutely sure the embedded scripts have been updated -- print("Updating embedded scripts...") os.chdir(pkgName) z = execQuiet("premake5 embed") if z ~= 0 then error("failed to update the embedded scripts", 0) end -- -- Generate a source package. -- if kind == "source" then print("Cleaning up the source tree...") os.rmdir("packages") local modules = table.join(".", os.matchdirs("modules/*")) for _, module in ipairs(modules) do for _, name in ipairs { ".hg", ".hgcheck" } do os.rmdir(path.join(module, name)) end for _, name in ipairs { ".DS_Store", ".gitignore", ".hgignore", ".hgsub*", ".hgtags" } do os.remove(path.join(module, name)) end end print("Generating project files...") execQuiet("premake5 /to=build/vs2005 vs2005") execQuiet("premake5 /to=build/vs2008 vs2008") execQuiet("premake5 /to=build/vs2010 vs2010") execQuiet("premake5 /to=build/vs2012 vs2012") execQuiet("premake5 /to=build/vs2013 vs2013") execQuiet("premake5 /to=build/gmake.windows /os=windows gmake") execQuiet("premake5 /to=build/gmake.unix /os=linux gmake") execQuiet("premake5 /to=build/gmake.macosx /os=macosx gmake") print("Creating source code package...") os.chdir("..") execQuiet("zip -r9 %s-src.zip %s/*", pkgName, pkgName) end -- -- Create a binary package for this platform. This step requires a working -- GNU/Make/GCC environment. I use MinGW on Windows as it produces the -- smallest binaries. -- if kind == "binary" then print("Building binary...") execQuiet("premake5 gmake") z = execQuiet("make config=release") if z ~= 0 then error("build failed") end os.chdir("bin/release") local name = string.format("%s-%s%s", pkgName, os.get(), pkgExt) if os.is("windows") then execQuiet("zip -9 %s premake5.exe", name) else execQuiet("tar czvf %s premake5", name) end os.copyfile(name, path.join("../../../", name)) os.chdir("../../..") end -- -- Clean up -- os.rmdir(pkgName)