From 818685ec18cb1db000a2a4a02b8f890b837a89f5 Mon Sep 17 00:00:00 2001 From: Jussi Pakkanen Date: Fri, 21 May 2021 18:59:59 +0300 Subject: Write project info in a tree structure rather than the current flat one. --- mesonbuild/backend/xcodebackend.py | 134 +++++++++++++++++++++++++++---------- 1 file changed, 97 insertions(+), 37 deletions(-) (limited to 'mesonbuild/backend') diff --git a/mesonbuild/backend/xcodebackend.py b/mesonbuild/backend/xcodebackend.py index 66f6704..8e7eda9 100644 --- a/mesonbuild/backend/xcodebackend.py +++ b/mesonbuild/backend/xcodebackend.py @@ -58,6 +58,13 @@ OPT2XCODEOPT = {'0': '0', BOOL2XCODEBOOL = {True: 'YES', False: 'NO'} LINKABLE_EXTENSIONS = {'.o', '.a', '.obj', '.so', '.dylib'} +class FileTreeEntry: + + def __init__(self): + self.subdirs = {} + self.targets = [] + self.buildfiles = [] + class PbxItem: def __init__(self, value, comment = ''): self.value = value @@ -848,21 +855,25 @@ class XCodeBackend(backends.Backend): for t in self.custom_targets: groupmap[t] = self.gen_id() target_src_map[t] = self.gen_id() + projecttree_id = self.gen_id() sources_id = self.gen_id() resources_id = self.gen_id() products_id = self.gen_id() - frameworks_id = self.gen_id() + frameworks_id = self.gen_id() main_dict = PbxDict() objects_dict.add_item(self.maingroup_id, main_dict) main_dict.add_item('isa', 'PBXGroup') main_children = PbxArray() main_dict.add_item('children', main_children) + main_children.add_item(projecttree_id, 'Project tree') main_children.add_item(sources_id, 'Sources') 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', '""') + self.add_projecttree(objects_dict, projecttree_id) + # Sources source_dict = PbxDict() objects_dict.add_item(sources_id, source_dict, 'Sources') @@ -901,42 +912,8 @@ class XCodeBackend(backends.Backend): frameworks_dict.add_item('sourceTree', '""') # Targets - for tname, t in self.build_targets.items(): - target_dict = PbxDict() - objects_dict.add_item(groupmap[tname], target_dict, tname) - target_dict.add_item('isa', 'PBXGroup') - target_children = PbxArray() - 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}"') - else: - target_dict.add_item('name', f'"{t}"') - target_dict.add_item('sourceTree', '""') - source_files_dict = PbxDict() - objects_dict.add_item(target_src_map[tname], source_files_dict, 'Source files') - source_files_dict.add_item('isa', 'PBXGroup') - source_file_children = PbxArray() - source_files_dict.add_item('children', source_file_children) - for s in t.sources: - if isinstance(s, mesonlib.File): - s = os.path.join(s.subdir, s.fname) - elif isinstance(s, str): - s = os.path.joni(t.subdir, s) - else: - continue - source_file_children.add_item(self.fileref_ids[(tname, s)], s) - for o in t.objects: - if isinstance(o, build.ExtractedObjects): - # Do not show built object files in the project tree. - continue - if isinstance(o, mesonlib.File): - o = os.path.join(o.subdir, o.fname) - else: - o = os.path.join(t.subdir, o) - source_file_children.add_item(self.fileref_ids[(tname, o)], o) - source_files_dict.add_item('name', '"Source files"') - source_files_dict.add_item('sourceTree', '""') + #for tname, t in self.build_targets.items(): + # self.write_group_target_entry(objects_dict, tname, t) for tname, t in self.custom_targets.items(): target_dict = PbxDict() @@ -977,6 +954,89 @@ class XCodeBackend(backends.Backend): product_dict.add_item('name', 'Products') product_dict.add_item('sourceTree', '""') + def write_group_target_entry(self, objects_dict, tname, t): + group_id = self.gen_id() + target_src_id = self.gen_id() + target_dict = PbxDict() + objects_dict.add_item(group_id, target_dict, tname) + target_dict.add_item('isa', 'PBXGroup') + target_children = PbxArray() + target_dict.add_item('children', target_children) + target_children.add_item(target_src_id, 'Source files') + target_dict.add_item('name', f'"{t}"') + target_dict.add_item('sourceTree', '""') + source_files_dict = PbxDict() + objects_dict.add_item(target_src_id, source_files_dict, 'Source files') + source_files_dict.add_item('isa', 'PBXGroup') + source_file_children = PbxArray() + source_files_dict.add_item('children', source_file_children) + for s in t.sources: + if isinstance(s, mesonlib.File): + s = os.path.join(s.subdir, s.fname) + elif isinstance(s, str): + s = os.path.joni(t.subdir, s) + else: + continue + source_file_children.add_item(self.fileref_ids[(tname, s)], s) + for o in t.objects: + if isinstance(o, build.ExtractedObjects): + # Do not show built object files in the project tree. + continue + if isinstance(o, mesonlib.File): + o = os.path.join(o.subdir, o.fname) + else: + o = os.path.join(t.subdir, o) + source_file_children.add_item(self.fileref_ids[(tname, o)], o) + source_files_dict.add_item('name', '"Source files"') + source_files_dict.add_item('sourceTree', '""') + return (group_id, target_src_id) + + def add_projecttree(self, objects_dict, projecttree_id): + root_dict = PbxDict() + objects_dict.add_item(projecttree_id, root_dict, "Root of project tree") + 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', '""') + + project_tree = self.generate_project_tree() + self.write_tree(objects_dict, project_tree, target_children) + + def write_tree(self, objects_dict, tree_node, children_array): + for subdir_name, subdir_node in tree_node.subdirs.items(): + subdir_dict = PbxDict() + subdir_id = self.gen_id() + objects_dict.add_item(subdir_id, subdir_dict) + children_array.add_item(subdir_id) + subdir_dict.add_item('isa', 'PBXGroup') + subdir_children = PbxArray() + subdir_dict.add_item('children', subdir_children) + subdir_dict.add_item('name', f'"{subdir_name}"') + subdir_dict.add_item('sourceTree', '""') + self.write_tree(objects_dict, subdir_node, subdir_children) + for target in tree_node.targets: + group_id, _ = self.write_group_target_entry(objects_dict, target.get_id(), target) + children_array.add_item(group_id) + for src in tree_node.build_files: + + + def generate_project_tree(self): + tree_info = FileTreeEntry() + for tname, t in self.build_targets.items(): + self.add_target_to_tree(tree_info, t) + return tree_info + + def add_target_to_tree(self, tree_root, t): + current_node = tree_root + path_segments = t.subdir.split('/') + for s in path_segments: + if not s: + continue + if s not in current_node.subdirs: + current_node.subdirs[s] = FileTreeEntry() + current_node = current_node.subdirs[s] + current_node.targets.append(t) def generate_pbx_native_target(self, objects_dict): for tname, idval in self.native_targets.items(): -- cgit v1.1 From 7ceba6388c0521b26b4d03e312e69992fc19af71 Mon Sep 17 00:00:00 2001 From: Jussi Pakkanen Date: Fri, 21 May 2021 23:32:07 +0300 Subject: Add meson.build files to pbxgroup. --- mesonbuild/backend/xcodebackend.py | 40 +++++++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 9 deletions(-) (limited to 'mesonbuild/backend') diff --git a/mesonbuild/backend/xcodebackend.py b/mesonbuild/backend/xcodebackend.py index 8e7eda9..8f93ac1 100644 --- a/mesonbuild/backend/xcodebackend.py +++ b/mesonbuild/backend/xcodebackend.py @@ -63,7 +63,6 @@ class FileTreeEntry: def __init__(self): self.subdirs = {} self.targets = [] - self.buildfiles = [] class PbxItem: def __init__(self, value, comment = ''): @@ -274,6 +273,7 @@ class XCodeBackend(backends.Backend): self.generate_pbxdep_map() self.generate_containerproxy_map() self.generate_target_file_maps() + self.generate_build_file_maps() self.proj_dir = os.path.join(self.environment.get_build_dir(), self.build.project_name + '.xcodeproj') os.makedirs(self.proj_dir, exist_ok=True) self.proj_file = os.path.join(self.proj_dir, 'project.pbxproj') @@ -328,7 +328,6 @@ class XCodeBackend(backends.Backend): xcodetype = XCODETYPEMAP.get(fname.split('.')[-1].lower()) if not xcodetype: xcodetype = 'sourcecode.unknown' - mlog.warning(f'Unknown file type "{fname}" fallbacking to "{xcodetype}". Xcode project might be malformed.') return xcodetype def generate_filemap(self): @@ -516,6 +515,12 @@ class XCodeBackend(backends.Backend): else: raise RuntimeError('Unknown input type ' + str(o)) + def generate_build_file_maps(self): + for buildfile in self.interpreter.get_build_def_files(): + assert(isinstance(buildfile, str)) + self.buildfile_ids[buildfile] = self.gen_id() + self.fileref_ids[buildfile] = self.gen_id() + def generate_source_phase_map(self): self.source_phase = {} for t in self.build_targets: @@ -832,6 +837,18 @@ class XCodeBackend(backends.Backend): custom_dict.add_item('sourceTree', 'SOURCE_ROOT') objects_dict.add_item(self.custom_target_output_fileref[o], custom_dict) + for buildfile in self.interpreter.get_build_def_files(): + basename = os.path.split(buildfile)[1] + buildfile_dict = PbxDict() + 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('refType', 0) + buildfile_dict.add_item('sourceTree', 'SOURCE_ROOT') + objects_dict.add_item(self.fileref_ids[buildfile], buildfile_dict) + def generate_pbx_frameworks_buildphase(self, objects_dict): for t in self.build_targets.values(): bt_dict = PbxDict() @@ -1001,25 +1018,30 @@ class XCodeBackend(backends.Backend): root_dict.add_item('sourceTree', '""') project_tree = self.generate_project_tree() - self.write_tree(objects_dict, project_tree, target_children) + self.write_tree(objects_dict, project_tree, target_children, '') - def write_tree(self, objects_dict, tree_node, children_array): + def write_tree(self, objects_dict, tree_node, children_array, current_subdir): + subdir_dict = PbxDict() + subdir_children = PbxArray() for subdir_name, subdir_node in tree_node.subdirs.items(): - subdir_dict = PbxDict() subdir_id = self.gen_id() objects_dict.add_item(subdir_id, subdir_dict) children_array.add_item(subdir_id) subdir_dict.add_item('isa', 'PBXGroup') - subdir_children = PbxArray() subdir_dict.add_item('children', subdir_children) subdir_dict.add_item('name', f'"{subdir_name}"') subdir_dict.add_item('sourceTree', '""') - self.write_tree(objects_dict, subdir_node, subdir_children) + 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.get_id(), target) children_array.add_item(group_id) - for src in tree_node.build_files: - + potentials = [os.path.join(current_subdir, 'meson.build'), + os.path.join(current_subdir, 'meson_options.txt')] + for bf in potentials: + i = self.fileref_ids.get(bf, None) + if i: + children_array.add_item(i) + def generate_project_tree(self): tree_info = FileTreeEntry() -- cgit v1.1 From b84265052ee42f1fc356ecaef666c1d10b3fc210 Mon Sep 17 00:00:00 2001 From: Jussi Pakkanen Date: Sat, 22 May 2021 00:01:47 +0300 Subject: Remove top level sources entry as unnecessary. --- mesonbuild/backend/xcodebackend.py | 30 ++++++------------------------ 1 file changed, 6 insertions(+), 24 deletions(-) (limited to 'mesonbuild/backend') diff --git a/mesonbuild/backend/xcodebackend.py b/mesonbuild/backend/xcodebackend.py index 8f93ac1..49e4d0e 100644 --- a/mesonbuild/backend/xcodebackend.py +++ b/mesonbuild/backend/xcodebackend.py @@ -873,7 +873,6 @@ class XCodeBackend(backends.Backend): groupmap[t] = self.gen_id() target_src_map[t] = self.gen_id() projecttree_id = self.gen_id() - sources_id = self.gen_id() resources_id = self.gen_id() products_id = self.gen_id() frameworks_id = self.gen_id() @@ -883,7 +882,6 @@ class XCodeBackend(backends.Backend): main_children = PbxArray() main_dict.add_item('children', main_children) main_children.add_item(projecttree_id, 'Project tree') - main_children.add_item(sources_id, 'Sources') main_children.add_item(resources_id, 'Resources') main_children.add_item(products_id, 'Products') main_children.add_item(frameworks_id, 'Frameworks') @@ -891,19 +889,6 @@ class XCodeBackend(backends.Backend): self.add_projecttree(objects_dict, projecttree_id) - # Sources - source_dict = PbxDict() - objects_dict.add_item(sources_id, source_dict, 'Sources') - source_dict.add_item('isa', 'PBXGroup') - source_children = PbxArray() - source_dict.add_item('children', source_children) - for t in self.build_targets: - source_children.add_item(groupmap[t], t) - for t in self.custom_targets: - source_children.add_item(groupmap[t], t) - source_dict.add_item('name', 'Sources') - source_dict.add_item('sourceTree', '""') - resource_dict = PbxDict() objects_dict.add_item(resources_id, resource_dict, 'Resources') resource_dict.add_item('isa', 'PBXGroup') @@ -928,10 +913,6 @@ class XCodeBackend(backends.Backend): frameworks_dict.add_item('name', 'Frameworks') frameworks_dict.add_item('sourceTree', '""') - # Targets - #for tname, t in self.build_targets.items(): - # self.write_group_target_entry(objects_dict, tname, t) - for tname, t in self.custom_targets.items(): target_dict = PbxDict() objects_dict.add_item(groupmap[tname], target_dict, tname) @@ -971,16 +952,17 @@ class XCodeBackend(backends.Backend): product_dict.add_item('name', 'Products') product_dict.add_item('sourceTree', '""') - def write_group_target_entry(self, objects_dict, tname, t): + def write_group_target_entry(self, objects_dict, t): + tid = t.get_id() group_id = self.gen_id() target_src_id = self.gen_id() target_dict = PbxDict() - objects_dict.add_item(group_id, target_dict, tname) + objects_dict.add_item(group_id, target_dict, tid) target_dict.add_item('isa', 'PBXGroup') target_children = PbxArray() target_dict.add_item('children', target_children) target_children.add_item(target_src_id, 'Source files') - target_dict.add_item('name', f'"{t}"') + target_dict.add_item('name', f'"{t} · target"') target_dict.add_item('sourceTree', '""') source_files_dict = PbxDict() objects_dict.add_item(target_src_id, source_files_dict, 'Source files') @@ -994,7 +976,7 @@ class XCodeBackend(backends.Backend): s = os.path.joni(t.subdir, s) else: continue - source_file_children.add_item(self.fileref_ids[(tname, s)], s) + source_file_children.add_item(self.fileref_ids[(tid, s)], s) for o in t.objects: if isinstance(o, build.ExtractedObjects): # Do not show built object files in the project tree. @@ -1033,7 +1015,7 @@ class XCodeBackend(backends.Backend): subdir_dict.add_item('sourceTree', '""') 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.get_id(), target) + group_id, _ = self.write_group_target_entry(objects_dict, target) children_array.add_item(group_id) potentials = [os.path.join(current_subdir, 'meson.build'), os.path.join(current_subdir, 'meson_options.txt')] -- cgit v1.1 From e23fd086bffebc2465cb251808219ef32fab78cd Mon Sep 17 00:00:00 2001 From: Jussi Pakkanen Date: Sat, 22 May 2021 00:08:16 +0300 Subject: Remove unnecessary hierarchical layer. --- mesonbuild/backend/xcodebackend.py | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) (limited to 'mesonbuild/backend') diff --git a/mesonbuild/backend/xcodebackend.py b/mesonbuild/backend/xcodebackend.py index 49e4d0e..7a932de 100644 --- a/mesonbuild/backend/xcodebackend.py +++ b/mesonbuild/backend/xcodebackend.py @@ -955,20 +955,14 @@ class XCodeBackend(backends.Backend): def write_group_target_entry(self, objects_dict, t): tid = t.get_id() group_id = self.gen_id() - target_src_id = self.gen_id() target_dict = PbxDict() objects_dict.add_item(group_id, target_dict, tid) target_dict.add_item('isa', 'PBXGroup') target_children = PbxArray() target_dict.add_item('children', target_children) - target_children.add_item(target_src_id, 'Source files') target_dict.add_item('name', f'"{t} · target"') target_dict.add_item('sourceTree', '""') source_files_dict = PbxDict() - objects_dict.add_item(target_src_id, source_files_dict, 'Source files') - source_files_dict.add_item('isa', 'PBXGroup') - source_file_children = PbxArray() - source_files_dict.add_item('children', source_file_children) for s in t.sources: if isinstance(s, mesonlib.File): s = os.path.join(s.subdir, s.fname) @@ -976,7 +970,7 @@ class XCodeBackend(backends.Backend): s = os.path.joni(t.subdir, s) else: continue - source_file_children.add_item(self.fileref_ids[(tid, s)], s) + target_children.add_item(self.fileref_ids[(tid, s)], s) for o in t.objects: if isinstance(o, build.ExtractedObjects): # Do not show built object files in the project tree. @@ -985,10 +979,10 @@ class XCodeBackend(backends.Backend): o = os.path.join(o.subdir, o.fname) else: o = os.path.join(t.subdir, o) - source_file_children.add_item(self.fileref_ids[(tname, o)], o) + target_children.add_item(self.fileref_ids[(tid, o)], o) source_files_dict.add_item('name', '"Source files"') source_files_dict.add_item('sourceTree', '""') - return (group_id, target_src_id) + return group_id def add_projecttree(self, objects_dict, projecttree_id): root_dict = PbxDict() @@ -1015,7 +1009,7 @@ class XCodeBackend(backends.Backend): subdir_dict.add_item('sourceTree', '""') 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) + group_id = self.write_group_target_entry(objects_dict, target) children_array.add_item(group_id) potentials = [os.path.join(current_subdir, 'meson.build'), os.path.join(current_subdir, 'meson_options.txt')] -- cgit v1.1