Files
Cocos2d-Lua-Community/tools/PackageScripts.py

153 lines
4.0 KiB
Python
Executable File

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
NAME
PackageScripts --
SYNOPSIS
PackageScripts [-h]
-h show help
-p project root dir
-o output file name, like "game", will auto composed to game32.zip
-b 32 or 64, luajit bytecode mode
"""
import os
import sys
import getopt
import shutil
import re
import platform
import subprocess
import zipfile
scriptRoot = os.path.split(os.path.realpath(__file__))[0]
jitPath = ""
new_env = os.environ.copy()
luaFiles = []
def joinDir(root, *dirs):
for item in dirs:
root = os.path.join(root, item)
return root
def initJitPath(mode):
global jitPath
global new_env
sysstr = platform.system()
if(sysstr =="Windows"):
if "32" == mode:
jitPath = joinDir(scriptRoot, "win32", "luajit.exe")
else:
jitPath = joinDir(scriptRoot, "win32", "64", "luajit.exe")
elif(sysstr == "Linux"):
jitPath = joinDir(scriptRoot, "linux", "luajit")
if "64" == mode:
jitPath = jitPath + "64"
elif(sysstr == "Darwin"):
jitPath = joinDir(scriptRoot, "mac", "luajit")
if "64" == mode:
jitPath = jitPath + "64"
else:
print("Unsupport OS!")
sys.exit(-1)
# important, to find luajit lua
new_env['LUA_PATH'] = joinDir(scriptRoot, "?.lua")
def doFile(path, luaRoot, zFile):
tmp = path + ".tmp"
jitcmd = '%s -bg "%s" "%s"' %(jitPath, path, tmp)
# do shell cmd
cmd = subprocess.Popen(jitcmd, shell = True, stdout = subprocess.PIPE, env = new_env)
cmd.wait()
if os.path.exists(tmp) == False:
print("Error: Fail to compile:%s" %(path))
sys.exit(-1)
# remove perfix and suffix, replace / with .
modulePath = path[len(luaRoot) + 1:-4]
if os.sep == '\\':
moduleName = re.sub('\\\\', '.', modulePath)
else:
moduleName = re.sub('/', '.', modulePath)
print("== compiling: %s" %(moduleName))
# fix the file modify time
os.utime(tmp, (1330712280, 1330712280))
# add to zip file
zFile.write(tmp, moduleName, zipfile.ZIP_DEFLATED)
# remove temp file
os.unlink(tmp)
def listDir(d):
global luaFiles
for item in os.listdir(d):
nDir = joinDir(d, item)
if os.path.isfile(nDir):
if not nDir.endswith(".lua"): # only do lua file
continue
luaFiles.append(nDir)
else:
listDir(nDir)
def packageScript(projectDir, outName, mode):
global luaFiles
luaRoot = joinDir(projectDir, "src")
if not os.path.exists(luaRoot):
print("Error: %s is not exists" %(luaRoot))
sys.exit(-2)
print("====> init evn.")
initJitPath(mode)
listDir(luaRoot) # Can't delete file in listdir
print("====> Compile btyecode, and do ziping.")
outfile = joinDir(projectDir, "res", outName + mode + ".zip")
zFile = zipfile.ZipFile(outfile, 'w')
for item in luaFiles:
doFile(item, luaRoot, zFile)
zFile.close()
print("====> Done, write to %s" %(outfile))
if __name__ == "__main__":
# ===== parse args =====
try:
opts, args = getopt.getopt(sys.argv[1:], "hp:o:b:")
except getopt.GetoptError:
# print help information and exit:
print(__doc__)
sys.exit(-2)
# default value
projectDir = ""
name = "game"
mode = "32"
for o, a in opts:
if o == "-h":
# print help information and exit:
print(__doc__)
sys.exit(0)
if o == "-p":
projectDir = a
if o == "-o":
name = a
if o == "-b":
if "32" != a and "64" != a:
print("Error: bytecode mode only support 32 or 64")
sys.exit(-2)
mode = a
# check valid
if 0 == len(projectDir):
print("Error: -p must set")
sys.exit(-2)
if not os.path.exists(projectDir):
print("Error: %s is not exists" %(projectDir))
sys.exit(-2)
# info printing
print("== scriptRoot: %s" %(scriptRoot))
packageScript(projectDir, name, mode)