diff options
Diffstat (limited to 'mesonbuild/compilers/compilers.py')
-rw-r--r-- | mesonbuild/compilers/compilers.py | 106 |
1 files changed, 51 insertions, 55 deletions
diff --git a/mesonbuild/compilers/compilers.py b/mesonbuild/compilers/compilers.py index 40bb9e6..234ce06 100644 --- a/mesonbuild/compilers/compilers.py +++ b/mesonbuild/compilers/compilers.py @@ -265,36 +265,32 @@ cuda_debug_args = {False: [], clike_debug_args = {False: [], True: ['-g']} # type: T.Dict[bool, T.List[str]] -base_options = {'b_pch': coredata.UserBooleanOption('Use precompiled headers', True), - 'b_lto': coredata.UserBooleanOption('Use link time optimization', False), - 'b_sanitize': coredata.UserComboOption('Code sanitizer to use', - ['none', 'address', 'thread', 'undefined', 'memory', 'address,undefined'], - 'none'), - 'b_lundef': coredata.UserBooleanOption('Use -Wl,--no-undefined when linking', True), - 'b_asneeded': coredata.UserBooleanOption('Use -Wl,--as-needed when linking', True), - 'b_pgo': coredata.UserComboOption('Use profile guided optimization', - ['off', 'generate', 'use'], - 'off'), - 'b_coverage': coredata.UserBooleanOption('Enable coverage tracking.', - False), - 'b_colorout': coredata.UserComboOption('Use colored output', - ['auto', 'always', 'never'], - 'always'), - 'b_ndebug': coredata.UserComboOption('Disable asserts', - ['true', 'false', 'if-release'], 'false'), - 'b_staticpic': coredata.UserBooleanOption('Build static libraries as position independent', - True), - 'b_pie': coredata.UserBooleanOption('Build executables as position independent', - False), - 'b_bitcode': coredata.UserBooleanOption('Generate and embed bitcode (only macOS/iOS/tvOS)', - False), - 'b_vscrt': coredata.UserComboOption('VS run-time library type to use.', - ['none', 'md', 'mdd', 'mt', 'mtd', 'from_buildtype', 'static_from_buildtype'], - 'from_buildtype'), - } # type: OptionDictType - -def option_enabled(boptions: T.List[str], options: 'OptionDictType', - option: str) -> bool: +base_options: 'KeyedOptionDictType' = { + OptionKey('b_pch'): coredata.UserBooleanOption('Use precompiled headers', True), + OptionKey('b_lto'): coredata.UserBooleanOption('Use link time optimization', False), + OptionKey('b_sanitize'): coredata.UserComboOption('Code sanitizer to use', + ['none', 'address', 'thread', 'undefined', 'memory', 'address,undefined'], + 'none'), + OptionKey('b_lundef'): coredata.UserBooleanOption('Use -Wl,--no-undefined when linking', True), + OptionKey('b_asneeded'): coredata.UserBooleanOption('Use -Wl,--as-needed when linking', True), + OptionKey('b_pgo'): coredata.UserComboOption('Use profile guided optimization', + ['off', 'generate', 'use'], + 'off'), + OptionKey('b_coverage'): coredata.UserBooleanOption('Enable coverage tracking.', False), + OptionKey('b_colorout'): coredata.UserComboOption('Use colored output', + ['auto', 'always', 'never'], + 'always'), + OptionKey('b_ndebug'): coredata.UserComboOption('Disable asserts', ['true', 'false', 'if-release'], 'false'), + OptionKey('b_staticpic'): coredata.UserBooleanOption('Build static libraries as position independent', True), + OptionKey('b_pie'): coredata.UserBooleanOption('Build executables as position independent', False), + OptionKey('b_bitcode'): coredata.UserBooleanOption('Generate and embed bitcode (only macOS/iOS/tvOS)', False), + OptionKey('b_vscrt'): coredata.UserComboOption('VS run-time library type to use.', + ['none', 'md', 'mdd', 'mt', 'mtd', 'from_buildtype', 'static_from_buildtype'], + 'from_buildtype'), +} + +def option_enabled(boptions: T.Set[OptionKey], options: 'KeyedOptionDictType', + option: OptionKey) -> bool: try: if option not in boptions: return False @@ -304,23 +300,23 @@ def option_enabled(boptions: T.List[str], options: 'OptionDictType', except KeyError: return False -def get_base_compile_args(options: 'OptionDictType', compiler: 'Compiler') -> T.List[str]: +def get_base_compile_args(options: 'KeyedOptionDictType', compiler: 'Compiler') -> T.List[str]: args = [] # type T.List[str] try: - if options['b_lto'].value: + if options[OptionKey('b_lto')].value: args.extend(compiler.get_lto_compile_args()) except KeyError: pass try: - args += compiler.get_colorout_args(options['b_colorout'].value) + args += compiler.get_colorout_args(options[OptionKey('b_colorout')].value) except KeyError: pass try: - args += compiler.sanitizer_compile_args(options['b_sanitize'].value) + args += compiler.sanitizer_compile_args(options[OptionKey('b_sanitize')].value) except KeyError: pass try: - pgo_val = options['b_pgo'].value + pgo_val = options[OptionKey('b_pgo')].value if pgo_val == 'generate': args.extend(compiler.get_profile_generate_args()) elif pgo_val == 'use': @@ -328,23 +324,23 @@ def get_base_compile_args(options: 'OptionDictType', compiler: 'Compiler') -> T. except KeyError: pass try: - if options['b_coverage'].value: + if options[OptionKey('b_coverage')].value: args += compiler.get_coverage_args() except KeyError: pass try: - if (options['b_ndebug'].value == 'true' or - (options['b_ndebug'].value == 'if-release' and - options['buildtype'].value in {'release', 'plain'})): + if (options[OptionKey('b_ndebug')].value == 'true' or + (options[OptionKey('b_ndebug')].value == 'if-release' and + options[OptionKey('buildtype')].value in {'release', 'plain'})): args += compiler.get_disable_assert_args() except KeyError: pass # This does not need a try...except - if option_enabled(compiler.base_options, options, 'b_bitcode'): + if option_enabled(compiler.base_options, options, OptionKey('b_bitcode')): args.append('-fembed-bitcode') try: - crt_val = options['b_vscrt'].value - buildtype = options['buildtype'].value + crt_val = options[OptionKey('b_vscrt')].value + buildtype = options[OptionKey('buildtype')].value try: args += compiler.get_crt_compile_args(crt_val, buildtype) except AttributeError: @@ -353,20 +349,20 @@ def get_base_compile_args(options: 'OptionDictType', compiler: 'Compiler') -> T. pass return args -def get_base_link_args(options: 'OptionDictType', linker: 'Compiler', +def get_base_link_args(options: 'KeyedOptionDictType', linker: 'Compiler', is_shared_module: bool) -> T.List[str]: args = [] # type: T.List[str] try: - if options['b_lto'].value: + if options[OptionKey('b_lto')].value: args.extend(linker.get_lto_link_args()) except KeyError: pass try: - args += linker.sanitizer_link_args(options['b_sanitize'].value) + args += linker.sanitizer_link_args(options[OptionKey('b_sanitize')].value) except KeyError: pass try: - pgo_val = options['b_pgo'].value + pgo_val = options[OptionKey('b_pgo')].value if pgo_val == 'generate': args.extend(linker.get_profile_generate_args()) elif pgo_val == 'use': @@ -374,13 +370,13 @@ def get_base_link_args(options: 'OptionDictType', linker: 'Compiler', except KeyError: pass try: - if options['b_coverage'].value: + if options[OptionKey('b_coverage')].value: args += linker.get_coverage_link_args() except KeyError: pass - as_needed = option_enabled(linker.base_options, options, 'b_asneeded') - bitcode = option_enabled(linker.base_options, options, 'b_bitcode') + as_needed = option_enabled(linker.base_options, options, OptionKey('b_asneeded')) + bitcode = option_enabled(linker.base_options, options, OptionKey('b_bitcode')) # Shared modules cannot be built with bitcode_bundle because # -bitcode_bundle is incompatible with -undefined and -bundle if bitcode and not is_shared_module: @@ -394,14 +390,14 @@ def get_base_link_args(options: 'OptionDictType', linker: 'Compiler', if not bitcode: args.extend(linker.headerpad_args()) if (not is_shared_module and - option_enabled(linker.base_options, options, 'b_lundef')): + option_enabled(linker.base_options, options, OptionKey('b_lundef'))): args.extend(linker.no_undefined_link_args()) else: args.extend(linker.get_allow_undefined_link_args()) try: - crt_val = options['b_vscrt'].value - buildtype = options['buildtype'].value + crt_val = options[OptionKey('b_vscrt')].value + buildtype = options[OptionKey('buildtype')].value try: args += linker.get_crt_link_args(crt_val, buildtype) except AttributeError: @@ -477,7 +473,7 @@ class Compiler(metaclass=abc.ABCMeta): self.version = version self.full_version = full_version self.for_machine = for_machine - self.base_options = [] # type: T.List[str] + self.base_options: T.Set[OptionKey] = set() self.linker = linker self.info = info self.is_cross = is_cross @@ -1248,14 +1244,14 @@ def get_global_options(lang: str, description = 'Extra arguments passed to the {}'.format(lang) argkey = OptionKey('args', lang=lang, machine=for_machine) largkey = argkey.evolve('link_args') - opts = { + opts: 'KeyedOptionDictType' = { argkey: coredata.UserArrayOption( description + ' compiler', [], split_args=True, user_input=True, allow_dups=True), largkey: coredata.UserArrayOption( description + ' linker', [], split_args=True, user_input=True, allow_dups=True), - } # type: OptionDictType + } # Get from env vars. compile_args, link_args = get_args_from_envvars( |