+ ## we need to pre-check argv for -h or --help or --verbose to deal with
+ ## initializing Configure correctly.
+ verbose = Configure.OUT_INFO
+ for arg in sys.argv:
+ if arg == '-h' or arg == '--help':
+ verbose = Configure.OUT_QUIET
+ break
+ if arg == '--verbose':
+ verbose = Configure.OUT_VERBOSE
+
+ ## create main objects; actions/probes run() is delayed.
+ ## if any actions must be run earlier (eg: for configure --help purposes)
+ ## then run() must be invoked earlier. subequent run() invocations
+ ## are ignored.
+ cfg = Configure( verbose )
+ host = HostTupleProbe(); host.run()
+
+ cfg.prefix_dir = ForHost( '/usr/local', ['/Applications','*-*-darwin*'] ).value
+
+ build = BuildAction()
+ arch = ArchAction(); arch.run()
+
+ ## create remaining main objects
+ core = CoreProbe()
+ repo = RepoProbe()
+ project = Project()
+
+ ## create tools in a scope
+ class Tools:
+ ar = ToolProbe( 'AR.exe', 'ar' )
+ cp = ToolProbe( 'CP.exe', 'cp' )
+ curl = ToolProbe( 'CURL.exe', 'curl', abort=False )
+ gcc = ToolProbe( 'GCC.gcc', 'gcc', IfHost( 'gcc-4', '*-*-cygwin*' ))
+
+ if host.match( '*-*-darwin*' ):
+ gmake = ToolProbe( 'GMAKE.exe', 'make', 'gmake' )
+ else:
+ gmake = ToolProbe( 'GMAKE.exe', 'gmake', 'make' )
+
+ m4 = ToolProbe( 'M4.exe', 'm4' )
+ mkdir = ToolProbe( 'MKDIR.exe', 'mkdir' )
+ patch = ToolProbe( 'PATCH.exe', 'gpatch', 'patch' )
+ rm = ToolProbe( 'RM.exe', 'rm' )
+ ranlib = ToolProbe( 'RANLIB.exe', 'ranlib' )
+ strip = ToolProbe( 'STRIP.exe', 'strip' )
+ tar = ToolProbe( 'TAR.exe', 'gtar', 'tar' )
+ wget = ToolProbe( 'WGET.exe', 'wget', abort=False )
+ yasm = ToolProbe( 'YASM.exe', 'yasm', abort=False )
+
+ xcodebuild = ToolProbe( 'XCODEBUILD.exe', 'xcodebuild', abort=False )
+ lipo = ToolProbe( 'LIPO.exe', 'lipo', abort=False )
+
+ fetch = SelectTool( 'FETCH.select', 'fetch', ['wget',wget], ['curl',curl] )
+
+ ## run tool probes
+ for tool in ToolProbe.tools:
+ tool.run()
+ for select in SelectTool.selects:
+ select.run()
+
+ debugMode = SelectMode( 'debug', ('none','none'), ('min','min'), ('std','std'), ('max','max') )
+ optimizeMode = SelectMode( 'optimize', ('none','none'), ('speed','speed'), ('size','size'), default='speed' )
+
+ ## create CLI and parse
+ cli = createCLI()
+ (options,args) = cli.parse_args()
+
+ ## update cfg with cli directory locations
+ cfg.update_cli( options )
+
+ ## prepare list of targets and NAME=VALUE args to pass to make
+ targets = []
+ exports = []
+ rx_exports = re.compile( '([^=]+)=(.*)' )
+ for arg in args:
+ m = rx_exports.match( arg )
+ if m:
+ exports.append( m.groups() )
+ else:
+ targets.append( arg )
+
+ ## re-run tools with cross-compilation needs
+ if options.cross:
+ for tool in ( Tools.ar, Tools.gcc, Tools.ranlib, Tools.strip ):
+ tool.__init__( tool.var, '%s-%s' % (options.cross,tool.name), **tool.kwargs )
+ tool.run()
+
+ ## run delayed actions
+ for action in Action.actions:
+ action.run()
+
+ if build.system == 'mingw':
+ dlfcn_test = """
+#include <dlfcn.h>
+#include <stdio.h>
+
+void fnord() { int i=42;}
+int main ()
+{
+ void *self = dlopen (0, RTLD_GLOBAL|RTLD_NOW);
+ int status = 1;
+
+ if (self)
+ {
+ if (dlsym (self,"fnord")) status = 0;
+ else if (dlsym( self,"_fnord")) status = 0;
+ /* dlclose (self); */
+ }
+ else
+ puts (dlerror ());
+
+ return status;
+}
+"""
+ dlfcn = LDProbe( 'static dlfcn', '%s -static' % Tools.gcc.pathname, '-ldl', dlfcn_test )
+ dlfcn.run()
+
+ pthread_test = """
+#include <stdio.h>
+#include <pthread.h>
+int main ()
+{
+ pthread_t thread;
+ pthread_create (&thread, NULL, NULL, NULL);
+ return 0;
+}
+"""
+ pthread = LDProbe( 'static pthread', '%s -static' % Tools.gcc.pathname, '-lpthreadGC2', pthread_test )
+ pthread.run()
+
+ bz2_test = """
+#include <stdio.h>
+#include <bzlib.h>
+int main ()
+{
+ BZ2_bzReadOpen(NULL, NULL, 0, 0, NULL, 0);
+ return 0;
+}
+"""
+ bz2 = LDProbe( 'static bz2', '%s -static' % Tools.gcc.pathname, '-lbz2', bz2_test )
+ bz2.run()
+
+ libz_test = """
+#include <stdio.h>
+#include <zlib.h>
+int main ()
+{
+ compress(NULL, NULL, NULL, 0);
+ return 0;
+}
+"""
+ libz = LDProbe( 'static zlib', '%s -static' % Tools.gcc.pathname, '-lz', libz_test )
+ libz.run()
+
+ iconv_test = """
+#include <stdio.h>
+#include <iconv.h>
+int main ()
+{
+ iconv_open(NULL, NULL);
+ return 0;
+}
+"""
+ iconv = LDProbe( 'static iconv', '%s -static' % Tools.gcc.pathname, '-liconv', iconv_test )
+ iconv.run()
+
+ ## cfg hook before doc prep
+ cfg.doc_ready()
+
+ ## create document object
+ doc = ConfigDocument()
+ doc.addComment( 'generated by configure on %s', time.strftime( '%c' ))
+
+ ## add configure line for reconfigure purposes
+ doc.addBlank()
+ args = []
+ for arg in Option.conf_args:
+ args.append( arg[1] )
+ doc.add( 'CONF.args', ' '.join( args ))
+
+ doc.addBlank()
+ doc.add( 'HB.title', project.title )
+ doc.add( 'HB.name', project.name )
+ doc.add( 'HB.name.lower', project.name_lower )
+ doc.add( 'HB.name.upper', project.name_upper )
+ doc.add( 'HB.acro.lower', project.acro_lower )
+ doc.add( 'HB.acro.upper', project.acro_upper )
+
+ doc.add( 'HB.url.website', project.url_website )
+ doc.add( 'HB.url.community', project.url_community )
+ doc.add( 'HB.url.irc', project.url_irc )
+ doc.add( 'HB.url.appcast', project.url_appcast )
+ doc.add( 'HB.url.appnote', project.url_appnote )
+
+ doc.add( 'HB.version.major', project.vmajor )
+ doc.add( 'HB.version.minor', project.vminor )
+ doc.add( 'HB.version.point', project.vpoint )
+ doc.add( 'HB.version', project.version )
+ doc.add( 'HB.version.hex', '%04x%02x%02x%08x' % (project.vmajor,project.vminor,project.vpoint,repo.rev) )
+
+ doc.add( 'HB.build', project.build )
+
+ doc.add( 'HB.repo.url', repo.url )
+ doc.add( 'HB.repo.root', repo.root )
+ doc.add( 'HB.repo.branch', repo.branch )
+ doc.add( 'HB.repo.uuid', repo.uuid )
+ doc.add( 'HB.repo.rev', repo.rev )
+ doc.add( 'HB.repo.date', repo.date )
+ doc.add( 'HB.repo.official', repo.official )
+ doc.add( 'HB.repo.type', repo.type )
+
+ doc.addBlank()
+ doc.add( 'HOST.spec', host.spec )
+ doc.add( 'HOST.machine', host.machine )
+ doc.add( 'HOST.vendor', host.vendor )
+ doc.add( 'HOST.system', host.system )
+ doc.add( 'HOST.systemf', host.systemf )
+ doc.add( 'HOST.release', host.release )
+ doc.add( 'HOST.extra', host.extra )
+ doc.add( 'HOST.title', '%s %s' % (host.systemf,arch.mode.default) )
+ doc.add( 'HOST.ncpu', core.count )
+
+ doc.addBlank()
+ doc.add( 'BUILD.spec', build.spec )
+ doc.add( 'BUILD.machine', build.machine )
+ doc.add( 'BUILD.vendor', build.vendor )
+ doc.add( 'BUILD.system', build.system )
+ doc.add( 'BUILD.systemf', build.systemf )
+ doc.add( 'BUILD.release', build.release )
+ doc.add( 'BUILD.extra', build.extra )
+ doc.add( 'BUILD.title', build.title )
+ doc.add( 'BUILD.ncpu', core.count )
+ doc.add( 'BUILD.jobs', core.jobs )
+
+ doc.add( 'BUILD.cross', int(options.cross != None or arch.mode.mode != arch.mode.default) )
+ if options.cross:
+ doc.add( 'BUILD.cross.prefix', '%s-' % (options.cross) )
+ else:
+ doc.add( 'BUILD.cross.prefix', '' )
+
+ doc.add( 'BUILD.method', 'terminal' )
+ doc.add( 'BUILD.date', time.strftime('%c') )
+ doc.add( 'BUILD.arch', arch.mode.mode )
+
+ doc.addBlank()
+ doc.add( 'CONF.method', options.conf_method )
+
+ doc.addBlank()
+ doc.add( 'SRC', cfg.src_final )
+ doc.add( 'SRC/', cfg.src_final + os.sep )
+ doc.add( 'BUILD', cfg.build_final )
+ doc.add( 'BUILD/', cfg.build_final + os.sep )
+ doc.add( 'PREFIX', cfg.prefix_final )
+ doc.add( 'PREFIX/', cfg.prefix_final + os.sep )
+
+ doc.addBlank()
+ doc.add( 'FEATURE.asm', 'disabled' )
+ doc.add( 'FEATURE.gtk', int( not options.disable_gtk ))
+ doc.add( 'FEATURE.gtk.update.checks', int( not options.disable_gtk_update_checks ))
+ doc.add( 'FEATURE.gtk.mingw', int( options.enable_gtk_mingw ))
+ doc.add( 'FEATURE.xcode', int( not (Tools.xcodebuild.fail or options.disable_xcode or options.cross) ))
+
+ if not Tools.xcodebuild.fail and not options.disable_xcode:
+ doc.addBlank()
+ doc.add( 'XCODE.external.src', cfg.xcode_x_src )
+ doc.add( 'XCODE.external.build', cfg.xcode_x_build )
+ doc.add( 'XCODE.external.prefix', cfg.xcode_x_prefix )
+
+ doc.addBlank()
+ if build.system == 'mingw':
+ if not dlfcn.fail:
+ doc.add( 'HAS.dlfcn', 1 )
+ if not pthread.fail:
+ doc.add( 'HAS.pthread', 1 )
+ if not bz2.fail:
+ doc.add( 'HAS.bz2', 1 )
+ if not libz.fail:
+ doc.add( 'HAS.libz', 1 )
+ if not iconv.fail:
+ doc.add( 'HAS.iconv', 1 )
+
+ doc.addMake( '' )
+ doc.addMake( '## define debug mode before other includes' )
+ doc.addMake( '## since it is tested in some module.defs' )
+ doc.add( 'GCC.g', debugMode.mode )
+ doc.addBlank()
+ doc.addMake( '## include definitions' )
+ doc.addMake( 'include $(SRC/)make/include/main.defs' )
+
+ doc.addBlank()
+ for tool in ToolProbe.tools:
+ tool.doc_add( doc )
+
+ doc.addBlank()
+ for select in SelectTool.selects:
+ select.doc_add( doc )
+
+ doc.addBlank()
+ if build.match( '*-*-darwin*' ):
+ doc.add( 'GCC.archs', arch.mode.mode )
+ doc.add( 'GCC.sysroot', cfg.sysroot_dir )
+ doc.add( 'GCC.minver', cfg.minver )
+ else:
+ doc.add( 'GCC.archs', '' )
+ doc.add( 'GCC.sysroot', '' )
+ doc.add( 'GCC.minver', '' )
+ doc.add( 'GCC.ldsysroot', '$(GCC.sysroot)' )
+ doc.add( 'GCC.ldminver', '$(GCC.minver)' )
+ doc.add( 'GCC.O', optimizeMode.mode )
+
+ if options.enable_asm and not Tools.yasm.fail:
+ asm = ''
+ if build.match( 'i?86-*' ):
+ asm = 'x86'
+ doc.add( 'LIBHB.GCC.D', 'HAVE_MMX', append=True )
+ doc.add( 'LIBHB.YASM.D', 'ARCH_X86', append=True )
+ if build.match( '*-*-darwin*' ):
+ doc.add( 'LIBHB.YASM.f', 'macho32' )
+ else:
+ doc.add( 'LIBHB.YASM.f', 'elf32' )
+ doc.add( 'LIBHB.YASM.m', 'x86' )
+ elif build.match( 'x86_64-*' ):
+ asm = 'x86'
+ doc.add( 'LIBHB.GCC.D', 'HAVE_MMX ARCH_X86_64', append=True )
+ if build.match( '*-*-darwin*' ):
+ doc.add( 'LIBHB.YASM.D', 'ARCH_X86_64 PIC', append=True )
+ doc.add( 'LIBHB.YASM.f', 'macho64' )
+ else:
+ doc.add( 'LIBHB.YASM.D', 'ARCH_X86_64', append=True )
+ doc.add( 'LIBHB.YASM.f', 'elf64' )
+ doc.add( 'LIBHB.YASM.m', 'amd64' )
+ doc.update( 'FEATURE.asm', asm )
+
+ ## add exports to make
+ if len(exports):
+ doc.addBlank()
+ doc.addComment( 'overrides via VARIABLE=VALUE on command-line' )
+ for nv in exports:
+ doc.add( nv[0], nv[1] )
+
+ doc.addMake( '' )
+ doc.addMake( '## include custom definitions' )
+ doc.addMake( '-include $(SRC/)custom.defs' )
+ doc.addMake( '-include $(BUILD/)GNUmakefile.custom.defs' )
+
+ doc.addMake( '' )
+ doc.addMake( '## include rules' )
+ doc.addMake( 'include $(SRC/)make/include/main.rules' )
+ doc.addMake( '-include $(SRC/)custom.rules' )
+ doc.addMake( '-include $(BUILD/)GNUmakefile.custom.rules' )
+
+ ## chdir
+ cfg.chdir()
+
+ ## perform
+ doc.write( 'make' )
+ doc.write( 'm4' )
+ if options.launch:
+ Launcher( targets )
+
+ cfg.record_log()
+
+ if os.path.normpath( cfg.build_dir ) == os.curdir:
+ nocd = True
+ else:
+ nocd = False