123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293 |
- ---
- -- Create a source or binary release package.
- ---
- ---
- -- Helper function: run a command while hiding its output.
- ---
- local function execQuiet(cmd, ...)
- cmd = string.format(cmd, ...) .. " > _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 allowedCompilers = {}
- if os.ishost("windows") then
- allowedCompilers = {
- "vs2019",
- "vs2017",
- "vs2015",
- "vs2013",
- "vs2012",
- "vs2010",
- "vs2008",
- "vs2005",
- }
- elseif os.ishost("linux") or os.ishost("bsd") then
- allowedCompilers = {
- "gcc",
- "clang",
- }
- elseif os.ishost("macosx") then
- allowedCompilers = {
- "clang",
- }
- else
- error("Unsupported host os", 0)
- end
- local usage = 'usage is: package <branch> <type> [<compiler>]\n' ..
- ' <branch> is the name of the release branch to target\n' ..
- ' <type> is one of "source" or "binary"\n' ..
- ' <compiler> (default: ' .. allowedCompilers[1] .. ') is one of ' .. table.implode(allowedCompilers, "", "", " ")
- if #_ARGS ~= 2 and #_ARGS ~= 3 then
- error(usage, 0)
- end
- local branch = _ARGS[1]
- local kind = _ARGS[2]
- local compiler = _ARGS[3] or allowedCompilers[1]
- if kind ~= "source" and kind ~= "binary" then
- print("Invalid package kind: "..kind)
- error(usage, 0)
- end
- if not table.contains(allowedCompilers, compiler) then
- print("Invalid compiler: "..compiler)
- error(usage, 0)
- end
- local compilerIsVS = compiler:startswith("vs")
- --
- -- Make sure I've got what I've need to be happy.
- --
- local required = { "git" }
- if not compilerIsVS then
- table.insert(required, "make")
- table.insert(required, compiler)
- end
- for _, value in ipairs(required) do
- local z = execQuiet("%s --version", value)
- if not z then
- error("required tool '" .. value .. "' not found", 0)
- end
- end
- --
- -- Figure out what I'm making.
- --
- os.chdir("..")
- local text = os.outputof(string.format('git show %s:src/host/premake.h', branch))
- local _, _, version = text:find('VERSION%s*"([%w%p]+)"')
- local pkgName = "premake-" .. version
- local pkgExt = ".zip"
- if kind == "binary" then
- pkgName = pkgName .. "-" .. os.host()
- if not os.istarget("windows") then
- pkgExt = ".tar.gz"
- end
- else
- pkgName = pkgName .. "-src"
- 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.mkdir("release")
- os.chdir("release")
- os.rmdir(pkgName)
- print("Cloning source code")
- local z = execQuiet("git clone .. %s -b %s --recurse-submodules --depth 1 --shallow-submodules", pkgName, branch)
- if not z then
- error("clone failed", 0)
- end
- os.chdir(pkgName)
- --
- -- Bootstrap Premake in the newly cloned repository
- --
- print("Bootstrapping Premake...")
- if compilerIsVS then
- z = os.execute("Bootstrap.bat " .. compiler)
- else
- z = os.execute("make -j -f Bootstrap.mak " .. os.host())
- end
- if not z then
- error("Failed to Bootstrap Premake", 0)
- end
- local premakeBin = path.translate("./bin/release/premake5")
- --
- -- Make absolutely sure the embedded scripts have been updated
- --
- print("Updating embedded scripts...")
- local z = execQuiet("%s embed %s", premakeBin, iif(kind == "source", "", "--bytecode"))
- if not z then
- error("failed to update the embedded scripts", 0)
- end
- --
- -- Generate a source package.
- --
- if kind == "source" then
- local function genProjects(parameters)
- if not execQuiet("%s %s", premakeBin, parameters) then
- error("failed to generate project for "..parameters, 0)
- end
- end
- os.rmdir("build")
- print("Generating project files...")
- local ignoreActions = {
- "clean",
- "embed",
- "package",
- "self-test",
- "test",
- "gmake", -- deprecated
- }
- local perOSActions = {
- "gmake2",
- "codelite"
- }
- for action in premake.action.each() do
- if not table.contains(ignoreActions, action.trigger) then
- if table.contains(perOSActions, action.trigger) then
- local osList = {
- { "windows", },
- { "unix", "linux" },
- { "macosx", },
- { "bsd", },
- }
- for _, os in ipairs(osList) do
- local osTarget = os[2] or os[1]
- genProjects(string.format("--to=build/%s.%s --os=%s %s", action.trigger, os[1], osTarget, action.trigger))
- end
- else
- genProjects(string.format("--to=build/%s %s", action.trigger, action.trigger))
- end
- end
- end
- print("Creating source code package...")
- local excludeList = {
- ".gitignore",
- ".gitattributes",
- ".gitmodules",
- ".travis.yml",
- ".editorconfig",
- "appveyor.yml",
- "Bootstrap.*",
- "packages/*",
- }
- local includeList = {
- "build",
- "src/scripts.c",
- }
- if not execQuiet("git rm --cached -r -f --ignore-unmatch "..table.concat(excludeList, ' ')) or
- not execQuiet("git add -f "..table.concat(includeList, ' ')) or
- not execQuiet("git stash") or
- not execQuiet("git archive --format=zip -9 -o ../%s.zip --prefix=%s/ stash@{0}", pkgName, pkgName) or
- not execQuiet("git stash drop stash@{0}")
- then
- error("failed to archive release", 0)
- end
- os.chdir("..")
- end
- --
- -- Create a binary package for this platform. This step requires a working
- -- GNU/Make/GCC environment.
- --
- if kind == "binary" then
- print("Building binary...")
- os.chdir("bin/release")
- local addCommand = "git add -f premake5%s"
- local archiveCommand = "git archive --format=%s -o ../../../%s%s stash@{0} -- ./premake5%s"
- if os.ishost("windows") then
- addCommand = string.format(addCommand, ".exe")
- archiveCommand = string.format(archiveCommand, "zip -9", pkgName, pkgExt, ".exe")
- else
- addCommand = string.format(addCommand, "")
- archiveCommand = string.format(archiveCommand, "tar.gz", pkgName, pkgExt, "")
- end
- if not execQuiet(addCommand) or
- not execQuiet("git stash") or
- not execQuiet(archiveCommand) or
- not execQuiet("git stash drop stash@{0}")
- then
- error("failed to archive release", 0)
- end
- os.chdir("../../..")
- end
- --
- -- Clean up
- --
- -- Use RMDIR token instead of os.rmdir to force remove .git dir which has read only files
- execQuiet(os.translateCommands("{RMDIR} "..pkgName))
|