diff --git a/utilities/mtcompile-program-local.py b/utilities/mtcompile-program-local.py index d2da280..3c5b32a 100755 --- a/utilities/mtcompile-program-local.py +++ b/utilities/mtcompile-program-local.py @@ -61,6 +61,7 @@ def which(prog): for thisPath in os.environ["PATH"].split(os.pathsep): sub_path = os.path.join(thisPath, prog) if os.path.isfile(sub_path): + print("* using {} as {}".format(sub_path, prog)) return sub_path return "" @@ -87,7 +88,7 @@ def endsWithAny(haystack, needles): def containsAny(haystack, needles): for needle in needles: - if haystack.contains(needle): + if needle in haystack: return True return False @@ -97,6 +98,8 @@ def startsWithAny(haystack, needles): if haystack.startswith(needle): return True return False + + # Label must be single-quoted here USAGE_TEXT = """ Usage: {PROGNAME} --options --build @@ -239,6 +242,7 @@ def streamEdit(inPath, replacements): line = re.sub(k, v, line) sources.write(line) + def _UNUSED_evalSed(line, sedStr): """ Mimic sed. @@ -358,7 +362,10 @@ def execute(cmd, shell=True): raise subprocess.CalledProcessError(return_code, cmd) -def RunCmd(cmdParts, exitOnFail=True, shell=True): +def RunCmd(cmdParts, shell=True): + """ + :raises RuntimeError: The process returns a non-zero exit code. + """ # Popen can get confused when arguments contain quotes # (see ) such as @@ -378,30 +385,34 @@ def RunCmd(cmdParts, exitOnFail=True, shell=True): for line in execute(cmdParts, shell=shell): print(line, end="") except subprocess.CalledProcessError as ex: - msg = ("The process '{}' ended with error code {}." + msg = ("The process '{}' failed with error code {}." "".format(" ".join(ex.cmd), ex.returncode)) - if exitOnFail: - print("ERROR: " + msg) - exit(ex.returncode) - else: - print("WARNING: " + msg) + raise RuntimeError(msg) def FixStr(s): - # TODO: make sure this does everything the original does - # (see mtcompile-program.pl) if s is None: return "" + s = re.sub("\s+", " ", s).strip() return s.strip() def GetProgDir(): - # TODO: finish converting this from Perl - # - [x] set PROGNAME + """ + Set the PROGNAME global to this script's name and find the current + working directory in terms of its real path (following symbolic + links). + + This differs from mtcompile-program.pl in that this version gets + the current directory, so that this script doesn't have to be in the + linux-minetest-kit directory. However, due to that, the current + directory must be linux-minetest-kit when running this function + (when running this script). + """ global PROGNAME PROGNAME = os.path.basename(__file__) - return os.getcwd() + return os.path.realpath(os.getcwd()) def GetOptions(nonBoolNames=[], bareArgs=[]): @@ -776,7 +787,7 @@ or rename it. Otherwise, drop the "--safe" switch. if Flags.get("MT_SRC") is not None: if not os.path.isdir(Flags["MT_SRC"]): customExit("{} does not exist.".format(Flags["MT_SRC"])) - print("* using \"{}\" (copying to \"{}\")" + print("* using custom MT_SRC \"{}\" (copying to \"{}\")" "".format(Flags["MT_SRC"], PRODDIR)) shutil.copytree(Flags["MT_SRC"], PRODDIR, copy_function=shutil.copy2) @@ -1003,8 +1014,12 @@ again. print(" ".join(cmdParts)) print("") print("") - RunCmd(cmdParts[:1] + [" ".join(cmdParts[1:])], shell=False) + # RunCmd(cmdParts, shell=True) + # ^ fails due to excessive automatic quotes around params by python + # RunCmd(cmdParts[:1] + [" ".join(cmdParts[1:])], shell=False) # ^ must be false to avoid inserting quotes automatically + # ^ still has problems + os.system(" ".join(cmdParts)) # TODO: use some absolute pathnames as the Perl version does #--------------------------------------------------------------------- @@ -1056,13 +1071,16 @@ again. # Bucket_Game and do nothing else differently? # See mtcompile-program.pl gameNames.append("Bucket_Game") - gamePaths = [os.path.join(PRODDIR, gName) for gName in gameNames] - print("* purging gamepaths: {}".format(gamePaths)) + # gamePaths = [os.path.join(PRODDIR, gName) for gName in gameNames] + # print("* purging gamepaths: {}".format(gamePaths)) for gameName in gameNames: gamePath = os.path.join(PRODDIR, gameName) if os.path.isdir(gamePath): + print("* replacing {}".format(gamePath)) shutil.rmtree(gamePath) - zipPath = os.path.Join(BALLDIR, gameName + ".zip") + else: + print("* adding {}".format(gamePath)) + zipPath = os.path.join(BALLDIR, gameName + ".zip") if os.path.isfile(zipPath): zf = ZipFile(zipPath) zf.extractall(gamePath) # pwd means password in this case @@ -1092,11 +1110,19 @@ again. # Strip the executable(s). if not MAKEDEBUG: - for thisBinName in ["minetest", "minetestserver"]: - thisBinPath = os.path.join(PRODDIR, "bin", thisBinName) - if not os.path.isfile(thisBinPath): + prodBinDir = os.path.join(PRODDIR, "bin") + for sub in os.listdir(prodBinDir): + if sub.startswith("."): + continue + sub_path = os.path.join(prodBinDir, sub) + if not os.path.isfile(sub_path): continue - RunCmd(["strip", thisBinPath]) + if sub.startswith("minetest"): + try: + RunCmd(["strip", sub_path]) + except RuntimeError: + print("strip (optimizing the executable size)" + " failed for {}".format(sub_path)) #--------------------------------------------------------------------- # Additional cleanup.