""" Script to build PyVBA, a library wrapping (hacked) VisualBoy Advance """ import os import sys import distutils.core SDL_INCLUDE_DIR = "e:\\msys\\local\\include\\SDL" class DistributionMaster(): def __init__(self): self.IncludeDirectories = ["PyVBA/src/NecroCore", "PyVBA/src"] self.DebugFlag = 0 if sys.platform == "win32": self.OS = "windows" else: self.OS = "UNKNOWN" # LinkLibraries has the NAMES of libraries we link against: self.LibraryDirectories = [] self.LinkLibraries = [] # BuildLibraries DEFINES a series of static libraries which we build (and then link against): self.BuildLibraries = [] self.SourceFileNames = [] def ListSourceFilesRoot(self): SourceDir = "PyVBA/src" FileNames = [ "memgzio.c", "2xSaI.cpp", "admame.cpp", "agbprint.cpp", "armdis.cpp", "bilinear.cpp", "bios.cpp", "Cheats.cpp", "CheatSearch.cpp", "EEprom.cpp", "elf.cpp", "Flash.cpp", "GBA.cpp", "Gfx.cpp", "Globals.cpp", "hq2x.cpp", "interframe.cpp", "Mode0.cpp", "Mode1.cpp", "Mode2.cpp", "Mode3.cpp", "Mode4.cpp", "Mode5.cpp", "motionblur.cpp", "pixel.cpp", "remote.cpp", "RTC.cpp", "scanline.cpp", "simple2x.cpp", "Sound.cpp", "Sram.cpp", "Text.cpp", "unzip.cpp", "Util.cpp", # Assebmly: #"2xSaImmx.asm", # New stuff: "PyVBA.c", "PyVBASDL.cpp", "vbaq.cpp" ] for FileName in FileNames: FilePath = os.path.join(SourceDir, FileName) self.SourceFileNames.append(FilePath) def ListSourceFilesNecroCore(self): SourceDir = "PyVBA/src/NecroCore" FileNames = ["quest.c", "PyQuest.c", ] for FileName in FileNames: FilePath = os.path.join(SourceDir, FileName) self.SourceFileNames.append(FilePath) def ListSourceFilesGB(self): SourceDir = "PyVBA/src/gb" FileNames = ["GB.cpp", "gbCheats.cpp", "gbDis.cpp", "gbGfx.cpp", "gbGlobals.cpp", "gbMemory.cpp", "gbPrinter.cpp", "gbSGB.cpp", "gbSound.cpp"] for FileName in FileNames: FilePath = os.path.join(SourceDir, FileName) self.SourceFileNames.append(FilePath) def ListSourceFilesSDL(self): SourceDir = "PyVBA/src/sdl" FileNames = ["debugger.cpp",] # "SDL.cpp", ] for FileName in FileNames: FilePath = os.path.join(SourceDir, FileName) self.SourceFileNames.append(FilePath) SourceDir = "PyVBA/src/prof" FileNames = ["prof.cpp", ] for FileName in FileNames: FilePath = os.path.join(SourceDir, FileName) self.SourceFileNames.append(FilePath) SourceDir = "PyVBA/src" FileNames = ["expr-lex.cpp", "expr.cpp", "exprNode.cpp", "getopt.c", "getopt1.c",] for FileName in FileNames: FilePath = os.path.join(SourceDir, FileName) self.SourceFileNames.append(FilePath) def ListSourceFiles(self): SourceDir = "PyVBA/src" self.ListSourceFilesRoot() self.ListSourceFilesGB() self.ListSourceFilesSDL() self.ListSourceFilesNecroCore() def SetupMacros(self): self.Macros = {} if self.DebugFlag: self.Macros["NDEBUG"] = 1 self.Macros["FINAL_VERSION"] = 1 self.Macros["_CONSOLE"] = 1 self.Macros["BKPT_SUPPORT"] = 1 self.Macros["MMX"] = 1 self.Macros["SDL"] = 1 #self.Macros["_MSC_VER"] = "1400" # 1400 = VS2005, 1300=C++.NET2003 def BuildMacroList(self): self.MacroList = [] for (Name, Value) in self.Macros.items(): self.MacroList.append((Name, Value)) def ListLibraries(self): # Library list from the GBA solution build line: #odbc32.lib odbccp32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib #shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib self.LinkLibraries.append("wsock32") self.LinkLibraries.append("kernel32") self.LinkLibraries.append("user32") self.LinkLibraries.append("png") self.LinkLibraries.append("SDL") ############################## # ZLIB LIBRARY: Directory = "PyMAME/src/lib/zlib" FileNames = ["adler32.c", "compress.c", "crc32.c", "deflate.c", "gzio.c", "inffast.c", "inflate.c", "infback.c", "inftrees.c", "trees.c", "uncompr.c", "zutil.c"] ZLibSources = [] for FileName in FileNames: ZLibSources.append("%s/%s"%(Directory, FileName)) ZLibOptions = {"macros": self.MacroList, "sources": ZLibSources, "include_dirs": self.IncludeDirectories} ZLibLibrary = ("z", ZLibOptions) self.BuildLibraries.append(ZLibLibrary) ############################## # PNG LIBRARY: Directory = "PyVBA/src/lib/png" FileNames = ["example.c", "png.c", "pngerror.c", "pnggccrd.c", "pngget.c", "pngmem.c", "pngpread.c", "pngread.c", "pngrio.c", "pngrtran.c", "pngrutil.c", "pngset.c", "pngtest.c", "pngtrans.c", "pngvcrd.c", "pngwio.c", "pngwrite.c", "pngwtran.c", "pngwutil.c"] PNGSources = [] for FileName in FileNames: PNGSources.append("%s/%s"%(Directory, FileName)) PNGOptions = {"macros": self.MacroList, "sources": PNGSources, "include_dirs": self.IncludeDirectories} PNGLibrary = ("png", PNGOptions) self.BuildLibraries.append(PNGLibrary) def SetupOSSpecific(self): print "SetupOSSpecific(%s)"%self.OS if self.OS == "windows": ################################# # Add OS-specific include directories: self.IncludeDirectories.append("PyVBA/win32/include/zlib") self.IncludeDirectories.append("PyVBA/win32/include/png") self.IncludeDirectories.append("PyVBA/win32/include/cximage") self.IncludeDirectories.append("PyVBA/win32/SDL-1.2.2/include") # Add OS-specific library directories: self.LibraryDirectories.append("PyVBA/win32/lib/win32") self.LibraryDirectories.append("PyVBA/win32/SDL-1.2.2/lib") # Add OS-specific precomplier directives: self.Macros["WIN32"] = 1 def Build(self): """ Main method for preparing PyVBA.pyd or PyVBA_d.pyd. """ self.ListSourceFiles() self.SetupMacros() self.SetupOSSpecific() # Macros have all been set; list them now. self.BuildMacroList() # List all external libraries (.a files) to be built: self.ListLibraries() # Build 2xSaImmx, using assembler. (Currently hardcoded!) self.Build # Now, create the Extension object, and call setup: VBAExtension = distutils.core.Extension("PyVBA", sources = self.SourceFileNames, include_dirs = self.IncludeDirectories, define_macros = self.MacroList, libraries = self.LinkLibraries) print "Library directories:", self.LibraryDirectories VBAExtension.library_dirs = self.LibraryDirectories if self.DebugFlag: VBAExtension.extra_link_args = ["PyVBA/2xSaImmx_d.obj"] else: VBAExtension.extra_link_args = ["PyVBA/2xSaImmx.obj"] distutils.core.setup(name = "PyVBA", version='1.0', ext_modules = [VBAExtension], library_dirs = self.LibraryDirectories, libraries = self.BuildLibraries) if __name__ == "__main__": Builder = DistributionMaster() for Arg in sys.argv[1:]: if Arg == "-g": Builder.DebugFlag = 1 Builder.Build()