Remove redundant quoting boilerplate on .add_item

A follow-up to the PbxDictItem refactoring. This removes extra type
casting and string formatting before inserting values to the PbxDict.
pull/13360/head
Mykola Dolhyi 8 months ago
parent a9bc6cc3b6
commit 25c5d74cbc
  1. 140
      mesonbuild/backend/xcodebackend.py

@ -157,7 +157,7 @@ class PbxDictItem:
if not value: if not value:
return quoted return quoted
if set(' +@').isdisjoint(value) or value[0] == '"': if set(' +@$<>/').isdisjoint(value) or value[0] == '"':
return value return value
return quoted return quoted
@ -626,7 +626,8 @@ class XCodeBackend(backends.Backend):
elif isinstance(t, build.BuildTarget): elif isinstance(t, build.BuildTarget):
target_dependencies.append(self.pbx_dep_map[t.get_id()]) target_dependencies.append(self.pbx_dep_map[t.get_id()])
aggregated_targets = [] aggregated_targets = []
aggregated_targets.append((self.all_id, 'ALL_BUILD', aggregated_targets.append((self.all_id,
'ALL_BUILD',
self.all_buildconf_id, self.all_buildconf_id,
[], [],
[self.regen_dependency_id] + target_dependencies + custom_target_dependencies)) [self.regen_dependency_id] + target_dependencies + custom_target_dependencies))
@ -682,8 +683,8 @@ class XCodeBackend(backends.Backend):
agt_dict.add_item('dependencies', dep_arr) agt_dict.add_item('dependencies', dep_arr)
for td in dependencies: for td in dependencies:
dep_arr.add_item(td, 'PBXTargetDependency') dep_arr.add_item(td, 'PBXTargetDependency')
agt_dict.add_item('name', f'"{name}"') agt_dict.add_item('name', name)
agt_dict.add_item('productName', f'"{name}"') agt_dict.add_item('productName', name)
objects_dict.add_item(t[0], agt_dict, name) objects_dict.add_item(t[0], agt_dict, name)
def generate_pbx_build_file(self, objects_dict: PbxDict) -> None: def generate_pbx_build_file(self, objects_dict: PbxDict) -> None:
@ -784,7 +785,7 @@ class XCodeBackend(backends.Backend):
settings_dict = PbxDict() settings_dict = PbxDict()
styledict.add_item('buildSettings', settings_dict) styledict.add_item('buildSettings', settings_dict)
settings_dict.add_item('COPY_PHASE_STRIP', 'NO') settings_dict.add_item('COPY_PHASE_STRIP', 'NO')
styledict.add_item('name', f'"{name}"') styledict.add_item('name', name)
def to_shell_script(self, args: CompilerArgs) -> str: def to_shell_script(self, args: CompilerArgs) -> str:
quoted_cmd = [] quoted_cmd = []
@ -803,13 +804,13 @@ class XCodeBackend(backends.Backend):
buildrule.add_item('compilerSpec', 'com.apple.compilers.proxy.script') buildrule.add_item('compilerSpec', 'com.apple.compilers.proxy.script')
if compiler.get_id() != 'yasm': if compiler.get_id() != 'yasm':
# Yasm doesn't generate escaped build rules # Yasm doesn't generate escaped build rules
buildrule.add_item('dependencyFile', '"$(DERIVED_FILE_DIR)/$(INPUT_FILE_BASE).d"') buildrule.add_item('dependencyFile', '$(DERIVED_FILE_DIR)/$(INPUT_FILE_BASE).d')
buildrule.add_item('fileType', NEEDS_CUSTOM_RULES[language]) buildrule.add_item('fileType', NEEDS_CUSTOM_RULES[language])
inputfiles = PbxArray() inputfiles = PbxArray()
buildrule.add_item('inputFiles', inputfiles) buildrule.add_item('inputFiles', inputfiles)
buildrule.add_item('isEditable', '0') buildrule.add_item('isEditable', '0')
outputfiles = PbxArray() outputfiles = PbxArray()
outputfiles.add_item('"$(DERIVED_FILE_DIR)/$(INPUT_FILE_BASE).o"') outputfiles.add_item('$(DERIVED_FILE_DIR)/$(INPUT_FILE_BASE).o')
buildrule.add_item('outputFiles', outputfiles) buildrule.add_item('outputFiles', outputfiles)
# Do NOT use this parameter. Xcode will accept it from the UI, # Do NOT use this parameter. Xcode will accept it from the UI,
# but the parser will break down inconsistently upon next # but the parser will break down inconsistently upon next
@ -903,8 +904,8 @@ class XCodeBackend(backends.Backend):
odict.add_item('isa', 'PBXFileReference') odict.add_item('isa', 'PBXFileReference')
odict.add_item('explicitFileType', xcodetype) odict.add_item('explicitFileType', xcodetype)
odict.add_item('fileEncoding', '4') odict.add_item('fileEncoding', '4')
odict.add_item('name', f'"{name}"') odict.add_item('name', name)
odict.add_item('path', f'"{rel_name}"') odict.add_item('path', rel_name)
odict.add_item('sourceTree', 'SOURCE_ROOT') odict.add_item('sourceTree', 'SOURCE_ROOT')
generator_id += 1 generator_id += 1
@ -927,8 +928,8 @@ class XCodeBackend(backends.Backend):
o_dict.add_item('isa', 'PBXFileReference') o_dict.add_item('isa', 'PBXFileReference')
o_dict.add_item('explicitFileType', self.get_xcodetype(o)) o_dict.add_item('explicitFileType', self.get_xcodetype(o))
o_dict.add_item('fileEncoding', '4') o_dict.add_item('fileEncoding', '4')
o_dict.add_item('name', f'"{name}"') o_dict.add_item('name', name)
o_dict.add_item('path', f'"{rel_name}"') o_dict.add_item('path', rel_name)
o_dict.add_item('sourceTree', 'SOURCE_ROOT') o_dict.add_item('sourceTree', 'SOURCE_ROOT')
for e in t.extra_files: for e in t.extra_files:
@ -984,8 +985,8 @@ class XCodeBackend(backends.Backend):
typestr = self.get_xcodetype(s) typestr = self.get_xcodetype(s)
custom_dict.add_item('isa', 'PBXFileReference') custom_dict.add_item('isa', 'PBXFileReference')
custom_dict.add_item('explicitFileType', typestr) custom_dict.add_item('explicitFileType', typestr)
custom_dict.add_item('name', f'"{s}"') custom_dict.add_item('name', s)
custom_dict.add_item('path', f'"{s}"') custom_dict.add_item('path', s)
custom_dict.add_item('refType', 0) custom_dict.add_item('refType', 0)
custom_dict.add_item('sourceTree', 'SOURCE_ROOT') custom_dict.add_item('sourceTree', 'SOURCE_ROOT')
objects_dict.add_item(self.fileref_ids[(tname, s)], custom_dict) objects_dict.add_item(self.fileref_ids[(tname, s)], custom_dict)
@ -995,7 +996,7 @@ class XCodeBackend(backends.Backend):
custom_dict.add_item('isa', 'PBXFileReference') custom_dict.add_item('isa', 'PBXFileReference')
custom_dict.add_item('explicitFileType', typestr) custom_dict.add_item('explicitFileType', typestr)
custom_dict.add_item('name', o) custom_dict.add_item('name', o)
custom_dict.add_item('path', f'"{os.path.join(self.src_to_build, o)}"') custom_dict.add_item('path', os.path.join(self.src_to_build, o))
custom_dict.add_item('refType', 0) custom_dict.add_item('refType', 0)
custom_dict.add_item('sourceTree', 'SOURCE_ROOT') custom_dict.add_item('sourceTree', 'SOURCE_ROOT')
objects_dict.add_item(self.custom_target_output_fileref[o], custom_dict) objects_dict.add_item(self.custom_target_output_fileref[o], custom_dict)
@ -1006,8 +1007,8 @@ class XCodeBackend(backends.Backend):
typestr = self.get_xcodetype(buildfile) typestr = self.get_xcodetype(buildfile)
buildfile_dict.add_item('isa', 'PBXFileReference') buildfile_dict.add_item('isa', 'PBXFileReference')
buildfile_dict.add_item('explicitFileType', typestr) buildfile_dict.add_item('explicitFileType', typestr)
buildfile_dict.add_item('name', f'"{basename}"') buildfile_dict.add_item('name', basename)
buildfile_dict.add_item('path', f'"{buildfile}"') buildfile_dict.add_item('path', buildfile)
buildfile_dict.add_item('refType', 0) buildfile_dict.add_item('refType', 0)
buildfile_dict.add_item('sourceTree', 'SOURCE_ROOT') buildfile_dict.add_item('sourceTree', 'SOURCE_ROOT')
objects_dict.add_item(self.fileref_ids[buildfile], buildfile_dict) objects_dict.add_item(self.fileref_ids[buildfile], buildfile_dict)
@ -1048,7 +1049,7 @@ class XCodeBackend(backends.Backend):
main_children.add_item(resources_id, 'Resources') main_children.add_item(resources_id, 'Resources')
main_children.add_item(products_id, 'Products') main_children.add_item(products_id, 'Products')
main_children.add_item(frameworks_id, 'Frameworks') main_children.add_item(frameworks_id, 'Frameworks')
main_dict.add_item('sourceTree', '"<group>"') main_dict.add_item('sourceTree', '<group>')
self.add_projecttree(objects_dict, projecttree_id) self.add_projecttree(objects_dict, projecttree_id)
@ -1058,7 +1059,7 @@ class XCodeBackend(backends.Backend):
resource_children = PbxArray() resource_children = PbxArray()
resource_dict.add_item('children', resource_children) resource_dict.add_item('children', resource_children)
resource_dict.add_item('name', 'Resources') resource_dict.add_item('name', 'Resources')
resource_dict.add_item('sourceTree', '"<group>"') resource_dict.add_item('sourceTree', '<group>')
frameworks_dict = PbxDict() frameworks_dict = PbxDict()
objects_dict.add_item(frameworks_id, frameworks_dict, 'Frameworks') objects_dict.add_item(frameworks_id, frameworks_dict, 'Frameworks')
@ -1074,7 +1075,7 @@ class XCodeBackend(backends.Backend):
frameworks_children.add_item(self.native_frameworks_fileref[f], f) frameworks_children.add_item(self.native_frameworks_fileref[f], f)
frameworks_dict.add_item('name', 'Frameworks') frameworks_dict.add_item('name', 'Frameworks')
frameworks_dict.add_item('sourceTree', '"<group>"') frameworks_dict.add_item('sourceTree', '<group>')
for tname, t in self.custom_targets.items(): for tname, t in self.custom_targets.items():
target_dict = PbxDict() target_dict = PbxDict()
@ -1084,10 +1085,10 @@ class XCodeBackend(backends.Backend):
target_dict.add_item('children', target_children) target_dict.add_item('children', target_children)
target_children.add_item(target_src_map[tname], 'Source files') target_children.add_item(target_src_map[tname], 'Source files')
if t.subproject: if t.subproject:
target_dict.add_item('name', f'"{t.subproject}{t.name}"') target_dict.add_item('name', f'{t.subproject}{t.name}')
else: else:
target_dict.add_item('name', f'"{t.name}"') target_dict.add_item('name', t.name)
target_dict.add_item('sourceTree', '"<group>"') target_dict.add_item('sourceTree', '<group>')
source_files_dict = PbxDict() source_files_dict = PbxDict()
objects_dict.add_item(target_src_map[tname], source_files_dict, 'Source files') objects_dict.add_item(target_src_map[tname], source_files_dict, 'Source files')
source_files_dict.add_item('isa', 'PBXGroup') source_files_dict.add_item('isa', 'PBXGroup')
@ -1101,8 +1102,8 @@ class XCodeBackend(backends.Backend):
else: else:
continue continue
source_file_children.add_item(self.fileref_ids[(tname, s)], s) source_file_children.add_item(self.fileref_ids[(tname, s)], s)
source_files_dict.add_item('name', '"Source files"') source_files_dict.add_item('name', 'Source files')
source_files_dict.add_item('sourceTree', '"<group>"') source_files_dict.add_item('sourceTree', '<group>')
# And finally products # And finally products
product_dict = PbxDict() product_dict = PbxDict()
@ -1113,7 +1114,7 @@ class XCodeBackend(backends.Backend):
for t in self.build_targets: for t in self.build_targets:
product_children.add_item(self.target_filemap[t], t) product_children.add_item(self.target_filemap[t], t)
product_dict.add_item('name', 'Products') product_dict.add_item('name', 'Products')
product_dict.add_item('sourceTree', '"<group>"') product_dict.add_item('sourceTree', '<group>')
def write_group_target_entry(self, objects_dict, t): def write_group_target_entry(self, objects_dict, t):
tid = t.get_id() tid = t.get_id()
@ -1123,8 +1124,8 @@ class XCodeBackend(backends.Backend):
target_dict.add_item('isa', 'PBXGroup') target_dict.add_item('isa', 'PBXGroup')
target_children = PbxArray() target_children = PbxArray()
target_dict.add_item('children', target_children) target_dict.add_item('children', target_children)
target_dict.add_item('name', f'"{t} · target"') target_dict.add_item('name', f'{t} · target')
target_dict.add_item('sourceTree', '"<group>"') target_dict.add_item('sourceTree', '<group>')
source_files_dict = PbxDict() source_files_dict = PbxDict()
for s in t.sources: for s in t.sources:
if isinstance(s, mesonlib.File): if isinstance(s, mesonlib.File):
@ -1151,8 +1152,8 @@ class XCodeBackend(backends.Backend):
else: else:
continue continue
target_children.add_item(self.fileref_ids[(tid, e)], e) target_children.add_item(self.fileref_ids[(tid, e)], e)
source_files_dict.add_item('name', '"Source files"') source_files_dict.add_item('name', 'Source files')
source_files_dict.add_item('sourceTree', '"<group>"') source_files_dict.add_item('sourceTree', '<group>')
return group_id return group_id
def add_projecttree(self, objects_dict, projecttree_id) -> None: def add_projecttree(self, objects_dict, projecttree_id) -> None:
@ -1161,8 +1162,8 @@ class XCodeBackend(backends.Backend):
root_dict.add_item('isa', 'PBXGroup') root_dict.add_item('isa', 'PBXGroup')
target_children = PbxArray() target_children = PbxArray()
root_dict.add_item('children', target_children) root_dict.add_item('children', target_children)
root_dict.add_item('name', '"Project root"') root_dict.add_item('name', 'Project root')
root_dict.add_item('sourceTree', '"<group>"') root_dict.add_item('sourceTree', '<group>')
project_tree = self.generate_project_tree() project_tree = self.generate_project_tree()
self.write_tree(objects_dict, project_tree, target_children, '') self.write_tree(objects_dict, project_tree, target_children, '')
@ -1176,8 +1177,8 @@ class XCodeBackend(backends.Backend):
children_array.add_item(subdir_id) children_array.add_item(subdir_id)
subdir_dict.add_item('isa', 'PBXGroup') subdir_dict.add_item('isa', 'PBXGroup')
subdir_dict.add_item('children', subdir_children) subdir_dict.add_item('children', subdir_children)
subdir_dict.add_item('name', f'"{subdir_name}"') subdir_dict.add_item('name', subdir_name)
subdir_dict.add_item('sourceTree', '"<group>"') subdir_dict.add_item('sourceTree', '<group>')
self.write_tree(objects_dict, subdir_node, subdir_children, os.path.join(current_subdir, subdir_name)) self.write_tree(objects_dict, subdir_node, subdir_children, os.path.join(current_subdir, subdir_name))
for target in tree_node.targets: for target in tree_node.targets:
group_id = self.write_group_target_entry(objects_dict, target) group_id = self.write_group_target_entry(objects_dict, target)
@ -1259,8 +1260,8 @@ class XCodeBackend(backends.Backend):
generator_id += 1 generator_id += 1
ntarget_dict.add_item('name', f'"{tname}"') ntarget_dict.add_item('name', tname)
ntarget_dict.add_item('productName', f'"{tname}"') ntarget_dict.add_item('productName', tname)
ntarget_dict.add_item('productReference', self.target_filemap[tname], tname) ntarget_dict.add_item('productReference', self.target_filemap[tname], tname)
if isinstance(t, build.Executable): if isinstance(t, build.Executable):
typestr = 'com.apple.product-type.tool' typestr = 'com.apple.product-type.tool'
@ -1286,7 +1287,7 @@ class XCodeBackend(backends.Backend):
project_dict.add_item('buildStyles', style_arr) project_dict.add_item('buildStyles', style_arr)
for name, idval in self.buildstylemap.items(): for name, idval in self.buildstylemap.items():
style_arr.add_item(idval, name) style_arr.add_item(idval, name)
project_dict.add_item('compatibilityVersion', f'"{self.xcodeversion}"') project_dict.add_item('compatibilityVersion', self.xcodeversion)
project_dict.add_item('hasScannedForEncodings', 0) project_dict.add_item('hasScannedForEncodings', 0)
project_dict.add_item('mainGroup', self.maingroup_id) project_dict.add_item('mainGroup', self.maingroup_id)
project_dict.add_item('projectDirPath', self.environment.get_source_dir()) project_dict.add_item('projectDirPath', self.environment.get_source_dir())
@ -1319,7 +1320,7 @@ class XCodeBackend(backends.Backend):
shell_dict.add_item('shellPath', '/bin/sh') shell_dict.add_item('shellPath', '/bin/sh')
cmd = mesonlib.get_meson_command() + ['test', '--no-rebuild', '-C', self.environment.get_build_dir()] cmd = mesonlib.get_meson_command() + ['test', '--no-rebuild', '-C', self.environment.get_build_dir()]
cmdstr = ' '.join(["'%s'" % i for i in cmd]) cmdstr = ' '.join(["'%s'" % i for i in cmd])
shell_dict.add_item('shellScript', f'"{cmdstr}"') shell_dict.add_item('shellScript', cmdstr)
shell_dict.add_item('showEnvVarsInLog', 0) shell_dict.add_item('showEnvVarsInLog', 0)
def generate_regen_shell_build_phase(self, objects_dict: PbxDict) -> None: def generate_regen_shell_build_phase(self, objects_dict: PbxDict) -> None:
@ -1334,7 +1335,7 @@ class XCodeBackend(backends.Backend):
shell_dict.add_item('shellPath', '/bin/sh') shell_dict.add_item('shellPath', '/bin/sh')
cmd = mesonlib.get_meson_command() + ['--internal', 'regencheck', os.path.join(self.environment.get_build_dir(), 'meson-private')] cmd = mesonlib.get_meson_command() + ['--internal', 'regencheck', os.path.join(self.environment.get_build_dir(), 'meson-private')]
cmdstr = ' '.join(["'%s'" % i for i in cmd]) cmdstr = ' '.join(["'%s'" % i for i in cmd])
shell_dict.add_item('shellScript', f'"{cmdstr}"') shell_dict.add_item('shellScript', cmdstr)
shell_dict.add_item('showEnvVarsInLog', 0) shell_dict.add_item('showEnvVarsInLog', 0)
def generate_custom_target_shell_build_phases(self, objects_dict: PbxDict) -> None: def generate_custom_target_shell_build_phases(self, objects_dict: PbxDict) -> None:
@ -1358,7 +1359,7 @@ class XCodeBackend(backends.Backend):
custom_dict.add_item('name', '"Generate {}."'.format(ofilenames[0])) custom_dict.add_item('name', '"Generate {}."'.format(ofilenames[0]))
custom_dict.add_item('outputPaths', outarray) custom_dict.add_item('outputPaths', outarray)
for o in ofilenames: for o in ofilenames:
outarray.add_item(f'"{os.path.join(self.environment.get_build_dir(), o)}"') outarray.add_item(os.path.join(self.environment.get_build_dir(), o))
custom_dict.add_item('runOnlyForDeploymentPostprocessing', 0) custom_dict.add_item('runOnlyForDeploymentPostprocessing', 0)
custom_dict.add_item('shellPath', '/bin/sh') custom_dict.add_item('shellPath', '/bin/sh')
workdir = self.environment.get_build_dir() workdir = self.environment.get_build_dir()
@ -1366,7 +1367,7 @@ class XCodeBackend(backends.Backend):
for c in fixed_cmd: for c in fixed_cmd:
quoted_cmd.append(c.replace('"', chr(92) + '"')) quoted_cmd.append(c.replace('"', chr(92) + '"'))
cmdstr = ' '.join([f"\\'{x}\\'" for x in quoted_cmd]) cmdstr = ' '.join([f"\\'{x}\\'" for x in quoted_cmd])
custom_dict.add_item('shellScript', f'"cd \'{workdir}\'; {cmdstr}"') custom_dict.add_item('shellScript', f'cd \'{workdir}\'; {cmdstr}')
custom_dict.add_item('showEnvVarsInLog', 0) custom_dict.add_item('showEnvVarsInLog', 0)
def generate_generator_target_shell_build_phases(self, objects_dict: PbxDict) -> None: def generate_generator_target_shell_build_phases(self, objects_dict: PbxDict) -> None:
@ -1392,21 +1393,21 @@ class XCodeBackend(backends.Backend):
workdir = self.environment.get_build_dir() workdir = self.environment.get_build_dir()
target_private_dir = self.relpath(self.get_target_private_dir(t), self.get_target_dir(t)) target_private_dir = self.relpath(self.get_target_private_dir(t), self.get_target_dir(t))
gen_dict = PbxDict() gen_dict = PbxDict()
objects_dict.add_item(self.shell_targets[(tname, generator_id)], gen_dict, f'"Generator {generator_id}/{tname}"') objects_dict.add_item(self.shell_targets[(tname, generator_id)], gen_dict, f'Generator {generator_id}/{tname}')
infilelist = genlist.get_inputs() infilelist = genlist.get_inputs()
outfilelist = genlist.get_outputs() outfilelist = genlist.get_outputs()
gen_dict.add_item('isa', 'PBXShellScriptBuildPhase') gen_dict.add_item('isa', 'PBXShellScriptBuildPhase')
gen_dict.add_item('buildActionMask', 2147483647) gen_dict.add_item('buildActionMask', 2147483647)
gen_dict.add_item('files', PbxArray()) gen_dict.add_item('files', PbxArray())
gen_dict.add_item('inputPaths', PbxArray()) gen_dict.add_item('inputPaths', PbxArray())
gen_dict.add_item('name', f'"Generator {generator_id}/{tname}"') gen_dict.add_item('name', f'Generator {generator_id}/{tname}')
commands = [["cd", workdir]] # Array of arrays, each one a single command, will get concatenated below. commands = [["cd", workdir]] # Array of arrays, each one a single command, will get concatenated below.
k = (tname, generator_id) k = (tname, generator_id)
ofile_abs = self.generator_outputs[k] ofile_abs = self.generator_outputs[k]
outarray = PbxArray() outarray = PbxArray()
gen_dict.add_item('outputPaths', outarray) gen_dict.add_item('outputPaths', outarray)
for of in ofile_abs: for of in ofile_abs:
outarray.add_item(f'"{of}"') outarray.add_item(of)
for i in infilelist: for i in infilelist:
# This might be needed to be added to inputPaths. It's not done yet as it is # This might be needed to be added to inputPaths. It's not done yet as it is
# unclear whether it is necessary, what actually happens when it is defined # unclear whether it is necessary, what actually happens when it is defined
@ -1511,14 +1512,14 @@ class XCodeBackend(backends.Backend):
bt_dict.add_item('isa', 'XCBuildConfiguration') bt_dict.add_item('isa', 'XCBuildConfiguration')
settings_dict = PbxDict() settings_dict = PbxDict()
bt_dict.add_item('buildSettings', settings_dict) bt_dict.add_item('buildSettings', settings_dict)
settings_dict.add_item('ARCHS', f'"{self.arch}"') settings_dict.add_item('ARCHS', self.arch)
settings_dict.add_item('BUILD_DIR', f'"{self.environment.get_build_dir()}"') settings_dict.add_item('BUILD_DIR', self.environment.get_build_dir())
settings_dict.add_item('BUILD_ROOT', '"$(BUILD_DIR)"') settings_dict.add_item('BUILD_ROOT', '$(BUILD_DIR)')
settings_dict.add_item('ONLY_ACTIVE_ARCH', 'YES') settings_dict.add_item('ONLY_ACTIVE_ARCH', 'YES')
settings_dict.add_item('SWIFT_VERSION', '5.0') settings_dict.add_item('SWIFT_VERSION', '5.0')
settings_dict.add_item('SDKROOT', '"macosx"') settings_dict.add_item('SDKROOT', 'macosx')
settings_dict.add_item('OBJROOT', '"$(BUILD_DIR)/build"') settings_dict.add_item('OBJROOT', '$(BUILD_DIR)/build')
bt_dict.add_item('name', f'"{buildtype}"') bt_dict.add_item('name', buildtype)
# Then the all target. # Then the all target.
for buildtype in self.buildtypes: for buildtype in self.buildtypes:
@ -1531,7 +1532,7 @@ class XCodeBackend(backends.Backend):
warn_array.add_item('"$(inherited)"') warn_array.add_item('"$(inherited)"')
settings_dict.add_item('WARNING_CFLAGS', warn_array) settings_dict.add_item('WARNING_CFLAGS', warn_array)
bt_dict.add_item('name', f'"{buildtype}"') bt_dict.add_item('name', buildtype)
# Then the test target. # Then the test target.
for buildtype in self.buildtypes: for buildtype in self.buildtypes:
@ -1543,7 +1544,7 @@ class XCodeBackend(backends.Backend):
warn_array = PbxArray() warn_array = PbxArray()
settings_dict.add_item('WARNING_CFLAGS', warn_array) settings_dict.add_item('WARNING_CFLAGS', warn_array)
warn_array.add_item('"$(inherited)"') warn_array.add_item('"$(inherited)"')
bt_dict.add_item('name', f'"{buildtype}"') bt_dict.add_item('name', buildtype)
# Now finally targets. # Now finally targets.
for target_name, target in self.build_targets.items(): for target_name, target in self.build_targets.items():
@ -1555,10 +1556,10 @@ class XCodeBackend(backends.Backend):
bt_dict.add_item('isa', 'XCBuildConfiguration') bt_dict.add_item('isa', 'XCBuildConfiguration')
settings_dict = PbxDict() settings_dict = PbxDict()
bt_dict.add_item('buildSettings', settings_dict) bt_dict.add_item('buildSettings', settings_dict)
settings_dict.add_item('ARCHS', f'"{self.arch}"') settings_dict.add_item('ARCHS', self.arch)
settings_dict.add_item('ONLY_ACTIVE_ARCH', 'YES') settings_dict.add_item('ONLY_ACTIVE_ARCH', 'YES')
settings_dict.add_item('SDKROOT', '"macosx"') settings_dict.add_item('SDKROOT', 'macosx')
bt_dict.add_item('name', f'"{buildtype}"') bt_dict.add_item('name', buildtype)
def determine_internal_dep_link_args(self, target, buildtype): def determine_internal_dep_link_args(self, target, buildtype):
links_dylib = False links_dylib = False
@ -1725,11 +1726,11 @@ class XCodeBackend(backends.Backend):
bt_dict.add_item('buildSettings', settings_dict) bt_dict.add_item('buildSettings', settings_dict)
settings_dict.add_item('COMBINE_HIDPI_IMAGES', 'YES') settings_dict.add_item('COMBINE_HIDPI_IMAGES', 'YES')
if isinstance(target, build.SharedModule): if isinstance(target, build.SharedModule):
settings_dict.add_item('DYLIB_CURRENT_VERSION', '""') settings_dict.add_item('DYLIB_CURRENT_VERSION', '')
settings_dict.add_item('DYLIB_COMPATIBILITY_VERSION', '""') settings_dict.add_item('DYLIB_COMPATIBILITY_VERSION', '')
else: else:
if dylib_version is not None: if dylib_version is not None:
settings_dict.add_item('DYLIB_CURRENT_VERSION', f'"{dylib_version}"') settings_dict.add_item('DYLIB_CURRENT_VERSION', str(dylib_version))
if target.prefix: if target.prefix:
settings_dict.add_item('EXECUTABLE_PREFIX', target.prefix) settings_dict.add_item('EXECUTABLE_PREFIX', target.prefix)
if target.suffix: if target.suffix:
@ -1752,8 +1753,8 @@ class XCodeBackend(backends.Backend):
mlog.warning(f'Unsupported Xcode configuration: More than 1 precompiled header found "{pchs!s}". Target "{target.name}" might not compile correctly.') mlog.warning(f'Unsupported Xcode configuration: More than 1 precompiled header found "{pchs!s}". Target "{target.name}" might not compile correctly.')
relative_pch_path = os.path.join(target.get_subdir(), pchs[0]) # Path relative to target so it can be used with "$(PROJECT_DIR)" relative_pch_path = os.path.join(target.get_subdir(), pchs[0]) # Path relative to target so it can be used with "$(PROJECT_DIR)"
settings_dict.add_item('GCC_PRECOMPILE_PREFIX_HEADER', 'YES') settings_dict.add_item('GCC_PRECOMPILE_PREFIX_HEADER', 'YES')
settings_dict.add_item('GCC_PREFIX_HEADER', f'"$(PROJECT_DIR)/{relative_pch_path}"') settings_dict.add_item('GCC_PREFIX_HEADER', f'$(PROJECT_DIR)/{relative_pch_path}')
settings_dict.add_item('GCC_PREPROCESSOR_DEFINITIONS', '""') settings_dict.add_item('GCC_PREPROCESSOR_DEFINITIONS', '')
settings_dict.add_item('GCC_SYMBOLS_PRIVATE_EXTERN', 'NO') settings_dict.add_item('GCC_SYMBOLS_PRIVATE_EXTERN', 'NO')
header_arr = PbxArray() header_arr = PbxArray()
unquoted_headers = [] unquoted_headers = []
@ -1766,27 +1767,24 @@ class XCodeBackend(backends.Backend):
i = os.path.normpath(i) i = os.path.normpath(i)
unquoted_headers.append(i) unquoted_headers.append(i)
for i in unquoted_headers: for i in unquoted_headers:
header_arr.add_item(f'"\\"{i}\\""') header_arr.add_item(f'"{i}"')
settings_dict.add_item('HEADER_SEARCH_PATHS', header_arr) settings_dict.add_item('HEADER_SEARCH_PATHS', header_arr)
settings_dict.add_item('INSTALL_PATH', f'"{install_path}"') settings_dict.add_item('INSTALL_PATH', install_path)
settings_dict.add_item('LIBRARY_SEARCH_PATHS', '""') settings_dict.add_item('LIBRARY_SEARCH_PATHS', '')
if isinstance(target, build.SharedModule): if isinstance(target, build.SharedModule):
settings_dict.add_item('LIBRARY_STYLE', 'BUNDLE') settings_dict.add_item('LIBRARY_STYLE', 'BUNDLE')
settings_dict.add_item('MACH_O_TYPE', 'mh_bundle') settings_dict.add_item('MACH_O_TYPE', 'mh_bundle')
elif isinstance(target, build.SharedLibrary): elif isinstance(target, build.SharedLibrary):
settings_dict.add_item('LIBRARY_STYLE', 'DYNAMIC') settings_dict.add_item('LIBRARY_STYLE', 'DYNAMIC')
self.add_otherargs(settings_dict, langargs) self.add_otherargs(settings_dict, langargs)
settings_dict.add_item('OTHER_LDFLAGS', f'"{ldstr}"') settings_dict.add_item('OTHER_LDFLAGS', ldstr)
settings_dict.add_item('OTHER_REZFLAGS', '""') settings_dict.add_item('OTHER_REZFLAGS', '')
if ' ' in product_name:
settings_dict.add_item('PRODUCT_NAME', f'"{product_name}"')
else:
settings_dict.add_item('PRODUCT_NAME', product_name) settings_dict.add_item('PRODUCT_NAME', product_name)
settings_dict.add_item('SECTORDER_FLAGS', '""') settings_dict.add_item('SECTORDER_FLAGS', '')
if is_swift and bridging_header: if is_swift and bridging_header:
settings_dict.add_item('SWIFT_OBJC_BRIDGING_HEADER', f'"{bridging_header}"') settings_dict.add_item('SWIFT_OBJC_BRIDGING_HEADER', bridging_header)
settings_dict.add_item('BUILD_DIR', f'"{symroot}"') settings_dict.add_item('BUILD_DIR', symroot)
settings_dict.add_item('OBJROOT', f'"{symroot}/build"') settings_dict.add_item('OBJROOT', f'{symroot}/build')
sysheader_arr = PbxArray() sysheader_arr = PbxArray()
# XCode will change every -I flag that points inside these directories # XCode will change every -I flag that points inside these directories
# to an -isystem. Thus set nothing in it since we control our own # to an -isystem. Thus set nothing in it since we control our own

Loading…
Cancel
Save