| #!/usr/bin/env python |
| |
| """Ninja toolchain abstraction for Clang compiler suite""" |
| |
| import os |
| import subprocess |
| |
| import toolchain |
| |
| class ClangToolchain(toolchain.Toolchain): |
| |
| def initialize(self, project, archs, configs, includepaths, dependlibs, libpaths, variables, subninja): |
| #Local variable defaults |
| self.toolchain = '' |
| self.sdkpath = '' |
| self.includepaths = [] |
| self.libpaths = libpaths |
| self.ccompiler = os.environ.get('CC') or 'clang' |
| self.cxxcompiler = os.environ.get('CXX') or 'clang++' |
| if self.target.is_windows(): |
| self.archiver = os.environ.get('AR') or 'llvm-ar' |
| self.linker = os.environ.get('CC') or 'lld-link' |
| self.cxxlinker = os.environ.get('CXX') or 'lld-link' |
| else: |
| self.archiver = os.environ.get('AR') or 'ar' |
| self.linker = os.environ.get('CC') or 'clang' |
| self.cxxlinker = os.environ.get('CXX') or 'clang++' |
| |
| #Default variables |
| self.sysroot = '' |
| if self.target.is_ios(): |
| self.deploymenttarget = '9.0' |
| if self.target.is_macos(): |
| self.deploymenttarget = '10.7' |
| |
| #Command definitions |
| self.cccmd = '$toolchain$cc -MMD -MT $out -MF $out.d $includepaths $moreincludepaths $cflags $carchflags $cconfigflags $cmoreflags $cenvflags -c $in -o $out' |
| self.cxxcmd = '$toolchain$cxx -MMD -MT $out -MF $out.d $includepaths $moreincludepaths $cxxflags $carchflags $cconfigflags $cmoreflags $cxxenvflags -c $in -o $out' |
| self.ccdeps = 'gcc' |
| self.ccdepfile = '$out.d' |
| self.arcmd = self.rmcmd('$out') + ' && $toolchain$ar crs $ararchflags $arflags $arenvflags $out $in' |
| if self.target.is_windows(): |
| self.linkcmd = '$toolchain$link $libpaths $configlibpaths $linkflags $linkarchflags $linkconfigflags $linkenvflags /debug /nologo /subsystem:console /dynamicbase /nxcompat /manifest /manifestuac:\"level=\'asInvoker\' uiAccess=\'false\'\" /tlbid:1 /pdb:$pdbpath /out:$out $in $libs $archlibs $oslibs $frameworks' |
| self.dllcmd = self.linkcmd + ' /dll' |
| else: |
| self.linkcmd = '$toolchain$link $libpaths $configlibpaths $linkflags $linkarchflags $linkconfigflags $linkenvflags -o $out $in $libs $archlibs $oslibs $frameworks' |
| |
| #Base flags |
| self.cflags = ['-D' + project.upper() + '_COMPILE=1', |
| '-funit-at-a-time', '-fstrict-aliasing', '-fvisibility=hidden', '-fno-stack-protector', |
| '-fomit-frame-pointer', '-fno-math-errno','-ffinite-math-only', '-funsafe-math-optimizations', |
| '-fno-trapping-math', '-ffast-math'] |
| self.cwarnflags = ['-W', '-Werror', '-pedantic', '-Wall', '-Weverything', |
| '-Wno-c++98-compat', '-Wno-padded', '-Wno-documentation-unknown-command', |
| '-Wno-implicit-fallthrough', '-Wno-static-in-inline', '-Wno-reserved-id-macro', '-Wno-disabled-macro-expansion'] |
| self.cmoreflags = [] |
| self.mflags = [] |
| self.arflags = [] |
| self.linkflags = [] |
| self.oslibs = [] |
| self.frameworks = [] |
| |
| self.initialize_subninja(subninja) |
| self.initialize_archs(archs) |
| self.initialize_configs(configs) |
| self.initialize_project(project) |
| self.initialize_toolchain() |
| self.initialize_depends(dependlibs) |
| |
| self.parse_default_variables(variables) |
| self.read_build_prefs() |
| |
| if self.target.is_linux() or self.target.is_bsd() or self.target.is_raspberrypi() or self.target.is_sunos(): |
| self.cflags += ['-D_GNU_SOURCE=1'] |
| self.linkflags += ['-pthread'] |
| self.oslibs += ['m'] |
| if self.target.is_linux() or self.target.is_raspberrypi(): |
| self.oslibs += ['dl'] |
| if self.target.is_bsd(): |
| self.oslibs += ['execinfo'] |
| if self.target.is_haiku(): |
| self.cflags += ['-D_GNU_SOURCE=1'] |
| self.linkflags += ['-lpthread'] |
| self.oslibs += ['m'] |
| if not self.target.is_windows(): |
| self.linkflags += ['-fomit-frame-pointer'] |
| |
| self.includepaths = self.prefix_includepaths((includepaths or []) + ['.']) |
| |
| if self.is_monolithic(): |
| self.cflags += ['-DBUILD_MONOLITHIC=1'] |
| if self.use_coverage(): |
| self.cflags += ['--coverage'] |
| self.linkflags += ['--coverage'] |
| |
| if not 'nowarning' in variables or not variables['nowarning']: |
| self.cflags += self.cwarnflags |
| else: |
| self.cflags += ['-w'] |
| self.cxxflags = list(self.cflags) |
| |
| self.cflags += ['-std=c11'] |
| if self.target.is_macos() or self.target.is_ios(): |
| self.cxxflags += ['-std=c++14', '-stdlib=libc++'] |
| else: |
| self.cxxflags += ['-std=c++14'] |
| |
| #Overrides |
| self.objext = '.o' |
| |
| #Builders |
| self.builders['c'] = self.builder_cc |
| self.builders['cc'] = self.builder_cxx |
| self.builders['cpp'] = self.builder_cxx |
| self.builders['lib'] = self.builder_lib |
| self.builders['sharedlib'] = self.builder_sharedlib |
| self.builders['bin'] = self.builder_bin |
| if self.target.is_macos() or self.target.is_ios(): |
| self.builders['m'] = self.builder_cm |
| self.builders['multilib'] = self.builder_apple_multilib |
| self.builders['multisharedlib'] = self.builder_apple_multisharedlib |
| self.builders['multibin'] = self.builder_apple_multibin |
| else: |
| self.builders['multilib'] = self.builder_multicopy |
| self.builders['multisharedlib'] = self.builder_multicopy |
| self.builders['multibin'] = self.builder_multicopy |
| |
| #Setup target platform |
| self.build_toolchain() |
| |
| def name(self): |
| return 'clang' |
| |
| def parse_prefs(self, prefs): |
| super(ClangToolchain, self).parse_prefs(prefs) |
| if 'clang' in prefs: |
| clangprefs = prefs['clang'] |
| if 'toolchain' in clangprefs: |
| self.toolchain = clangprefs['toolchain'] |
| if os.path.split(self.toolchain)[1] != 'bin': |
| self.toolchain = os.path.join(self.toolchain, 'bin') |
| if 'archiver' in clangprefs: |
| self.archiver = clangprefs['archiver'] |
| if self.target.is_ios() and 'ios' in prefs: |
| iosprefs = prefs['ios'] |
| if 'deploymenttarget' in iosprefs: |
| self.deploymenttarget = iosprefs['deploymenttarget'] |
| if self.target.is_macos() and 'macos' in prefs: |
| macosprefs = prefs['macos'] |
| if 'deploymenttarget' in macosprefs: |
| self.deploymenttarget = macosprefs['deploymenttarget'] |
| |
| def write_variables(self, writer): |
| super(ClangToolchain, self).write_variables(writer) |
| writer.variable('toolchain', self.toolchain) |
| writer.variable('sdkpath', self.sdkpath) |
| writer.variable('sysroot', self.sysroot) |
| writer.variable('cc', self.ccompiler) |
| writer.variable('cxx', self.cxxcompiler) |
| writer.variable('ar', self.archiver) |
| writer.variable('link', self.linker) |
| if self.target.is_macos() or self.target.is_ios(): |
| writer.variable('lipo', self.lipo) |
| writer.variable('includepaths', self.make_includepaths(self.includepaths)) |
| writer.variable('moreincludepaths', '') |
| writer.variable('cflags', self.cflags) |
| writer.variable('cxxflags', self.cxxflags) |
| if self.target.is_macos() or self.target.is_ios(): |
| writer.variable('mflags', self.mflags) |
| writer.variable('carchflags', '') |
| writer.variable('cconfigflags', '') |
| writer.variable('cmoreflags', self.cmoreflags) |
| writer.variable('cenvflags', (os.environ.get('CFLAGS') or '').split()) |
| writer.variable('cxxenvflags', (os.environ.get('CXXFLAGS') or '').split()) |
| writer.variable('arflags', self.arflags) |
| writer.variable('ararchflags', '') |
| writer.variable('arconfigflags', '') |
| writer.variable('arenvflags', (os.environ.get('ARFLAGS') or '').split()) |
| writer.variable('linkflags', self.linkflags) |
| writer.variable('linkarchflags', '') |
| writer.variable('linkconfigflags', '') |
| writer.variable('linkenvflags', (os.environ.get('LDFLAGS') or '').split()) |
| writer.variable('libs', '') |
| writer.variable('libpaths', self.make_libpaths(self.libpaths)) |
| writer.variable('configlibpaths', '') |
| writer.variable('archlibs', '') |
| writer.variable('oslibs', self.make_libs(self.oslibs)) |
| writer.variable('frameworks', '') |
| if self.target.is_windows(): |
| writer.variable('pdbpath', 'ninja.pdb') |
| writer.newline() |
| |
| def write_rules(self, writer): |
| super(ClangToolchain, self).write_rules(writer) |
| writer.rule('cc', command = self.cccmd, depfile = self.ccdepfile, deps = self.ccdeps, description = 'CC $in') |
| writer.rule('cxx', command = self.cxxcmd, depfile = self.ccdepfile, deps = self.ccdeps, description = 'CXX $in') |
| if self.target.is_macos() or self.target.is_ios(): |
| writer.rule('cm', command = self.cmcmd, depfile = self.ccdepfile, deps = self.ccdeps, description = 'CM $in') |
| writer.rule( 'lipo', command = self.lipocmd, description = 'LIPO $out' ) |
| writer.rule('ar', command = self.arcmd, description = 'LIB $out') |
| writer.rule('link', command = self.linkcmd, description = 'LINK $out') |
| if self.target.is_windows(): |
| writer.rule('dll', command = self.dllcmd, description = 'DLL $out') |
| else: |
| writer.rule('so', command = self.linkcmd, description = 'SO $out') |
| writer.newline() |
| |
| def build_toolchain(self): |
| super(ClangToolchain, self).build_toolchain() |
| if self.target.is_windows(): |
| self.build_windows_toolchain() |
| elif self.target.is_android(): |
| self.build_android_toolchain() |
| elif self.target.is_macos() or self.target.is_ios(): |
| self.build_xcode_toolchain() |
| if self.toolchain != '' and not self.toolchain.endswith('/') and not self.toolchain.endswith('\\'): |
| self.toolchain += os.sep |
| |
| def build_windows_toolchain(self): |
| self.cflags += ['-U__STRICT_ANSI__', '-Wno-reserved-id-macro'] |
| self.oslibs = ['kernel32', 'user32', 'shell32', 'advapi32'] |
| |
| def build_android_toolchain(self): |
| self.archiver = 'ar' |
| |
| self.cccmd += ' --sysroot=$sysroot' |
| self.linkcmd += ' -shared -Wl,-soname,$liblinkname --sysroot=$sysroot' |
| self.cflags += ['-fpic', '-ffunction-sections', '-funwind-tables', '-fstack-protector', '-fomit-frame-pointer', |
| '-no-canonical-prefixes', '-Wa,--noexecstack'] |
| |
| self.linkflags += ['-no-canonical-prefixes', '-Wl,--no-undefined', '-Wl,-z,noexecstack', '-Wl,-z,relro', '-Wl,-z,now'] |
| |
| self.includepaths += [os.path.join('$ndk', 'sources', 'android', 'native_app_glue'), |
| os.path.join('$ndk', 'sources', 'android', 'cpufeatures')] |
| |
| self.oslibs += ['log'] |
| |
| self.toolchain = os.path.join('$ndk', 'toolchains', 'llvm', 'prebuilt', self.android.hostarchname, 'bin', '') |
| |
| def build_xcode_toolchain(self): |
| if self.target.is_macos(): |
| sdk = 'macosx' |
| deploytarget = 'MACOSX_DEPLOYMENT_TARGET=' + self.deploymenttarget |
| self.cflags += ['-fasm-blocks', '-mmacosx-version-min=' + self.deploymenttarget, '-isysroot', '$sysroot'] |
| self.cxxflags += ['-fasm-blocks', '-mmacosx-version-min=' + self.deploymenttarget, '-isysroot', '$sysroot'] |
| self.arflags += ['-static', '-no_warning_for_no_symbols'] |
| self.linkflags += ['-isysroot', '$sysroot'] |
| elif self.target.is_ios(): |
| sdk = 'iphoneos' |
| deploytarget = 'IPHONEOS_DEPLOYMENT_TARGET=' + self.deploymenttarget |
| self.cflags += ['-fasm-blocks', '-miphoneos-version-min=' + self.deploymenttarget, '-isysroot', '$sysroot'] |
| self.cxxflags += ['-fasm-blocks', '-miphoneos-version-min=' + self.deploymenttarget, '-isysroot', '$sysroot'] |
| self.arflags += ['-static', '-no_warning_for_no_symbols'] |
| self.linkflags += ['-isysroot', '$sysroot'] |
| self.cflags += ['-fembed-bitcode-marker'] |
| |
| platformpath = toolchain.check_output(['xcrun', '--sdk', sdk, '--show-sdk-platform-path']) |
| localpath = platformpath + "/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" |
| |
| self.sysroot = toolchain.check_output(['xcrun', '--sdk', sdk, '--show-sdk-path']) |
| |
| self.ccompiler = "PATH=" + localpath + " " + toolchain.check_output(['xcrun', '--sdk', sdk, '-f', 'clang']) |
| self.archiver = "PATH=" + localpath + " " + toolchain.check_output(['xcrun', '--sdk', sdk, '-f', 'libtool']) |
| self.linker = deploytarget + " " + self.ccompiler |
| self.lipo = "PATH=" + localpath + " " + toolchain.check_output(['xcrun', '--sdk', sdk, '-f', 'lipo']) |
| |
| self.mflags += list(self.cflags) + ['-fobjc-arc', '-fno-objc-exceptions', '-x', 'objective-c'] |
| self.cflags += ['-x', 'c'] |
| self.cxxflags += ['-x', 'c++'] |
| |
| self.cmcmd = self.cccmd.replace('$cflags', '$mflags') |
| self.arcmd = self.rmcmd('$out') + ' && $ar $ararchflags $arflags $in -o $out' |
| self.lipocmd = '$lipo $in -create -output $out' |
| |
| if self.target.is_macos(): |
| self.frameworks = ['Cocoa', 'CoreFoundation'] |
| if self.target.is_ios(): |
| self.frameworks = ['CoreGraphics', 'UIKit', 'Foundation'] |
| |
| def make_includepaths(self, includepaths): |
| if not includepaths is None: |
| return ['-I' + path for path in list(includepaths)] |
| return [] |
| |
| def make_libpath(self, path): |
| return self.path_escape(path) |
| |
| def make_libpaths(self, libpaths): |
| if not libpaths is None: |
| if self.target.is_windows(): |
| return ['/libpath:' + self.path_escape(path) for path in libpaths] |
| return ['-L' + self.make_libpath(path) for path in libpaths] |
| return [] |
| |
| def make_targetarchflags(self, arch, targettype): |
| flags = [] |
| if self.target.is_android(): |
| if arch == 'x86': |
| flags += ['-target', 'i686-none-linux-android'] |
| flags += ['-march=i686', '-mtune=intel', '-mssse3', '-mfpmath=sse', '-m32'] |
| elif arch == 'x86-64': |
| flags += ['-target', 'x86_64-none-linux-android'] |
| flags += ['-march=x86-64', '-msse4.2', '-mpopcnt', '-m64', '-mtune=intel'] |
| elif arch == 'arm6': |
| flags += ['-target', 'armv5te-none-linux-androideabi'] |
| flags += ['-march=armv5te', '-mtune=xscale', '-msoft-float', '-marm'] |
| elif arch == 'arm7': |
| flags += ['-target', 'armv7-none-linux-androideabi'] |
| flags += ['-march=armv7-a', '-mhard-float', '-mfpu=vfpv3-d16', '-mfpu=neon', '-D_NDK_MATH_NO_SOFTFP=1', '-marm'] |
| elif arch == 'arm64': |
| flags += ['-target', 'aarch64-none-linux-android'] |
| elif arch == 'mips': |
| flags += ['-target', 'mipsel-none-linux-android'] |
| elif arch == 'mips64': |
| flags += ['-target', 'mips64el-none-linux-android'] |
| flags += ['-gcc-toolchain', self.android.make_gcc_toolchain_path(arch)] |
| elif self.target.is_macos() or self.target.is_ios(): |
| if arch == 'x86': |
| flags += ['-arch', 'x86'] |
| elif arch == 'x86-64': |
| flags += ['-arch', 'x86_64'] |
| elif arch == 'arm7': |
| flags += ['-arch', 'armv7'] |
| elif arch == 'arm64': |
| flags += ['-arch', 'arm64'] |
| elif self.target.is_windows(): |
| if arch == 'x86': |
| flags += ['-target', 'x86-pc-windows-msvc'] |
| elif arch == 'x64': |
| flags += ['-target', 'x86_64-pc-windows-msvc'] |
| else: |
| if arch == 'x86': |
| flags += ['-m32'] |
| elif arch == 'x86-64': |
| flags += ['-m64'] |
| return flags |
| |
| def make_carchflags(self, arch, targettype): |
| flags = [] |
| if targettype == 'sharedlib': |
| flags += ['-DBUILD_DYNAMIC_LINK=1'] |
| if self.target.is_linux() or self.target.is_bsd() or self.target.is_sunos(): |
| flags += ['-fPIC'] |
| flags += self.make_targetarchflags(arch, targettype) |
| return flags |
| |
| def make_cconfigflags(self, config, targettype): |
| flags = ['-g'] |
| if config == 'debug': |
| flags += ['-DBUILD_DEBUG=1'] |
| elif config == 'release': |
| flags += ['-DBUILD_RELEASE=1', '-O3', '-funroll-loops'] |
| elif config == 'profile': |
| flags += ['-DBUILD_PROFILE=1', '-O3', '-funroll-loops'] |
| elif config == 'deploy': |
| flags += ['-DBUILD_DEPLOY=1', '-O3', '-funroll-loops'] |
| return flags |
| |
| def make_ararchflags(self, arch, targettype): |
| flags = [] |
| return flags |
| |
| def make_arconfigflags(self, config, targettype): |
| flags = [] |
| return flags |
| |
| def make_linkarchflags(self, arch, targettype, variables): |
| flags = [] |
| flags += self.make_targetarchflags(arch, targettype) |
| if self.target.is_android(): |
| if arch == 'arm7': |
| flags += ['-Wl,--no-warn-mismatch', '-Wl,--fix-cortex-a8'] |
| if self.target.is_windows(): |
| # Ignore target arch flags from above, add link style arch instead |
| flags = [] |
| if arch == 'x86': |
| flags += ['/machine:x86'] |
| elif arch == 'x86-64': |
| flags += ['/machine:x64'] |
| if self.target.is_macos() and variables != None and 'support_lua' in variables and variables['support_lua']: |
| flags += ['-pagezero_size', '10000', '-image_base', '100000000'] |
| return flags |
| |
| def make_linkconfigflags(self, config, targettype, variables): |
| flags = [] |
| if self.target.is_windows(): |
| if config == 'debug': |
| flags += ['/incremental', '/defaultlib:libcmtd'] |
| else: |
| flags += ['/incremental:no', '/opt:ref', '/opt:icf', '/defaultlib:libcmt'] |
| elif self.target.is_macos() or self.target.is_ios(): |
| if targettype == 'sharedlib' or targettype == 'multisharedlib': |
| flags += ['-dynamiclib'] |
| else: |
| if targettype == 'sharedlib': |
| flags += ['-shared', '-fPIC'] |
| if config != 'debug': |
| if (targettype == 'bin' or targettype == 'sharedlib') and self.use_lto(): |
| flags += ['-flto'] |
| return flags |
| |
| def make_linkarchlibs(self, arch, targettype): |
| archlibs = [] |
| if self.target.is_android(): |
| if arch == 'arm7': |
| archlibs += ['m_hard'] |
| else: |
| archlibs += ['m'] |
| archlibs += ['gcc', 'android'] |
| return archlibs |
| |
| def make_libs(self, libs): |
| if libs != None: |
| if self.target.is_windows(): |
| return [lib + ".lib" for lib in libs] |
| return ['-l' + lib for lib in libs] |
| return [] |
| |
| def make_frameworks(self, frameworks): |
| if frameworks != None: |
| return ['-framework ' + framework for framework in frameworks] |
| return [] |
| |
| def make_configlibpaths(self, config, arch, extralibpaths): |
| libpaths = [self.libpath, os.path.join(self.libpath, config)] |
| if not self.target.is_macos() and not self.target.is_ios(): |
| libpaths += [os.path.join(self.libpath, arch)] |
| libpaths += [os.path.join(self.libpath, config, arch)] |
| if extralibpaths != None: |
| libpaths += [os.path.join(libpath, self.libpath) for libpath in extralibpaths] |
| libpaths += [os.path.join(libpath, self.libpath, config) for libpath in extralibpaths] |
| if not self.target.is_macos() and not self.target.is_ios(): |
| libpaths += [os.path.join(libpath, self.libpath, arch) for libpath in extralibpaths] |
| libpaths += [os.path.join(libpath, self.libpath, config, arch) for libpath in extralibpaths] |
| return self.make_libpaths(libpaths) |
| |
| def cc_variables(self, config, arch, targettype, variables): |
| localvariables = [] |
| if 'includepaths' in variables: |
| moreincludepaths = self.make_includepaths(variables['includepaths']) |
| if not moreincludepaths == []: |
| localvariables += [('moreincludepaths', moreincludepaths)] |
| carchflags = self.make_carchflags(arch, targettype) |
| if carchflags != []: |
| localvariables += [('carchflags', carchflags)] |
| cconfigflags = self.make_cconfigflags(config, targettype) |
| if cconfigflags != []: |
| localvariables += [('cconfigflags', cconfigflags)] |
| if self.target.is_android(): |
| localvariables += [('sysroot', self.android.make_sysroot_path(arch))] |
| if 'defines' in variables: |
| localvariables += [('cmoreflags', ['-D' + define for define in variables['defines']])] |
| return localvariables |
| |
| def ar_variables(self, config, arch, targettype, variables): |
| localvariables = [] |
| ararchflags = self.make_ararchflags(arch, targettype) |
| if ararchflags != []: |
| localvariables += [('ararchflags', ararchflags)] |
| arconfigflags = self.make_arconfigflags(config, targettype) |
| if arconfigflags != []: |
| localvariables += [('arconfigflags', arconfigflags)] |
| if self.target.is_android(): |
| localvariables += [('toolchain', self.android.make_gcc_bin_path(arch))] |
| return localvariables |
| |
| def link_variables(self, config, arch, targettype, variables): |
| if variables == None: |
| variables = {} |
| localvariables = [] |
| linkarchflags = self.make_linkarchflags(arch, targettype, variables) |
| if linkarchflags != []: |
| localvariables += [('linkarchflags', linkarchflags)] |
| linkconfigflags = self.make_linkconfigflags(config, targettype, variables) |
| if linkconfigflags != []: |
| localvariables += [('linkconfigflags', linkconfigflags)] |
| if 'libs' in variables: |
| libvar = self.make_libs(variables['libs']) |
| if libvar != []: |
| localvariables += [('libs', libvar)] |
| |
| localframeworks = self.frameworks or [] |
| if 'frameworks' in variables and variables['frameworks'] != None: |
| localframeworks += list(variables['frameworks']) |
| if len(localframeworks) > 0: |
| localvariables += [('frameworks', self.make_frameworks(list(localframeworks)))] |
| |
| libpaths = [] |
| if 'libpaths' in variables: |
| libpaths = variables['libpaths'] |
| localvariables += [('configlibpaths', self.make_configlibpaths(config, arch, libpaths))] |
| if self.target.is_android(): |
| localvariables += [('sysroot', self.android.make_sysroot_path(arch))] |
| archlibs = self.make_linkarchlibs(arch, targettype) |
| if archlibs != []: |
| localvariables += [('archlibs', self.make_libs(archlibs))] |
| |
| if 'runtime' in variables and variables['runtime'] == 'c++': |
| localvariables += [('link', self.cxxlinker)] |
| |
| return localvariables |
| |
| def builder_cc(self, writer, config, arch, targettype, infile, outfile, variables): |
| return writer.build(outfile, 'cc', infile, implicit = self.implicit_deps(config, variables), variables = self.cc_variables(config, arch, targettype, variables)) |
| |
| def builder_cxx(self, writer, config, arch, targettype, infile, outfile, variables): |
| return writer.build(outfile, 'cxx', infile, implicit = self.implicit_deps(config, variables), variables = self.cc_variables(config, arch, targettype, variables)) |
| |
| def builder_cm(self, writer, config, arch, targettype, infile, outfile, variables): |
| return writer.build(outfile, 'cm', infile, implicit = self.implicit_deps(config, variables), variables = self.cc_variables(config, arch, targettype, variables)) |
| |
| def builder_lib(self, writer, config, arch, targettype, infiles, outfile, variables): |
| return writer.build(outfile, 'ar', infiles, implicit = self.implicit_deps(config, variables), variables = self.ar_variables(config, arch, targettype, variables)) |
| |
| def builder_sharedlib(self, writer, config, arch, targettype, infiles, outfile, variables): |
| if self.target.is_windows(): |
| return writer.build(outfile, 'dll', infiles, implicit = self.implicit_deps(config, variables), variables = self.link_variables(config, arch, targettype, variables)) |
| return writer.build(outfile, 'so', infiles, implicit = self.implicit_deps(config, variables), variables = self.link_variables(config, arch, targettype, variables)) |
| |
| def builder_bin(self, writer, config, arch, targettype, infiles, outfile, variables): |
| return writer.build(outfile, 'link', infiles, implicit = self.implicit_deps(config, variables), variables = self.link_variables(config, arch, targettype, variables)) |
| |
| #Apple universal targets |
| def builder_apple_multilib(self, writer, config, arch, targettype, infiles, outfile, variables): |
| localvariables = [('arflags', '-static -no_warning_for_no_symbols')] |
| if variables != None: |
| localvariables = variables + localvariables |
| return writer.build(os.path.join(outfile, self.buildtarget), 'ar', infiles, variables = localvariables); |
| |
| def builder_apple_multisharedlib(self, writer, config, arch, targettype, infiles, outfile, variables): |
| return writer.build(os.path.join(outfile, self.buildtarget), 'so', infiles, implicit = self.implicit_deps(config, variables), variables = self.link_variables(config, arch, targettype, variables)) |
| |
| def builder_apple_multibin(self, writer, config, arch, targettype, infiles, outfile, variables): |
| return writer.build(os.path.join(outfile, self.buildtarget), 'lipo', infiles, variables = variables) |
| |
| def create(host, target, toolchain): |
| return ClangToolchain(host, target, toolchain) |