123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 |
- #!/usr/bin/python
- import filecmp
- import os
- import sys
- import shlex
- import subprocess
- import json
- import shutil
- import platform as python_platform
- def msg(msg):
- print msg+"...",
- def result(msg):
- print msg;
- def failure(msg):
- type, value = sys.exc_info()[:2]
- if None == msg:
- msg=value
- # raise
- # print msg
- sys.exit(msg)
- def init(mode, type):
- global TARGET_MODE
- global TARGET_TYPE
- global TMP_DIR
- global BUILD_DIR
- global DOCS_DIR
- TARGET_MODE=mode.lower()
- TARGET_TYPE=type.lower()
- if "nt"==os.name:
- TMP_DIR="win32"+os.sep+mode
- else:
- try:
- msg("Reading configuration...")
- f=open("build"+os.sep+"configure.ctx", "r")
- ctx=eval(f.read())
- f.close()
- result("OK")
- except:
- failure("Can not open \"configure.ctx\". Try running ./configure first!")
- msg("Guessing platform...")
- if 1==len(ctx["platforms"]):
- platform=ctx["platforms"][0]
- result(platform)
- TMP_DIR=os.path.join("build", platform, TARGET_TYPE)
- else:
- failure("Error. Please configure with exactly one platform!")
- BUILD_DIR=TMP_DIR
- DOCS_DIR="test_docs"
- def tmp(filename):
- return os.path.join(TMP_DIR, filename)
- def build(filename):
- return os.path.join(BUILD_DIR, filename)
- def docs(filename):
- return os.path.join(DOCS_DIR, filename)
- def rm(filename):
- try:
- msg("remove "+filename)
- if os.path.exists(filename):
- os.remove(filename)
- result("OK")
- except:
- failure(None)
- def cp(src, dst):
- try:
- msg("copy "+src+" to "+dst)
- shutil.copyfile(src, dst)
- result("OK")
- except:
- failure(None)
- def ensureDir(dir):
- try:
- if not(os.path.exists(dir)):
- msg("creating dir "+dir)
- os.makedirs(dir)
- result("OK")
- except:
- failure(None)
- def call(path, pre, args, outfile, post, attr):
- try:
- env={}
- if TARGET_TYPE=="shared":
- if python_platform.system().lower()=="darwin":
- env["DYLD_LIBRARY_PATH"]=os.path.abspath(BUILD_DIR)
- elif python_platform.system().lower()=="linux":
- env["LD_LIBRARY_PATH"]=os.path.abspath(BUILD_DIR)
- msg("executing "+path)
- if os.path.exists(tmp("stderr.txt")):
- os.remove(tmp("stderr.txt"))
- if os.path.exists(outfile):
- os.remove(outfile)
- _args = [ path ]
- _args.extend(args)
- err = open(tmp("stderr.txt"), "w")
- out = open(outfile, "w")
- ret=subprocess.call(_args, stdout=out, stderr=err, env=env)
- out.close()
- err.close()
- if "return" in attr and ret!=int(attr["return"]):
- failure("ERROR: return code is "+str(ret)+" but "+str(attr["return"])+" is expected.")
- result("OK")
- except:
- failure(None)
-
- def normlinebreak(path):
- try:
- msg("normalize line breaks "+path+"...")
- newlines = []
- changed = False
- for line in open(path, 'rb').readlines():
- if line[-2:] == '\r\n':
- line = line[:-2] + '\n'
- changed = True
- newlines.append(line)
- if changed:
- open(path, 'wb').writelines(newlines)
- result("Changed")
- else:
- result("OK")
- except:
- failure(None)
-
- def regr(regrpath, path, normalize):
- if normalize:
- normlinebreak(regrpath)
- normlinebreak(path)
- msg("regression testing "+path+" against "+regrpath)
- eq=filecmp.cmp(regrpath, path)
- if (eq):
- result("OK")
- else:
- failure("Regression test failed!")
- def compile(path):
- try:
- msg("compiling "+path)
- if os.path.exists(tmp("stderr.txt")):
- os.remove(tmp("stderr.txt"))
- if os.path.exists(tmp("stdout.txt")):
- os.remove(tmp("stdout.txt"))
- err = open(tmp("stderr.txt"), "w")
- out = open(tmp("stdout.txt"), "w")
- exe=os.path.abspath(os.path.splitext(path)[0]+".exe")
- obj=os.path.abspath(os.path.splitext(path)[0]+".obj")
- if TARGET_MODE == "debug":
- rtl="/MDd"
- else:
- rtl="/MD"
- cl_args=["cl",
- os.path.abspath(path),
- "/Fo"+obj,
- "/TP", "/c", rtl,
- "/I..\\..\\config\\win32-msvc\\zlib-1.2.5",
- "/I..\\..\\third_party\\zlib-1.2.5",
- "/I..\\..\\config\\win32-msvc\\libxml2-2.7.7",
- "/I..\\..\\third_party\\libxml2-2.7.7\\include\\libxml",
- "/I..\\..\\third_party\\libxml2-2.7.7\\include",
- "/I..\\..\\plib\\config\\msvc\\plib\\include",
- "/I..\\..\\config",
- "/I..\\..",
- "/D", "WIN32",
- "/D", "LIBXML_STATIC",
- "/D","_UNICODE",
- "/D", "UNICODE" ]
- link_args=["link", "/OUT:"+os.path.abspath(exe), os.path.abspath(os.path.splitext(path)[0]+".obj"),"/NOLOGO", "/MACHINE:X86",
- "kernel32.lib", "user32.lib", "gdi32.lib", "winspool.lib", "comdlg32.lib", "advapi32.lib", "shell32.lib", "ole32.lib", "oleaut32.lib", "uuid.lib", "odbc32.lib", "odbccp32.lib",
- "mce.lib", "opc.lib", "plib.lib", "zlib.lib", "xml.lib" ]
- cwd=os.getcwd()
- os.chdir(tmp(""))
- ret=subprocess.call(cl_args, stdout=out, stderr=err)
- if ret==0:
- ret=subprocess.call(link_args, stdout=out, stderr=err)
- os.chdir(cwd)
- out.close()
- err.close()
- if ret==0:
- result("OK")
- else:
- out = open(tmp("stdout.txt"), "r")
- out_str=out.read()
- out.close()
- failure("FAIL:\n"+out_str)
- return exe
- except:
- failure(None)
|