build: Use meson built-ins instead of realpath

realpath has to traverse filesystem metadata and is significantly slower
than handling all of the exclude files in pure meson. This cuts
configure time by 4x.

Change-Id: I90b1b3735a12dced8e1195c7623c0ec8d21d42ed
Signed-off-by: William A. Kennington III <wak@google.com>
diff --git a/meson.build b/meson.build
index ef22fa0..8b64fad 100644
--- a/meson.build
+++ b/meson.build
@@ -1,5 +1,5 @@
 project('phosphor-dbus-interfaces', 'cpp',
-    meson_version: '>= 0.57.0',
+    meson_version: '>= 0.58.0',
     default_options: [
         'buildtype=debugoptimized',
         'cpp_std=c++20',
@@ -23,8 +23,6 @@
     )
 endif
 
-realpath_prog = find_program('realpath')
-
 # Parse options to determine appropriate subdirectories to support.
 selected_subdirs = []
 if get_option('data_com_ibm')
@@ -53,7 +51,6 @@
     subdir_done()
 endif
 
-generated_root = meson.current_build_dir() / 'gen'
 generated_sources = []
 generated_others = []
 yaml_sources = []
@@ -71,41 +68,49 @@
     depends: generated_others,
     build_by_default: true)
 
-# Parse through the list from sdbus++-gendir and put into sets.
-generated_headers = []
-generated_cpp = []
-generated_others_files = []
-
-foreach g : generated_sources generated_others
-    foreach f : g.to_list()
-        rel_path = run_command(
-            realpath_prog,
-            '--relative-to', generated_root,
-            f.full_path(),
-        ).stdout().strip().split('\n')[-1]
-
-        if rel_path.endswith('.hpp')
-            generated_headers += rel_path
-        elif rel_path.endswith('.cpp')
-            generated_cpp += rel_path
+generated_files_headers = []
+generated_files_cpp = []
+foreach s : generated_sources
+    foreach f : s.to_list()
+        p = f.full_path()
+        if p.endswith('.hpp')
+            generated_files_headers += f
+        elif p.endswith('.cpp')
+            generated_files_cpp += f
         else
-            generated_others_files += rel_path
+            error('Unknown filetype: ' + p)
         endif
     endforeach
 endforeach
 
+generated_root = meson.current_build_dir() / 'gen/'
+exclude_cpp = []
+foreach f : generated_files_cpp
+    exclude_cpp += f.full_path().replace(generated_root, '')
+endforeach
+
 # Install the generated header files.
+exclude = exclude_cpp
+foreach o : generated_others
+    foreach f : o.to_list()
+        exclude += f.full_path().replace(generated_root, '')
+    endforeach
+endforeach
 install_subdir(
     generated_root,
-    exclude_files: [ generated_cpp, generated_others_files ],
+    exclude_files: exclude,
     install_dir: get_option('includedir'),
     strip_directory: true,
 )
 
 # Install the generated markdown files.
+exclude = exclude_cpp
+foreach f : generated_files_headers
+    exclude += f.full_path().replace(generated_root, '')
+endforeach
 install_subdir(
     generated_root,
-    exclude_files: [ generated_headers, generated_cpp ],
+    exclude_files: exclude,
     install_dir: get_option('datadir') / 'doc' / meson.project_name(),
     strip_directory: true,
 )