#!/usr/bin/env python import sys import os import os.path as op top = '.' out = 'build' def options(opt): opt.load('compiler_c python') def configure(conf): # We use clang to compile our app conf.env.CC = 'clang' # WAF has a "pyembed" feature allowing us to automatically find Python and compile by linking # to it. The problem is that because we made a copy of the Python library to mangle with its # "install name", we don't actually want to link to our installed python, but to our mangled # Python. The line below tells the "pyembed" WAF feature to look in ../build for Python. conf.env.LIBPATH_PYEMBED = op.abspath('../build') # I did a lot of fiddling-around, but I didn't find how to tell WAF the Python library name # to look for without making the whole compilation process fail, so I just create a symlink # with the name WAF is looking for. versioned_dylib_path = '../build/libpython{}m.dylib'.format(sys.version[:3]) if not op.exists(versioned_dylib_path): os.symlink('../build/Python', versioned_dylib_path) # The rest is standard WAF code that you can find the the python and macapp demos. conf.load('compiler_c python') conf.check_python_version((3,4,0)) conf.check_python_headers() conf.env.FRAMEWORK_COCOA = 'Cocoa' conf.env.ARCH_COCOA = ['x86_64'] conf.env.MACOSX_DEPLOYMENT_TARGET = '10.8' def build(ctx): # What do we compile? cocoalib_node = ctx.srcnode.find_dir('..').find_dir('cocoalib') cocoalib_folders = ['controllers', 'views'] cocoalib_includes = [cocoalib_node] + [cocoalib_node.find_dir(folder) for folder in cocoalib_folders] cocoalib_uses = ['NSEventAdditions', 'Dialogs', 'HSAboutBox', 'Utils', 'HSPyUtil', 'ProgressController', 'HSRecentFiles', 'HSQuicklook', 'ValueTransformers', 'NSImageAdditions', 'NSNotificationAdditions', 'views/HSTableView', 'views/HSOutlineView', 'views/NSIndexPathAdditions', 'views/NSTableViewAdditions', 'controllers/HSColumns', 'controllers/HSGUIController', 'controllers/HSTable', 'controllers/HSOutline', 'controllers/HSPopUpList', 'controllers/HSSelectableList', 'controllers/HSTextField', 'controllers/HSProgressWindow'] cocoalib_src = [cocoalib_node.find_node(usename + '.m') for usename in cocoalib_uses] + cocoalib_node.ant_glob('autogen/*.m') project_folders = [ctx.srcnode, ctx.srcnode.find_dir('autogen')] project_src = ctx.srcnode.ant_glob('autogen/*.m') + ctx.srcnode.ant_glob('*.m') # Compile ctx.program( # "pyembed" takes care of the include and linking stuff to compile an app that embed Python. features = 'c cprogram pyembed', target = ctx.bldnode.make_node("dupeGuru"), source = cocoalib_src + project_src, includes = project_folders + cocoalib_includes, use = 'COCOA', # Because our python lib's install name is "@rpath/Python", we need to set the executable's # rpath. Fortunately, WAF supports it and we just need to supply the "rpath" argument. rpath = '@executable_path/../Frameworks', framework = ['Quartz'], ) from waflib import TaskGen @TaskGen.extension('.m') def m_hook(self, node): """Alias .m files to be compiled the same as .c files, gcc will do the right thing.""" return self.create_compiled_task('c', node)