def compile_object( src_filename, fn_name = None, src_extension = None, declarations = [], extra_objects = [], extra_compile_flags = [], print_commands = None, compiler = None, compiler_flag_prefix = None): if print_commands is None: print_commands = config.print_commands if src_extension is None: src_extension = get_source_extension() if compiler is None: compiler = get_compiler() object_name = src_filename.replace(src_extension, object_extension) compiler_flags = get_compiler_flags(extra_compile_flags, compiler_flag_prefix) if isinstance(compiler, (list,tuple)): compiler_cmd = list(compiler) else: compiler_cmd = [compiler] compiler_cmd += compiler_flags compiler_cmd += ['-c', src_filename, '-o', object_name] run_cmd(compiler_cmd, label = "Compile source") return CompiledObject(src_filename = src_filename, object_filename = object_name, fn_name = fn_name)
def compile_with_distutils(extension_name, src_filename, extra_objects = [], extra_compiler_flags = [], extra_link_flags = [], print_commands = False): # copied largely from pyxbuild from distutils.dist import Distribution from distutils.extension import Extension compiler_flags = get_compiler_flags(extra_compiler_flags) # don't need -shared in the flags since the default CC on Mac OS # might specify -bundle instead and the two are mutually exclusive linker_flags = get_linker_flags(extra_link_flags, shared=False) ext = Extension(name=extension_name, sources=[src_filename], include_dirs = include_dirs, extra_objects=extra_objects, extra_compile_args=compiler_flags, extra_link_args=linker_flags) script_args = ['build_ext', '--quiet'] setup_args = {"script_name": None, "script_args": script_args, } dist = Distribution(setup_args) if not dist.ext_modules: dist.ext_modules = [] dist.ext_modules.append(ext) # I have no idea how distutils works or why I have to do any of this config_files = dist.find_config_files() try: config_files.remove('setup.cfg') except ValueError: pass dist.parse_config_files(config_files) dist.parse_command_line() obj_build_ext = dist.get_command_obj("build_ext") dist.run_commands() shared_name = obj_build_ext.get_outputs()[0] return shared_name