mirror of
				https://github.com/arsenetar/dupeguru.git
				synced 2025-09-11 17:58:17 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			79 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| #!/usr/bin/env python
 | |
| 
 | |
| import sys
 | |
| import os
 | |
| import os.path as op
 | |
| 
 | |
| top = '.'
 | |
| out = 'build'
 | |
| 
 | |
| def options(opt):
 | |
|     opt.load('compiler_c python')
 | |
|     opt.add_option('--edition', default='se', help="dupeGuru edition to build (se, me pe)")
 | |
| 
 | |
| def configure(conf):
 | |
|     if conf.options.edition not in ('se', 'me', 'pe'):
 | |
|         conf.options.edition = 'se'
 | |
|     print("Building dupeGuru {}".format(conf.options.edition.upper()))
 | |
|     conf.env.DGEDITION = conf.options.edition
 | |
|     # 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{}.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,3,0))
 | |
|     conf.check_python_headers()
 | |
|     conf.env.FRAMEWORK_COCOA = 'Cocoa'
 | |
|     conf.env.ARCH_COCOA = ['x86_64']
 | |
|     # Add cocoalib dir to the framework search path so we can find Sparkle.
 | |
|     conf.env.CFLAGS = ['-F'+op.abspath('../cocoalib')]
 | |
|     conf.env.LINKFLAGS = ['-F'+op.abspath('../cocoalib')]
 | |
| 
 | |
| 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 = ['autogen', 'base', ctx.env.DGEDITION]
 | |
|     project_src = sum([ctx.srcnode.ant_glob('%s/*.m' % folder) for folder in project_folders], [])
 | |
|     
 | |
|     # 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     = ['Sparkle', '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)
 | |
| 
 |