diff --git a/makepanda/makepanda.py b/makepanda/makepanda.py index 97e0ecbb50..fa53bae558 100755 --- a/makepanda/makepanda.py +++ b/makepanda/makepanda.py @@ -30,7 +30,6 @@ from installpanda import * ######################################################################## COMPILER=0 -THIRDPARTYLIBS=0 VC90CRTVERSION="" INSTALLER=0 GENMAN=0 @@ -46,7 +45,7 @@ PkgListSet(MAYAVERSIONS + MAXVERSIONS + DXVERSIONS + [ "PYTHON","ZLIB","PNG","JPEG","TIFF","VRPN","TINYXML", "FMODEX","OPENAL","NVIDIACG","OPENSSL","FREETYPE", "FFTW","ARTOOLKIT","SQUISH","ODE","DIRECTCAM","NPAPI", - "OPENCV","FFMPEG","FCOLLADA","PANDATOOL" + "OPENCV","FFMPEG","FCOLLADA","GTK2","PANDATOOL" ]) CheckPandaSourceTree() @@ -237,33 +236,9 @@ SdkAutoDisableMax() if (sys.platform == "win32"): SetupVisualStudioEnviron() COMPILER="MSVC" - - if (platform.architecture()[0] == "64bit"): - THIRDPARTYLIBS="thirdparty/win-libs-vc9-x64/" - else: - THIRDPARTYLIBS="thirdparty/win-libs-vc9/" - if not os.path.isdir(THIRDPARTYLIBS): - THIRDPARTYLIBS="thirdparty/win-libs-vc9/" - VC90CRTVERSION = GetVC90CRTVersion(THIRDPARTYLIBS+"extras/bin/Microsoft.VC90.CRT.manifest") else: CheckLinkerLibraryPath() COMPILER="LINUX" - - if (sys.platform == "darwin"): - THIRDPARTYLIBS="thirdparty/darwin-libs-a/" - elif (sys.platform.startswith("linux")): - if (platform.architecture()[0] == "64bit"): - THIRDPARTYLIBS="thirdparty/linux-libs-x64/" - else: - THIRDPARTYLIBS="thirdparty/linux-libs-a/" - elif (sys.platform.startswith("freebsd")): - if (platform.architecture()[0] == "64bit"): - THIRDPARTYLIBS="thirdparty/freebsd-libs-x64/" - else: - THIRDPARTYLIBS="thirdparty/freebsd-libs-a/" - else: - exit("Unknown platform") - VC90CRTVERSION = 0 builtdir = os.path.join(os.path.abspath(GetOutputDir())) AddToPathEnv("PYTHONPATH", builtdir) @@ -397,18 +372,7 @@ if (COMPILER=="LINUX"): IncDirectory("FREETYPE", "/usr/X11R6/include") IncDirectory("FREETYPE", "/usr/X11/include/freetype2") IncDirectory("GLUT", "/usr/X11R6/include") - if (PkgSkip("PNG")==0): LibName("PNG", "-lpng") - if (PkgSkip("FREETYPE")==0): LibName("FREETYPE", "-lfreetype") - elif (LocateBinary("pkg-config")): - PkgConfigEnable("GTK2", "gtk+-2.0") - PkgConfigEnable("FREETYPE", "freetype2") - PkgConfigEnable("PNG", "libpng") - else: - exit("Failed to locate pkg-config binary!") - - if (LocateBinary("wx-config")): - PkgConfigEnable("WX", "", tool = "wx-config") - + if (platform.uname()[1]=="pcbsd"): IncDirectory("ALWAYS", "/usr/PCBSD/local/include") LibDirectory("ALWAYS", "/usr/PCBSD/local/lib") @@ -416,21 +380,38 @@ if (COMPILER=="LINUX"): if (os.path.exists("/usr/lib64")): IncDirectory("GTK2", "/usr/lib64/glib-2.0/include") IncDirectory("GTK2", "/usr/lib64/gtk-2.0/include") - - if (sys.platform == "darwin"): - pkgs = ["VRPN", "FFTW", "FMODEX", "ARTOOLKIT", "ODE", "OPENCV", "FCOLLADA", "SQUISH", "FFMPEG", "PNG", "JPEG", "TIFF", "TINYXML", "NPAPI"] - else: - pkgs = ["VRPN", "FFTW", "FMODEX", "ARTOOLKIT", "ODE", "OPENCV", "FCOLLADA", "SQUISH", "NVIDIACG", "FFMPEG", "OPENAL", "TINYXML", "NPAPI"] - for pkg in pkgs: - if (PkgSkip(pkg)==0): - if (os.path.isdir(THIRDPARTYLIBS + pkg.lower())): - IncDirectory(pkg, THIRDPARTYLIBS + pkg.lower() + "/include") - LibDirectory(pkg, THIRDPARTYLIBS + pkg.lower() + "/lib") - else: - WARNINGS.append("I cannot locate SDK for " + pkg + " in thirdparty directory.") - WARNINGS.append("I have automatically added this command-line option: --no-"+pkg.lower()) - PkgDisable(pkg) - + + ffmpeg_libs = ("libavutil", "libavcodec", "libavformat", "libswscale") + + # Name pkg-config libs, include(dir)s + PkgEnable("ARTOOLKIT", "", ("AR"), "AR/ar.h") + PkgEnable("FCOLLADA", "", ("FCollada"), "FCollada.h") + PkgEnable("FFMPEG", ffmpeg_libs, ffmpeg_libs, ffmpeg_libs) + PkgEnable("FFTW", "", ("fftw", "rfftw"), ("fftw.h", "rfftw.h")) + PkgEnable("FMODEX", "", ("fmodex"), ("fmodex", "fmodex/fmod.h")) + PkgEnable("FREETYPE", "freetype2", ("freetype"), "freetype2/freetype/freetype.h") + PkgEnable("GLUT", "gl", ("GL"), ("GL/gl.h", "GL/glu.h"), framework = "OpenGL") + PkgEnable("GTK2", "gtk+-2.0") + PkgEnable("JPEG", "", ("jpeg"), "jpeglib.h") + PkgEnable("NVIDIACG", "", ("Cg"), "Cg/cg.h", framework = "Cg") + PkgEnable("ODE", "", ("ode"), "ode/ode.h") + PkgEnable("OPENAL", "openal", ("openal"), "AL/al.h", framework = "OpenAL") + PkgEnable("OPENCV", "", ("cv", "highgui", "cvaux", "ml", "cxcore"), ("opencv", "opencv/cv.h")) + PkgEnable("OPENSSL", "openssl", ("ssl", "crypto"), ("openssl/ssl.h", "openssl/crypto.h")) + PkgEnable("PNG", "libpng", ("png"), "png.h") + PkgEnable("SQUISH", "", ("squish"), "squish.h") + PkgEnable("TIFF", "", ("tiff"), "tiff.h") + PkgEnable("TINYXML", "", ("tinyxml"), "tinyxml.h") + PkgEnable("VRPN", "", ("vrpn", "quat"), ("quat.h", "vrpn_Types.h")) + PkgEnable("ZLIB", "", ("z"), "zlib.h") + PkgEnable("PYTHON", "", SDK["PYTHONVERSION"], (SDK["PYTHONVERSION"], SDK["PYTHONVERSION"] + "/Python.h"), tool = SDK["PYTHONVERSION"] + "-config", framework = "Python") + if (RUNTIME): + PkgEnable("NPAPI", "", (), ("xulrunner-*/stable", "xulrunner-*/stable/npapi.h")) + PkgEnable("WX", tool = "wx-config") + if (sys.platform != "darwin"): + PkgEnable("X11", "x11", "X11", "Xlib.h") + PkgEnable("XF86DGA", "xxf86dga", "Xxf86dga", "X11/extensions/xf86dga.h") + for pkg in MAYAVERSIONS: if (PkgSkip(pkg)==0 and (pkg in SDK)): # On OSX, the dir *can* be named 'MacOS' instead of 'lib'. @@ -442,55 +423,15 @@ if (COMPILER=="LINUX"): IncDirectory(pkg, SDK[pkg] + "/include") DefSymbol(pkg, "MAYAVERSION", pkg) - if (sys.platform == "darwin"): - if (PkgSkip("PYTHON")==0): LibName("PYTHON", "-framework Python") - if (PkgSkip("NVIDIACG")==0): LibName("NVIDIACG", "-framework Cg") - if (PkgSkip("OPENAL")==0): LibName("OPENAL", "-framework OpenAL") - if (PkgSkip("OPENSSL")==0): LibName("OPENSSL", "-lcrypto") - if (PkgSkip("TIFF")==0): LibName("TIFF", "-lpandatiff") - else: - if (PkgSkip("PYTHON")==0): LibName("PYTHON", "-l" + SDK["PYTHONVERSION"]) - if (PkgSkip("NVIDIACG")==0): LibName("CGGL", "-lCgGL") - if (PkgSkip("NVIDIACG")==0): LibName("NVIDIACG", "-lCg") - if (PkgSkip("OPENAL")==0): LibName("OPENAL", "-lopenal") - if (PkgSkip("TIFF")==0): LibName("TIFF", "-ltiff") - if (PkgSkip("SQUISH")==0): LibName("SQUISH", "-lsquish") - if (PkgSkip("FCOLLADA")==0): LibName("FCOLLADA", "-lFCollada") - if (PkgSkip("FMODEX")==0): LibName("FMODEX", "-lfmodex") - if (PkgSkip("FFMPEG")==0): LibName("FFMPEG", "-lavutil") - if (PkgSkip("FFMPEG")==0): LibName("FFMPEG", "-lavformat") - if (PkgSkip("FFMPEG")==0): LibName("FFMPEG", "-lavcodec") - if (PkgSkip("FFMPEG")==0): LibName("FFMPEG", "-lavformat") - if (PkgSkip("FFMPEG")==0): LibName("FFMPEG", "-lavutil") - if (PkgSkip("FFMPEG")==0): LibName("FFMPEG", "-lswscale") - if (PkgSkip("OPENSSL")==0): LibName("OPENSSL", "-lssl") - if (PkgSkip("ZLIB")==0): LibName("ZLIB", "-lz") - if (PkgSkip("JPEG")==0): LibName("JPEG", "-ljpeg") - if (PkgSkip("VRPN")==0): LibName("VRPN", "-lvrpn") - if (PkgSkip("VRPN")==0): LibName("VRPN", "-lquat") - if (PkgSkip("FFTW")==0): LibName("FFTW", "-lrfftw") - if (PkgSkip("FFTW")==0): LibName("FFTW", "-lfftw") - if (PkgSkip("ARTOOLKIT")==0): LibName("ARTOOLKIT", "-lAR") - if (PkgSkip("ODE")==0): LibName("ODE", "-lode") - if (PkgSkip("OPENCV")==0): LibName("OPENCV", "-lcv") - if (PkgSkip("OPENCV")==0): LibName("OPENCV", "-lhighgui") - if (PkgSkip("OPENCV")==0): LibName("OPENCV", "-lcvaux") - if (PkgSkip("OPENCV")==0): LibName("OPENCV", "-lml") - if (PkgSkip("OPENCV")==0): LibName("OPENCV", "-lcxcore") - if (PkgSkip("TINYXML")==0): LibName("TINYXML", "-ltinyxml") - LibName("X11", "-lX11") - LibName("XF86DGA", "-lXxf86dga") if (sys.platform == "darwin"): LibName("ALWAYS", "-framework AppKit") if (PkgSkip("OPENCV")==0): LibName("OPENCV", "-framework QuickTime") LibName("AGL", "-framework AGL") LibName("CARBON", "-framework Carbon") LibName("COCOA", "-framework Cocoa") - LibName("GLUT", "-framework OpenGL") # Fix for a bug in OSX: LibName("GLUT", "-dylib_file /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib:/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib") else: - LibName("GLUT", "-lGL") LibName("GLUT", "-lGLU") for pkg in MAYAVERSIONS: @@ -558,8 +499,6 @@ def printStatus(header,warnings): print "" sys.stdout.flush() -printStatus("Makepanda Initial Status Report", WARNINGS) - ######################################################################## ## ## BracketNameWithQuotes diff --git a/makepanda/makepandacore.py b/makepanda/makepandacore.py index 2a06dded06..22d375099e 100644 --- a/makepanda/makepandacore.py +++ b/makepanda/makepandacore.py @@ -9,7 +9,7 @@ ## ######################################################################## -import sys,os,time,stat,string,re,getopt,cPickle,fnmatch,threading,Queue,signal,shutil,platform +import sys,os,time,stat,string,re,getopt,cPickle,fnmatch,threading,Queue,signal,shutil,platform,glob from distutils import sysconfig SUFFIX_INC=[".cxx",".c",".h",".I",".yxx",".lxx",".mm",".rc",".r",".plist"] @@ -55,6 +55,37 @@ for (ver,key) in MAYAVERSIONINFO: for (ver,key1,key2,subdir) in MAXVERSIONINFO: MAXVERSIONS.append(ver) +######################################################################## +## +## Thirdparty libraries paths +## +######################################################################## + +if (sys.platform == "win32"): + if (platform.architecture()[0] == "64bit"): + THIRDPARTYLIBS="thirdparty/win-libs-vc9-x64/" + else: + THIRDPARTYLIBS="thirdparty/win-libs-vc9/" + if not os.path.isdir(THIRDPARTYLIBS): + THIRDPARTYLIBS="thirdparty/win-libs-vc9/" + VC90CRTVERSION = GetVC90CRTVersion(THIRDPARTYLIBS+"extras/bin/Microsoft.VC90.CRT.manifest") +else: + if (sys.platform == "darwin"): + THIRDPARTYLIBS="thirdparty/darwin-libs-a/" + elif (sys.platform.startswith("linux")): + if (platform.architecture()[0] == "64bit"): + THIRDPARTYLIBS="thirdparty/linux-libs-x64/" + else: + THIRDPARTYLIBS="thirdparty/linux-libs-a/" + elif (sys.platform.startswith("freebsd")): + if (platform.architecture()[0] == "64bit"): + THIRDPARTYLIBS="thirdparty/freebsd-libs-x64/" + else: + THIRDPARTYLIBS="thirdparty/freebsd-libs-a/" + else: + exit("Unknown platform: %s" % sys.platform) + VC90CRTVERSION = 0 + ######################################################################## ## ## The exit routine will normally @@ -324,7 +355,7 @@ def NeedsBuild(files,others): else: oldothers = BUILTFROMCACHE[key][0] if (oldothers != others and VERBOSE): - print "%sCAUTION:%s file dependencies changed: %s%s%s" % (GetColor("red"), GetColor(), GetColor("green"), str(files), GetColor()) + print "%sWARNING:%s file dependencies changed: %s%s%s" % (GetColor("red"), GetColor(), GetColor("green"), str(files), GetColor()) return 1 ######################################################################## @@ -728,15 +759,15 @@ def SetVerbose(verbose): ## ######################################################################## -PKG_LIST_ALL=0 -PKG_LIST_OMIT=0 +PKG_LIST_ALL=[] +PKG_LIST_OMIT={} def PkgListSet(pkgs): global PKG_LIST_ALL global PKG_LIST_OMIT PKG_LIST_ALL=pkgs PKG_LIST_OMIT={} - PkgDisableAll() + PkgEnableAll() def PkgListGet(): return PKG_LIST_ALL @@ -762,10 +793,7 @@ def PkgSelected(pkglist, pkg): if (pkglist.count(pkg)==0): return 0 if (PKG_LIST_OMIT[pkg]): return 0 return 1 -if os.path.isfile("dtool/src/prc/prc_parameters.h.moved"): - os.rename("dtool/src/prc/prc_parameters.h.moved", "dtool/src/prc/prc_parameters.h") -if os.path.isfile("direct/src/plugin/p3d_plugin_config.h.moved"): - os.rename("direct/src/plugin/p3d_plugin_config.h.moved", "direct/src/plugin/p3d_plugin_config.h") + ######################################################################## ## ## These functions are for libraries which use pkg-config. @@ -867,6 +895,141 @@ def PkgConfigEnable(opt, pkgname, tool = "pkg-config"): for i, j in PkgConfigGetDefSymbols(pkgname, tool).items(): DefSymbol(opt, i, j) +LD_CACHE = None +STATIC_CACHE = None + +def GetLdCache(): + # Returns a list of cached libraries, not prefixed by lib and not suffixed by .so* or .a! + global LD_CACHE + if (LD_CACHE == None): + if (LocateBinary("ldconfig") != None): + LD_CACHE = [] + handle = os.popen(LocateBinary("ldconfig") + " -NXp") + result = handle.read().strip().split("\n") + for line in result: + lib = line.strip().split(" ", 1)[0] + lib = lib.split(".so", 1)[0][3:] + LD_CACHE.append(lib) + else: + for l in glob.glob("/lib/*.so*") + glob.glob("/usr/lib/*.so*") + glob.glob("/usr/local/lib/*.so*") + glob.glob("/usr/PCBSD/local/lib/*.so*"): + lib = os.path.basename(l).split(".so", 1)[0][3:] + LD_CACHE.append(lib) + # Now check for static libraries - they aren't found by ldconfig. + for l in glob.glob("/lib/*.a") + glob.glob("/usr/lib/*.a") + glob.glob("/usr/local/lib/*.a") + glob.glob("/usr/PCBSD/local/lib/*.a"): + lib = os.path.basename(l).split(".a", 1)[0][3:] + LD_CACHE.append(lib) + return LD_CACHE + +def PkgEnable(pkg, pkgconfig = None, libs = None, incs = None, defs = None, framework = None, tool = "pkg-config"): + global PKG_LIST_ALL + if (LocateBinary("pkg-config")==None): + exit("Failed to locate pkg-config binary!") + if (pkgconfig == ""): + pkgconfig = None + if (framework == ""): + framework = None + if (libs == None or libs == ""): + libs = () + elif (isinstance(libs, str)): + libs = (libs, ) + if (incs == None or incs == ""): + incs = () + elif (isinstance(incs, str)): + incs = (incs, ) + if (defs == None or defs == "" or len(defs) == 0): + defs = {} + elif (isinstance(incs, str)): + defs = {defs : ""} + elif (isinstance(incs, list) or isinstance(incs, tuple) or isinstance(incs, set)): + olddefs = defs + defs = {} + for d in olddefs: + defs[d] = "" + + if (os.path.isdir(THIRDPARTYLIBS + pkg.lower())): + IncDirectory(pkg, THIRDPARTYLIBS + pkg.lower() + "/include") + LibDirectory(pkg, THIRDPARTYLIBS + pkg.lower() + "/lib") + for l in libs: + libname = l + if (l.startswith("lib")): + libname = l[3:] + # This is for backward compatibility - in the thirdparty dir, we kept some libs with "panda" prefix, like libpandatiff. + if (len(glob.glob(THIRDPARTYLIBS + pkg.lower() + "/lib/libpanda%.*" % libname)) > 0 and + len(glob.glob(THIRDPARTYLIBS + pkg.lower() + "/lib/lib%.*" % libname)) == 0): + libname = "panda" + libname + LibName(pkg, libname) + for d, v in defs.values(): + DefSymbol(pkg, d, v) + elif (sys.platform == "darwin" and framework != None): + if (os.path.isdir("/Library/Frameworks/%s.framework" % framework) or + os.path.isdir("/System/Library/Frameworks/%s.framework" % framework) or + os.path.isdir("/Developer/Library/Frameworks/%s.framework" % framework) or + os.path.isdir("/Users/%s/System/Library/Frameworks/%s.framework" % (getpass.getuser(), framework))): + LibName(pkg, "-framework " + framework) + for d, v in defs.values(): + DefSymbol(pkg, d, v) + elif (pkg in PkgListGet()): + print "%sWARNING:%s Could not locate framework %s, excluding from build" % (GetColor("red"), GetColor(), framework) + PkgDisable(pkg) + else: + print "%ERROR:%s Could not locate framework %s, aborting build" % (GetColor("red"), GetColor(), framework) + exit() + elif (pkgconfig != None): + if (isinstance(pkgconfig, str)): + if (PkgConfigHavePkg(pkgconfig, tool)): + return PkgConfigEnable(pkg, pkgconfig, tool) + else: + have_all_pkgs = True + for pc in pkgconfig: + if (PkgConfigHavePkg(pc, tool)): + PkgConfigEnable(pkg, pc, tool) + else: + have_all_pkgs = False + if (have_all_pkgs): + return + elif (pkgconfig != None and libs == None): + if (pkg in PkgListGet()): + print "%sWARNING:%s Could not locate package %s, excluding from build" % (GetColor("red"), GetColor(), pkgconfig) + PkgDisable(pkg) + else: + print "%ERROR:%s Could not locate package %s, aborting build" % (GetColor("red"), GetColor(), pkgconfig) + exit() + else: + # Okay, our pkg-config attempts failed. Let's try locating the libs by ourselves. + have_pkg = True + for l in libs: + if (l in GetLdCache()): + LibName(pkg, "-l" + l) + else: + if (VERBOSE): + print GetColor("cyan") + "Couldn't find library lib" + l + GetColor() + have_pkg = False + + for i in incs: + incdir = None + if (len(glob.glob("/usr/include/" + i)) > 0): + incdir = sorted(glob.glob("/usr/include/" + i))[-1] + elif (len(glob.glob("/usr/local/include/" + i)) > 0): + incdir = sorted(glob.glob("/usr/local/include/" + i))[-1] + elif (platform.uname()[1]=="pcbsd" and len(glob.glob("/usr/PCBSD/local/include/" + i)) > 0): + incdir = sorted(glob.glob("/usr/PCBSD/local/include/" + i))[-1] + else: + if (VERBOSE and i.endswith(".h")): + print GetColor("cyan") + "Couldn't find header file " + i + GetColor() + have_pkg = False + + # Note: It's possible to specify a file instead of a dir, for the sake of checking if it exists. + if (incdir != None and os.path.isdir(incdir)): + IncDirectory(pkg, incdir) + + if (not have_pkg): + if (pkg in PkgListGet()): + print "%sWARNING:%s Could not locate thirdparty package %s, excluding from build" % (GetColor("red"), GetColor(), pkg.lower()) + PkgDisable(pkg) + else: + print "%ERROR:%s Could not locate thirdparty package %s, aborting build" % (GetColor("red"), GetColor(), pkg.lower()) + exit() + ######################################################################## ## ## SDK Location