All pastes #19561 Raw Edit

Untitled

public python v1 · immutable
#19561 ·published 2005-08-08 18:47 UTC
rendered paste body
#!/usr/bin/python## A simple Python script that mimics autoconf#import osimport sysimport platform# Project namePROJ = "MirrorCity"# Version number (major.minor.release)VERSION = "0.0.1"# Default valuesPREFIX = "/usr/local"DATADIR = NoneSYSCONFDIR = NoneVERBOSE = 0MODE = "release"COMPILER = os.getenv ("COMPILER", "gcc")CFLAGS = os.getenv ("CFLAGS", "")CXXFLAGS = os.getenv ("CXXFLAGS", "")LDFLAGS = os.getenv ("LDFLAGS", "")CONFIG_H = ["/* This file has been automatically generated, do not modify",            "   as it will be overwritten next time you run configure! */",            ""]CONFIG_MAK=["# This file has been automatically generated, do not modify",            "# as it will be overwritten next time you run configure!",            ""]DEFS = ""LIBS = ""def help ():    print """This script helps you to configure this project to build on your operating systemThe following switches are available:    --prefix=DIR          Set the base prefix for installation/execution    --sysconfdir=DIR      Set the system-wide directory for configuration files    --datadir=DIR         Set the system-wide directory for data files    --verbose             Display verbosely the detection process    --mode=MODE           Use given compilation mode by default (debug, release)    --compiler=COMPILER   Use the respective compiler (supported: gcc, cl)    --cflags=CFLAGS       Additional compiler flags for C    --cxxflags=CXXFLAGS   Additional compiler flags for C++    --ldflags=LDFLAGS     Additional linker flagsThe following environment variables affect the configure process:    COMPILER              The compiler suite to use (default: $COMPILER)                          NOTE: a file named build/mak/\$COMPILER.mak must exist!    CFLAGS                Additional compilation flags for C    CXXFLAGS              Additional compilation flags for C++    LDFLAGS               Additional linker flags"""    sys.exit (1)def remove (filename):    try:        os.remove (filename)    except:        passdef add_config_h (macro, val = "1"):    global CONFIG_H    CONFIG_H.append ("#define %s %s" % (macro, val))def add_config_mak (macro, val = "1"):    global CONFIG_MAK    CONFIG_MAK.append ("%s=%s" % (macro, val))def check_started (text):    print text.ljust (42), "...",def check_finished (res):    print resdef check_compile (srcf, outf, cflags = ""):    global COMPILER,VERBOSE, DEVNULL    cmd = COMPILER + " -c " + srcf + " -o " + outf + " " + cflags    suffix = " >&" + DEVNULL    if VERBOSE == 1:        suffix = ""        print cmd    fd = os.popen (cmd + suffix)    return fd.close () == Nonedef check_compile_and_link (srcf, outf, cflags = "", ldflags = ""):    global COMPILER,VERBOSE, DEVNULL    cmd = COMPILER + " " + srcf + " -o " + outf + " " + cflags + " " + ldflags    suffix = " >&" + DEVNULL    if VERBOSE == 1:        suffix = ""        print cmd    fd = os.popen (cmd + suffix)    return fd.close () == Nonedef write_to_file (filename, content):    fd = open (filename, "w")    fd.write (content)    fd.close ()def check_cflags (cflags):    global DEFS    check_started ("Checking if compiler supports " + cflags)    write_to_file ("conftest.c", "int main () { }");    if check_compile ("conftest.c", "conftest" + OBJ, cflags = ""):        check_finished ("Yes")        if DEFS != "":            DEFS = DEFS + " "        DEFS = DEFS + cflags    elif requiredtxt:        check_finished ("No")    remove ("conftest.c")    remove ("conftest" + OBJ)def check_library (lib, funcname, cflags = "", libs = None, requiredtxt = None):    global PROJ, EXE, DEFS, LIBS    check_started ("Checking for library " + lib)    if not libs:        libs = "-l" + lib    write_to_file ("conftest.c", """extern void %s ();int main () { void (*x) () = %s; return 0; }""" % (funcname, funcname));    if check_compile_and_link ("conftest.c", "conftest" + EXE, cflags, libs):        check_finished ("OK")        add_config_h ("HAVE_LIB" + lib.upper ())        if cflags != "":            if DEFS != "":                DEFS = DEFS + " "            DEFS = DEFS + cflags        if LIBS != "":            LIBS = LIBS + " "        LIBS = LIBS + libs        rc = True    elif requiredtxt:        check_finished ("FAILED")        print """This library is required to build %s,since %sAborting""" % (PROJ, requiredtxt)        remove ("conftest.c")        remove ("conftest" + EXE)        sys.exit (1)    else:        check_finished ("NOT FOUND")        rc = False    remove ("conftest.c")    remove ("conftest" + EXE)    return rcdef check_header (hdr, cflags = "", requiredtxt = None):    global DEFS, OBJ    check_started ("Checking for header file " + hdr)    write_to_file ("conftest.c", """#include <%s>""" % hdr);    if check_compile ("conftest.c", "conftest" + OBJ, cflags):        check_finished ("OK")        add_config_h ("HAVE_" + hdr.replace (".", "_").upper ())        if cflags != "":            if DEFS != "":                DEFS = DEFS + " "            DEFS = DEFS + cflags        rc = True    elif requiredtxt:        check_finished ("FAILED")        print """This header file is required to build %s,since %sAborting""" % (PROJ, requiredtxt)        remove ("conftest.c")        remove ("conftest" + OBJ)        sys.exit (1)    else:        check_finished ("NOT FOUND")        rc = False    remove ("conftest.c")    remove ("conftest" + OBJ)    return rcdef check_gmake (req_maj, req_min):    global DEVNULL    check_started ("Checking the version of GNU Make")    try:        fd = os.popen ("make --version 2>" + DEVNULL)        line = fd.readline ()        fd.close ()        # transform the string to an array like ['3', '80']        line = line.split () [-1].split ('.')        if line[0] < req_maj or (line[0] == req_maj and line [1] < req_min):            check_finished ("FAILED")            print "GNU Make version %s.%s or later is required!" % (req_maj, req_min)            sys.exit (1)        check_finished ("%s.%s, OK" % (line [0], line [1]))    except:        check_finished ("FAILED")        print "GNU Make is required to build this project"        sys.exit (1)def update_file (filename, content):    try:        fd = open (filename, "r")        old_content = fd.read ()        fd.close ()    except:        old_content = None    if content != old_content:        write_to_file (filename, content)    passdef pkgconfig (prog, args, lib = None):    global DEF_PKGCONFIG    cmd = prog;    if lib:        cmd = cmd + " " + lib    cmd = cmd + " --" + args + " 2>" + DEVNULL    fd = os.popen (cmd)    line = " ".join (fd.readlines ()).strip ()    if fd.close () == None:        return line    if not lib:        lib = prog.replace ("_config", "").replace ("-config", "")    if lib in DEF_PKGCONFIG:        pkg = DEF_PKGCONFIG [lib]        if args in pkg:            return args [pkg]    return ""def link_lib (path, library):    global COMPILER    if COMPILER == "cl":        return "-libpath:" + path + " " + ".lib".join (library) + ".lib"    # gcc: -L ../.. -lblah    return "-L" + path + " -l" + " -l".join (library)#------------------------------------------------------------------------------#OBJ = ".o"if os.name == "posix":    PLATFORM = "posix"    DEVNULL = "/dev/null"    EXE = ""elif os.name == "nt" or os.name == "nt":    PLATFORM = "windows"    DEVNULL = "nul"    EXE = ".exe"    OBJ = ".o"else:    print "Unknown operating system: " + os.name    sys.exit (1)add_config_h ("PLATFORM_" + PLATFORM.upper ())add_config_mak ("PLATFORM", PLATFORM)ARCH = platform.machine ()if ARCH [0] == "i" and ARCH [2:4] == "86":    ARCH="x86"elif ARCH [:6] == "x86_64":    ARCH="x86_64"else:    print "Unsupported architecture: " + ARCHadd_config_h ("ARCH_" + ARCH.upper ())add_config_mak ("ARCH", ARCH)for opt in sys.argv [1:]:    if opt == "--help" or opt == "-h":        help ()    elif opt [:9] == "--prefix=":        PREFIX = opt [9:].strip ()    elif opt [:13] == "--sysconfdir=":        SYSCONFDIR = opt [13:].strip ()    elif opt [:10] == "--datadir=":        DATADIR = opt [10:].strip ()    elif opt == "--verbose" or opt == "-v":        VERBOSE = 1    elif opt [:7] == "--mode=":        MODE = opt[7:].strip ()    elif opt [:11] == "--compiler=":        COMPILER = opt[11:].strip ()    elif opt [:9] == "--cflags=":        CFLAGS = opt[9:].strip ()    elif opt [:11] == "--cxxflags=":        CXXFLAGS = opt[11:].strip ()    elif opt [:10] == "--ldflags=":        LDFLAGS = opt[10:].strip ()    else:        print "Unrecognized command-line argument:", opt        sys.exit (1)if not SYSCONFDIR:    SYSCONFDIR = PREFIX + "/etc/" + PROJif not DATADIR:    DATADIR = PREFIX + "/share/" + PROJadd_config_h ("CONF_PREFIX", '"' + PREFIX + '"')add_config_mak ("CONF_PREFIX", PREFIX + '/')add_config_h ("CONF_SYSCONFDIR", '"' + SYSCONFDIR + '"')add_config_mak ("CONF_SYSCONFDIR", SYSCONFDIR + '/')add_config_h ("CONF_DATADIR", '"' + DATADIR + '"')add_config_mak ("CONF_DATADIR", DATADIR + '/')add_config_h ("CONF_VERSION", '"' + VERSION + '"')add_config_mak ("CONF_VERSION", VERSION)check_gmake (3, 80)# Default library cflags/locationsDEF_PKGCONFIG = {}if PLATFORM == "windows":    DEF_PKGCONFIG = {        "OGRE": {            "cflags":  "-I../../OgreSDK/include",            "ldflags": link_lib ("../../OgreSDK/lib", ["OgreMain"])        },        "sdl": {            "cflags":  "-I../../SDL/include",            "ldflags": link_lib ("../../SDL/lib", ["SDL"])        },        "mysql": {            "cflags":  "-I../../MySQL/include",            "ldflags": link_lib ("../../MySQL/lib", ["mysqlclient", "z", "crypt", "nsl"])        },        "zziplib": {            "cflags":  "-I../../ZZipLib/include",            "ldflags": link_lib ("../../ZZipLib/lib", ["zzip", "z"])        }    }if COMPILER == "cl":    ogre_func = ""    cegui_func = ""    OBJ = ".obj"else:    ogre_func = "_ZN4Ogre4Root10saveConfigEv"    cegui_func = "_ZTSN5CEGUI6WindowE"    check_cflags ("-Wno-non-virtual-dtor")check_library ("OGRE", ogre_func,    pkgconfig ("pkg-config", "cflags", "OGRE"),    pkgconfig ("pkg-config", "libs", "OGRE"),    "this is the 3D engine")check_library ("CEGUI", cegui_func,    pkgconfig ("pkg-config", "cflags", "CEGUI"),    pkgconfig ("pkg-config", "libs", "CEGUI"),    "this is the windowing library")check_library ("SDL", "SDL_Init",    pkgconfig ("sdl-config", "cflags"),    pkgconfig ("sdl-config", "libs"),    "it handles input and sound")check_library ("MySQL", "mysql_query",    pkgconfig ("mysql_config", "cflags"),    pkgconfig ("mysql_config", "libs"),    "it handles database management")check_library ("zlib", "compress", "", "-lz",    "it handles data compression and decompression")check_library ("pthread", "pthread_create", "", "-lpthread",    PROJ + " uses threads")check_library ("zziplib", "zzip_open",    pkgconfig ("pkg-config", "cflags", "zziplib"),    pkgconfig ("pkg-config", "libs", "zziplib"),    "it handles ZIP archive management")#check_library ("ssl", "BN_cmp")check_library ("compat", "ftime")if not check_library ("ncurses", "tgetent"):    check_library ("termcap", "tgetent")check_header ("endian.h")add_config_mak ("COMPILER", COMPILER)add_config_mak ("DEFS", DEFS)add_config_mak ("CFLAGS", CFLAGS + ' $(DEFS)')add_config_mak ("CXXFLAGS", CXXFLAGS + ' $(DEFS)')add_config_mak ("LDFLAGS", LDFLAGS)add_config_mak ("LDLIBS", LIBS)add_config_mak ("MODE", MODE)update_file ("include/" + PLATFORM + "/config.h", "\n".join (CONFIG_H) + "\n")update_file ("config.mak", "\n".join (CONFIG_MAK) + "\n")