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 5 months ago
parent a9bc6cc3b6
commit 25c5d74cbc
  1. 142
      mesonbuild/backend/xcodebackend.py

@ -157,7 +157,7 @@ class PbxDictItem:
if not value:
return quoted
if set(' +@').isdisjoint(value) or value[0] == '"':
if set(' +@$<>/').isdisjoint(value) or value[0] == '"':
return value
return quoted
@ -626,7 +626,8 @@ class XCodeBackend(backends.Backend):
elif isinstance(t, build.BuildTarget):
target_dependencies.append(self.pbx_dep_map[t.get_id()])
aggregated_targets = []
aggregated_targets.append((self.all_id, 'ALL_BUILD',
aggregated_targets.append((self.all_id,
'ALL_BUILD',
self.all_buildconf_id,
[],
[self.regen_dependency_id] + target_dependencies + custom_target_dependencies))
@ -682,8 +683,8 @@ class XCodeBackend(backends.Backend):
agt_dict.add_item('dependencies', dep_arr)
for td in dependencies:
dep_arr.add_item(td, 'PBXTargetDependency')
agt_dict.add_item('name', f'"{name}"')
agt_dict.add_item('productName', f'"{name}"')
agt_dict.add_item('name', name)
agt_dict.add_item('productName', name)
objects_dict.add_item(t[0], agt_dict, name)
def generate_pbx_build_file(self, objects_dict: PbxDict) -> None:
@ -784,7 +785,7 @@ class XCodeBackend(backends.Backend):
settings_dict = PbxDict()
styledict.add_item('buildSettings', settings_dict)
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:
quoted_cmd = []
@ -803,13 +804,13 @@ class XCodeBackend(backends.Backend):
buildrule.add_item('compilerSpec', 'com.apple.compilers.proxy.script')
if compiler.get_id() != 'yasm':
# 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])
inputfiles = PbxArray()
buildrule.add_item('inputFiles', inputfiles)
buildrule.add_item('isEditable', '0')
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)
# Do NOT use this parameter. Xcode will accept it from the UI,
# 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('explicitFileType', xcodetype)
odict.add_item('fileEncoding', '4')
odict.add_item('name', f'"{name}"')
odict.add_item('path', f'"{rel_name}"')
odict.add_item('name', name)
odict.add_item('path', rel_name)
odict.add_item('sourceTree', 'SOURCE_ROOT')
generator_id += 1
@ -927,8 +928,8 @@ class XCodeBackend(backends.Backend):
o_dict.add_item('isa', 'PBXFileReference')
o_dict.add_item('explicitFileType', self.get_xcodetype(o))
o_dict.add_item('fileEncoding', '4')
o_dict.add_item('name', f'"{name}"')
o_dict.add_item('path', f'"{rel_name}"')
o_dict.add_item('name', name)
o_dict.add_item('path', rel_name)
o_dict.add_item('sourceTree', 'SOURCE_ROOT')
for e in t.extra_files:
@ -984,8 +985,8 @@ class XCodeBackend(backends.Backend):
typestr = self.get_xcodetype(s)
custom_dict.add_item('isa', 'PBXFileReference')
custom_dict.add_item('explicitFileType', typestr)
custom_dict.add_item('name', f'"{s}"')
custom_dict.add_item('path', f'"{s}"')
custom_dict.add_item('name', s)
custom_dict.add_item('path', s)
custom_dict.add_item('refType', 0)
custom_dict.add_item('sourceTree', 'SOURCE_ROOT')
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('explicitFileType', typestr)
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('sourceTree', 'SOURCE_ROOT')
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)
buildfile_dict.add_item('isa', 'PBXFileReference')
buildfile_dict.add_item('explicitFileType', typestr)
buildfile_dict.add_item('name', f'"{basename}"')
buildfile_dict.add_item('path', f'"{buildfile}"')
buildfile_dict.add_item('name', basename)
buildfile_dict.add_item('path', buildfile)
buildfile_dict.add_item('refType', 0)
buildfile_dict.add_item('sourceTree', 'SOURCE_ROOT')
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(products_id, 'Products')
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)
@ -1058,7 +1059,7 @@ class XCodeBackend(backends.Backend):
resource_children = PbxArray()
resource_dict.add_item('children', resource_children)
resource_dict.add_item('name', 'Resources')
resource_dict.add_item('sourceTree', '"<group>"')
resource_dict.add_item('sourceTree', '<group>')
frameworks_dict = PbxDict()
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_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():
target_dict = PbxDict()
@ -1084,10 +1085,10 @@ class XCodeBackend(backends.Backend):
target_dict.add_item('children', target_children)
target_children.add_item(target_src_map[tname], 'Source files')
if t.subproject:
target_dict.add_item('name', f'"{t.subproject}{t.name}"')
target_dict.add_item('name', f'{t.subproject}{t.name}')
else:
target_dict.add_item('name', f'"{t.name}"')
target_dict.add_item('sourceTree', '"<group>"')
target_dict.add_item('name', t.name)
target_dict.add_item('sourceTree', '<group>')
source_files_dict = PbxDict()
objects_dict.add_item(target_src_map[tname], source_files_dict, 'Source files')
source_files_dict.add_item('isa', 'PBXGroup')
@ -1101,8 +1102,8 @@ class XCodeBackend(backends.Backend):
else:
continue
source_file_children.add_item(self.fileref_ids[(tname, s)], s)
source_files_dict.add_item('name', '"Source files"')
source_files_dict.add_item('sourceTree', '"<group>"')
source_files_dict.add_item('name', 'Source files')
source_files_dict.add_item('sourceTree', '<group>')
# And finally products
product_dict = PbxDict()
@ -1113,7 +1114,7 @@ class XCodeBackend(backends.Backend):
for t in self.build_targets:
product_children.add_item(self.target_filemap[t], t)
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):
tid = t.get_id()
@ -1123,8 +1124,8 @@ class XCodeBackend(backends.Backend):
target_dict.add_item('isa', 'PBXGroup')
target_children = PbxArray()
target_dict.add_item('children', target_children)
target_dict.add_item('name', f'"{t} · target"')
target_dict.add_item('sourceTree', '"<group>"')
target_dict.add_item('name', f'{t} · target')
target_dict.add_item('sourceTree', '<group>')
source_files_dict = PbxDict()
for s in t.sources:
if isinstance(s, mesonlib.File):
@ -1151,8 +1152,8 @@ class XCodeBackend(backends.Backend):
else:
continue
target_children.add_item(self.fileref_ids[(tid, e)], e)
source_files_dict.add_item('name', '"Source files"')
source_files_dict.add_item('sourceTree', '"<group>"')
source_files_dict.add_item('name', 'Source files')
source_files_dict.add_item('sourceTree', '<group>')
return group_id
def add_projecttree(self, objects_dict, projecttree_id) -> None:
@ -1161,8 +1162,8 @@ class XCodeBackend(backends.Backend):
root_dict.add_item('isa', 'PBXGroup')
target_children = PbxArray()
root_dict.add_item('children', target_children)
root_dict.add_item('name', '"Project root"')
root_dict.add_item('sourceTree', '"<group>"')
root_dict.add_item('name', 'Project root')
root_dict.add_item('sourceTree', '<group>')
project_tree = self.generate_project_tree()
self.write_tree(objects_dict, project_tree, target_children, '')
@ -1176,8 +1177,8 @@ class XCodeBackend(backends.Backend):
children_array.add_item(subdir_id)
subdir_dict.add_item('isa', 'PBXGroup')
subdir_dict.add_item('children', subdir_children)
subdir_dict.add_item('name', f'"{subdir_name}"')
subdir_dict.add_item('sourceTree', '"<group>"')
subdir_dict.add_item('name', subdir_name)
subdir_dict.add_item('sourceTree', '<group>')
self.write_tree(objects_dict, subdir_node, subdir_children, os.path.join(current_subdir, subdir_name))
for target in tree_node.targets:
group_id = self.write_group_target_entry(objects_dict, target)
@ -1259,8 +1260,8 @@ class XCodeBackend(backends.Backend):
generator_id += 1
ntarget_dict.add_item('name', f'"{tname}"')
ntarget_dict.add_item('productName', f'"{tname}"')
ntarget_dict.add_item('name', tname)
ntarget_dict.add_item('productName', tname)
ntarget_dict.add_item('productReference', self.target_filemap[tname], tname)
if isinstance(t, build.Executable):
typestr = 'com.apple.product-type.tool'
@ -1286,7 +1287,7 @@ class XCodeBackend(backends.Backend):
project_dict.add_item('buildStyles', style_arr)
for name, idval in self.buildstylemap.items():
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('mainGroup', self.maingroup_id)
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')
cmd = mesonlib.get_meson_command() + ['test', '--no-rebuild', '-C', self.environment.get_build_dir()]
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)
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')
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])
shell_dict.add_item('shellScript', f'"{cmdstr}"')
shell_dict.add_item('shellScript', cmdstr)
shell_dict.add_item('showEnvVarsInLog', 0)
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('outputPaths', outarray)
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('shellPath', '/bin/sh')
workdir = self.environment.get_build_dir()
@ -1366,7 +1367,7 @@ class XCodeBackend(backends.Backend):
for c in fixed_cmd:
quoted_cmd.append(c.replace('"', chr(92) + '"'))
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)
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()
target_private_dir = self.relpath(self.get_target_private_dir(t), self.get_target_dir(t))
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()
outfilelist = genlist.get_outputs()
gen_dict.add_item('isa', 'PBXShellScriptBuildPhase')
gen_dict.add_item('buildActionMask', 2147483647)
gen_dict.add_item('files', 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.
k = (tname, generator_id)
ofile_abs = self.generator_outputs[k]
outarray = PbxArray()
gen_dict.add_item('outputPaths', outarray)
for of in ofile_abs:
outarray.add_item(f'"{of}"')
outarray.add_item(of)
for i in infilelist:
# 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
@ -1511,14 +1512,14 @@ class XCodeBackend(backends.Backend):
bt_dict.add_item('isa', 'XCBuildConfiguration')
settings_dict = PbxDict()
bt_dict.add_item('buildSettings', settings_dict)
settings_dict.add_item('ARCHS', f'"{self.arch}"')
settings_dict.add_item('BUILD_DIR', f'"{self.environment.get_build_dir()}"')
settings_dict.add_item('BUILD_ROOT', '"$(BUILD_DIR)"')
settings_dict.add_item('ARCHS', self.arch)
settings_dict.add_item('BUILD_DIR', self.environment.get_build_dir())
settings_dict.add_item('BUILD_ROOT', '$(BUILD_DIR)')
settings_dict.add_item('ONLY_ACTIVE_ARCH', 'YES')
settings_dict.add_item('SWIFT_VERSION', '5.0')
settings_dict.add_item('SDKROOT', '"macosx"')
settings_dict.add_item('OBJROOT', '"$(BUILD_DIR)/build"')
bt_dict.add_item('name', f'"{buildtype}"')
settings_dict.add_item('SDKROOT', 'macosx')
settings_dict.add_item('OBJROOT', '$(BUILD_DIR)/build')
bt_dict.add_item('name', buildtype)
# Then the all target.
for buildtype in self.buildtypes:
@ -1531,7 +1532,7 @@ class XCodeBackend(backends.Backend):
warn_array.add_item('"$(inherited)"')
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.
for buildtype in self.buildtypes:
@ -1543,7 +1544,7 @@ class XCodeBackend(backends.Backend):
warn_array = PbxArray()
settings_dict.add_item('WARNING_CFLAGS', warn_array)
warn_array.add_item('"$(inherited)"')
bt_dict.add_item('name', f'"{buildtype}"')
bt_dict.add_item('name', buildtype)
# Now finally targets.
for target_name, target in self.build_targets.items():
@ -1555,10 +1556,10 @@ class XCodeBackend(backends.Backend):
bt_dict.add_item('isa', 'XCBuildConfiguration')
settings_dict = PbxDict()
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('SDKROOT', '"macosx"')
bt_dict.add_item('name', f'"{buildtype}"')
settings_dict.add_item('SDKROOT', 'macosx')
bt_dict.add_item('name', buildtype)
def determine_internal_dep_link_args(self, target, buildtype):
links_dylib = False
@ -1725,11 +1726,11 @@ class XCodeBackend(backends.Backend):
bt_dict.add_item('buildSettings', settings_dict)
settings_dict.add_item('COMBINE_HIDPI_IMAGES', 'YES')
if isinstance(target, build.SharedModule):
settings_dict.add_item('DYLIB_CURRENT_VERSION', '""')
settings_dict.add_item('DYLIB_COMPATIBILITY_VERSION', '""')
settings_dict.add_item('DYLIB_CURRENT_VERSION', '')
settings_dict.add_item('DYLIB_COMPATIBILITY_VERSION', '')
else:
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:
settings_dict.add_item('EXECUTABLE_PREFIX', target.prefix)
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.')
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_PREFIX_HEADER', f'"$(PROJECT_DIR)/{relative_pch_path}"')
settings_dict.add_item('GCC_PREPROCESSOR_DEFINITIONS', '""')
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_SYMBOLS_PRIVATE_EXTERN', 'NO')
header_arr = PbxArray()
unquoted_headers = []
@ -1766,27 +1767,24 @@ class XCodeBackend(backends.Backend):
i = os.path.normpath(i)
unquoted_headers.append(i)
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('INSTALL_PATH', f'"{install_path}"')
settings_dict.add_item('LIBRARY_SEARCH_PATHS', '""')
settings_dict.add_item('INSTALL_PATH', install_path)
settings_dict.add_item('LIBRARY_SEARCH_PATHS', '')
if isinstance(target, build.SharedModule):
settings_dict.add_item('LIBRARY_STYLE', 'BUNDLE')
settings_dict.add_item('MACH_O_TYPE', 'mh_bundle')
elif isinstance(target, build.SharedLibrary):
settings_dict.add_item('LIBRARY_STYLE', 'DYNAMIC')
self.add_otherargs(settings_dict, langargs)
settings_dict.add_item('OTHER_LDFLAGS', f'"{ldstr}"')
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('SECTORDER_FLAGS', '""')
settings_dict.add_item('OTHER_LDFLAGS', ldstr)
settings_dict.add_item('OTHER_REZFLAGS', '')
settings_dict.add_item('PRODUCT_NAME', product_name)
settings_dict.add_item('SECTORDER_FLAGS', '')
if is_swift and bridging_header:
settings_dict.add_item('SWIFT_OBJC_BRIDGING_HEADER', f'"{bridging_header}"')
settings_dict.add_item('BUILD_DIR', f'"{symroot}"')
settings_dict.add_item('OBJROOT', f'"{symroot}/build"')
settings_dict.add_item('SWIFT_OBJC_BRIDGING_HEADER', bridging_header)
settings_dict.add_item('BUILD_DIR', symroot)
settings_dict.add_item('OBJROOT', f'{symroot}/build')
sysheader_arr = PbxArray()
# XCode will change every -I flag that points inside these directories
# to an -isystem. Thus set nothing in it since we control our own

Loading…
Cancel
Save