|
|
|
@ -20,7 +20,7 @@ from .. import mlog |
|
|
|
|
import uuid, os, operator |
|
|
|
|
import typing as T |
|
|
|
|
|
|
|
|
|
from ..mesonlib import MesonException |
|
|
|
|
from ..mesonlib import MesonException, OptionKey |
|
|
|
|
from ..interpreter import Interpreter |
|
|
|
|
|
|
|
|
|
INDENT = '\t' |
|
|
|
@ -42,6 +42,19 @@ XCODETYPEMAP = {'c': 'sourcecode.c.c', |
|
|
|
|
's': 'sourcecode.asm', |
|
|
|
|
'asm': 'sourcecode.asm', |
|
|
|
|
} |
|
|
|
|
LANGNAMEMAP = {'c': 'C', |
|
|
|
|
'cpp': 'CPLUSPLUS', |
|
|
|
|
'objc': 'OBJC', |
|
|
|
|
'objcpp': 'OBJCPLUSPLUS', |
|
|
|
|
} |
|
|
|
|
OPT2XCODEOPT = {'0': '0', |
|
|
|
|
'g': '0', |
|
|
|
|
'1': '1', |
|
|
|
|
'2': '2', |
|
|
|
|
'3': '3', |
|
|
|
|
's': 's', |
|
|
|
|
} |
|
|
|
|
BOOL2XCODEBOOL = {True: 'YES', False: 'NO'} |
|
|
|
|
|
|
|
|
|
class PbxItem: |
|
|
|
|
def __init__(self, value, comment = ''): |
|
|
|
@ -146,6 +159,9 @@ class PbxDict: |
|
|
|
|
ofile.write(indent_level*INDENT + f'{i.key} = ') |
|
|
|
|
i.value.write(ofile, indent_level) |
|
|
|
|
else: |
|
|
|
|
print(i) |
|
|
|
|
print(i.key) |
|
|
|
|
print(i.value) |
|
|
|
|
raise RuntimeError('missing code') |
|
|
|
|
else: |
|
|
|
|
print(i) |
|
|
|
@ -163,11 +179,12 @@ class XCodeBackend(backends.Backend): |
|
|
|
|
super().__init__(build, interpreter) |
|
|
|
|
self.name = 'xcode' |
|
|
|
|
self.project_uid = self.environment.coredata.lang_guids['default'].replace('-', '')[:24] |
|
|
|
|
self.buildtype = self.environment.coredata.get_option(OptionKey('buildtype')) |
|
|
|
|
self.project_conflist = self.gen_id() |
|
|
|
|
self.maingroup_id = self.gen_id() |
|
|
|
|
self.all_id = self.gen_id() |
|
|
|
|
self.all_buildconf_id = self.gen_id() |
|
|
|
|
self.buildtypes = ['debug'] |
|
|
|
|
self.buildtypes = [self.buildtype] |
|
|
|
|
self.test_id = self.gen_id() |
|
|
|
|
self.test_command_id = self.gen_id() |
|
|
|
|
self.test_buildconf_id = self.gen_id() |
|
|
|
@ -182,7 +199,7 @@ class XCodeBackend(backends.Backend): |
|
|
|
|
return str(uuid.uuid4()).upper().replace('-', '')[:24] |
|
|
|
|
|
|
|
|
|
def get_target_dir(self, target): |
|
|
|
|
dirname = os.path.join(target.get_subdir(), self.environment.coredata.get_option(mesonlib.OptionKey('buildtype'))) |
|
|
|
|
dirname = os.path.join(target.get_subdir(), self.environment.coredata.get_option(OptionKey('buildtype'))) |
|
|
|
|
os.makedirs(os.path.join(self.environment.get_build_dir(), dirname), exist_ok=True) |
|
|
|
|
return dirname |
|
|
|
|
|
|
|
|
@ -291,7 +308,7 @@ class XCodeBackend(backends.Backend): |
|
|
|
|
self.buildmap[o] = self.gen_id() |
|
|
|
|
|
|
|
|
|
def generate_buildstylemap(self): |
|
|
|
|
self.buildstylemap = {'debug': self.gen_id()} |
|
|
|
|
self.buildstylemap = {self.buildtype: self.gen_id()} |
|
|
|
|
|
|
|
|
|
def generate_build_phase_map(self): |
|
|
|
|
for tname, t in self.build.get_build_targets().items(): |
|
|
|
@ -306,17 +323,17 @@ class XCodeBackend(backends.Backend): |
|
|
|
|
def generate_build_configuration_map(self): |
|
|
|
|
self.buildconfmap = {} |
|
|
|
|
for t in self.build.get_build_targets(): |
|
|
|
|
bconfs = {'debug': self.gen_id()} |
|
|
|
|
bconfs = {self.buildtype: self.gen_id()} |
|
|
|
|
self.buildconfmap[t] = bconfs |
|
|
|
|
|
|
|
|
|
def generate_project_configurations_map(self): |
|
|
|
|
self.project_configurations = {'debug': self.gen_id()} |
|
|
|
|
self.project_configurations = {self.buildtype: self.gen_id()} |
|
|
|
|
|
|
|
|
|
def generate_buildall_configurations_map(self): |
|
|
|
|
self.buildall_configurations = {'debug': self.gen_id()} |
|
|
|
|
self.buildall_configurations = {self.buildtype: self.gen_id()} |
|
|
|
|
|
|
|
|
|
def generate_test_configurations_map(self): |
|
|
|
|
self.test_configurations = {'debug': self.gen_id()} |
|
|
|
|
self.test_configurations = {self.buildtype: self.gen_id()} |
|
|
|
|
|
|
|
|
|
def generate_build_configurationlist_map(self): |
|
|
|
|
self.buildconflistmap = {} |
|
|
|
@ -725,9 +742,7 @@ class XCodeBackend(backends.Backend): |
|
|
|
|
settings_dict = PbxDict() |
|
|
|
|
bt_dict.add_item('buildSettings', settings_dict) |
|
|
|
|
settings_dict.add_item('COMBINE_HIDPI_IMAGES', 'YES') |
|
|
|
|
settings_dict.add_item('GCC_GENERATE_DEBUGGING_SYMBOLS', 'NO') |
|
|
|
|
settings_dict.add_item('GCC_INLINES_ARE_PRIVATE_EXTERN', 'NO') |
|
|
|
|
settings_dict.add_item('GCC_OPTIMIZATION_LEVEL', 0) |
|
|
|
|
settings_dict.add_item('GCC_PREPROCESSOR_DEFINITIONS', '""') |
|
|
|
|
settings_dict.add_item('GCC_SYMBOLS_PRIVATE_EXTERN', 'NO') |
|
|
|
|
settings_dict.add_item('INSTALL_PATH', '""') |
|
|
|
@ -739,10 +754,8 @@ class XCodeBackend(backends.Backend): |
|
|
|
|
settings_dict.add_item('SYMROOT', '"%s"' % self.environment.get_build_dir()) |
|
|
|
|
settings_dict.add_item('USE_HEADERMAP', 'NO') |
|
|
|
|
warn_array = PbxArray() |
|
|
|
|
warn_array.add_item('"$(inherited)"') |
|
|
|
|
settings_dict.add_item('WARNING_CFLAGS', warn_array) |
|
|
|
|
warn_array.add_item('"-Wmost"') |
|
|
|
|
warn_array.add_item('"-Wno-four-char-constants"') |
|
|
|
|
warn_array.add_item('"-Wno-unknown-pragmas"') |
|
|
|
|
|
|
|
|
|
bt_dict.add_item('name', f'"{buildtype}"') |
|
|
|
|
|
|
|
|
@ -754,9 +767,7 @@ class XCodeBackend(backends.Backend): |
|
|
|
|
settings_dict = PbxDict() |
|
|
|
|
bt_dict.add_item('buildSettings', settings_dict) |
|
|
|
|
settings_dict.add_item('COMBINE_HIDPI_IMAGES', 'YES') |
|
|
|
|
settings_dict.add_item('GCC_GENERATE_DEBUGGING_SYMBOLS', 'NO') |
|
|
|
|
settings_dict.add_item('GCC_INLINES_ARE_PRIVATE_EXTERN', 'NO') |
|
|
|
|
settings_dict.add_item('GCC_OPTIMIZATION_LEVEL', 0) |
|
|
|
|
settings_dict.add_item('GCC_PREPROCESSOR_DEFINITIONS', '""') |
|
|
|
|
settings_dict.add_item('GCC_SYMBOLS_PRIVATE_EXTERN', 'NO') |
|
|
|
|
settings_dict.add_item('INSTALL_PATH', '""') |
|
|
|
@ -769,14 +780,15 @@ class XCodeBackend(backends.Backend): |
|
|
|
|
settings_dict.add_item('USE_HEADERMAP', 'NO') |
|
|
|
|
warn_array = PbxArray() |
|
|
|
|
settings_dict.add_item('WARNING_CFLAGS', warn_array) |
|
|
|
|
warn_array.add_item('"-Wmost"') |
|
|
|
|
warn_array.add_item('"-Wno-four-char-constants"') |
|
|
|
|
warn_array.add_item('"-Wno-unknown-pragmas"') |
|
|
|
|
warn_array.add_item('"$(inherited)"') |
|
|
|
|
bt_dict.add_item('name', f'"{buildtype}"') |
|
|
|
|
|
|
|
|
|
# Now finally targets. |
|
|
|
|
langnamemap = {'c': 'C', 'cpp': 'CPLUSPLUS', 'objc': 'OBJC', 'objcpp': 'OBJCPLUSPLUS'} |
|
|
|
|
for target_name, target in self.build.get_build_targets().items(): |
|
|
|
|
self.generate_single_build_target(objects_dict, target_name, target) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def generate_single_build_target(self, objects_dict, target_name, target): |
|
|
|
|
for buildtype in self.buildtypes: |
|
|
|
|
dep_libs = [] |
|
|
|
|
links_dylib = False |
|
|
|
@ -818,18 +830,20 @@ class XCodeBackend(backends.Backend): |
|
|
|
|
valid = self.buildconfmap[target_name][buildtype] |
|
|
|
|
langargs = {} |
|
|
|
|
for lang in self.environment.coredata.compilers[target.for_machine]: |
|
|
|
|
if lang not in langnamemap: |
|
|
|
|
if lang not in LANGNAMEMAP: |
|
|
|
|
continue |
|
|
|
|
compiler = target.compilers.get(lang) |
|
|
|
|
# Start with warning args |
|
|
|
|
warn_args = compiler.get_warn_args(self.get_option_for_target(OptionKey('warning_level'), target)) |
|
|
|
|
# Add compile args added using add_project_arguments() |
|
|
|
|
pargs = self.build.projects_args[target.for_machine].get(target.subproject, {}).get(lang, []) |
|
|
|
|
# Add compile args added using add_global_arguments() |
|
|
|
|
# These override per-project arguments |
|
|
|
|
gargs = self.build.global_args[target.for_machine].get(lang, []) |
|
|
|
|
targs = target.get_extra_args(lang) |
|
|
|
|
args = pargs + gargs + targs |
|
|
|
|
args = warn_args + pargs + gargs + targs |
|
|
|
|
if args: |
|
|
|
|
langname = langnamemap[lang] |
|
|
|
|
compiler = target.compilers.get(lang) |
|
|
|
|
langname = LANGNAMEMAP[lang] |
|
|
|
|
lang_cargs = cargs |
|
|
|
|
if compiler and target.implicit_include_directories: |
|
|
|
|
lang_cargs += self.get_build_dir_include_args(target, compiler) |
|
|
|
@ -850,9 +864,9 @@ class XCodeBackend(backends.Backend): |
|
|
|
|
else: |
|
|
|
|
suffix = '.' + target.suffix |
|
|
|
|
settings_dict.add_item('EXECUTABLE_SUFFIX', f'"{suffix}"') |
|
|
|
|
settings_dict.add_item('GCC_GENERATE_DEBUGGING_SYMBOLS', 'YES') |
|
|
|
|
settings_dict.add_item('GCC_GENERATE_DEBUGGING_SYMBOLS', BOOL2XCODEBOOL[self.get_option_for_target(OptionKey('debug'), target)]) |
|
|
|
|
settings_dict.add_item('GCC_INLINES_ARE_PRIVATE_EXTERN', 'NO') |
|
|
|
|
settings_dict.add_item('GCC_OPTIMIZATION_LEVEL', 0) |
|
|
|
|
settings_dict.add_item('GCC_OPTIMIZATION_LEVEL', OPT2XCODEOPT[self.get_option_for_target(OptionKey('optimization'), target)]) |
|
|
|
|
if target.has_pch: |
|
|
|
|
# Xcode uses GCC_PREFIX_HEADER which only allows one file per target/executable. Precompiling various header files and |
|
|
|
|
# applying a particular pch to each source file will require custom scripts (as a build phase) and build flags per each |
|
|
|
@ -875,8 +889,7 @@ class XCodeBackend(backends.Backend): |
|
|
|
|
settings_dict.add_item('LIBRARY_SEARCH_PATHS', '""') |
|
|
|
|
if isinstance(target, build.SharedLibrary): |
|
|
|
|
settings_dict.add_item('LIBRARY_STYLE', 'DYNAMIC') |
|
|
|
|
for langname, args in langargs.items(): |
|
|
|
|
settings_dict.add_item(f'OTHER_{langname}FLAGS', args) |
|
|
|
|
self.add_otterargs(settings_dict, langargs) |
|
|
|
|
settings_dict.add_item('OTHER_LDFLAGS', f'"{ldstr}"') |
|
|
|
|
settings_dict.add_item('OTHER_REZFLAGS', '""') |
|
|
|
|
settings_dict.add_item('PRODUCT_NAME', product_name) |
|
|
|
@ -886,11 +899,15 @@ class XCodeBackend(backends.Backend): |
|
|
|
|
settings_dict.add_item('USE_HEADERMAP', 'NO') |
|
|
|
|
warn_array = PbxArray() |
|
|
|
|
settings_dict.add_item('WARNING_CFLAGS', warn_array) |
|
|
|
|
warn_array.add_item('"-Wmost"') |
|
|
|
|
warn_array.add_item('"-Wno-four-char-constants"') |
|
|
|
|
warn_array.add_item('"-Wno-unknown-pragmas"') |
|
|
|
|
warn_array.add_item('"$(inherited)"') |
|
|
|
|
bt_dict.add_item('name', buildtype) |
|
|
|
|
|
|
|
|
|
def add_otterargs(self, settings_dict, langargs): |
|
|
|
|
for langname, args in langargs.items(): |
|
|
|
|
if args: |
|
|
|
|
# FIXME, proper quoting |
|
|
|
|
settings_dict.add_item(f'OTHER_{langname}FLAGS', '"' + ' '.join(args) + '"') |
|
|
|
|
|
|
|
|
|
def generate_xc_configurationList(self, objects_dict): |
|
|
|
|
# FIXME: sort items |
|
|
|
|
conf_dict = PbxDict() |
|
|
|
@ -901,7 +918,7 @@ class XCodeBackend(backends.Backend): |
|
|
|
|
for buildtype in self.buildtypes: |
|
|
|
|
confs_arr.add_item(self.project_configurations[buildtype], buildtype) |
|
|
|
|
conf_dict.add_item('defaultConfigurationIsVisible', 0) |
|
|
|
|
conf_dict.add_item('defaultConfigurationName', 'debug') |
|
|
|
|
conf_dict.add_item('defaultConfigurationName', self.buildtype) |
|
|
|
|
|
|
|
|
|
# Now the all target |
|
|
|
|
all_dict = PbxDict() |
|
|
|
@ -912,7 +929,7 @@ class XCodeBackend(backends.Backend): |
|
|
|
|
for buildtype in self.buildtypes: |
|
|
|
|
conf_arr.add_item(self.buildall_configurations[buildtype], buildtype) |
|
|
|
|
all_dict.add_item('defaultConfigurationIsVisible', 0) |
|
|
|
|
all_dict.add_item('defaultConfigurationName', 'debug') |
|
|
|
|
all_dict.add_item('defaultConfigurationName', self.buildtype) |
|
|
|
|
|
|
|
|
|
# Test target |
|
|
|
|
test_dict = PbxDict() |
|
|
|
@ -923,7 +940,7 @@ class XCodeBackend(backends.Backend): |
|
|
|
|
for buildtype in self.buildtypes: |
|
|
|
|
conf_arr.add_item(self.test_configurations[buildtype], buildtype) |
|
|
|
|
test_dict.add_item('defaultConfigurationIsVisible', 0) |
|
|
|
|
test_dict.add_item('defaultConfigurationName', 'debug') |
|
|
|
|
test_dict.add_item('defaultConfigurationName', self.buildtype) |
|
|
|
|
|
|
|
|
|
for target_name in self.build.get_build_targets(): |
|
|
|
|
t_dict = PbxDict() |
|
|
|
@ -932,11 +949,10 @@ class XCodeBackend(backends.Backend): |
|
|
|
|
t_dict.add_item('isa', 'XCConfigurationList') |
|
|
|
|
conf_arr = PbxArray() |
|
|
|
|
t_dict.add_item('buildConfigurations', conf_arr) |
|
|
|
|
typestr = 'debug' |
|
|
|
|
idval = self.buildconfmap[target_name][typestr] |
|
|
|
|
conf_arr.add_item(idval, typestr) |
|
|
|
|
idval = self.buildconfmap[target_name][self.buildtype] |
|
|
|
|
conf_arr.add_item(idval, self.buildtype) |
|
|
|
|
t_dict.add_item('defaultConfigurationIsVisible', 0) |
|
|
|
|
t_dict.add_item('defaultConfigurationName', typestr) |
|
|
|
|
t_dict.add_item('defaultConfigurationName', self.buildtype) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def generate_prefix(self, pbxdict): |
|
|
|
|