mirror of
https://github.com/u0u0/Cocos2d-Lua-Community.git
synced 2026-05-06 22:01:44 +08:00
153 lines
4.0 KiB
Python
Executable File
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)
|