Set SYMROOT as absolute in Generated.xcconfig for macOS (#31451)

diff --git a/packages/flutter_tools/lib/src/ios/xcodeproj.dart b/packages/flutter_tools/lib/src/ios/xcodeproj.dart
index e6e3ac8..17a2fde 100644
--- a/packages/flutter_tools/lib/src/ios/xcodeproj.dart
+++ b/packages/flutter_tools/lib/src/ios/xcodeproj.dart
@@ -37,6 +37,9 @@
 /// useMacOSConfig: Optional parameter that controls whether we use the macOS
 /// project file instead. Defaults to false.
 ///
+/// symrootOverride: Optional parameter to specifify the symroot instead of
+/// the default relative path.
+///
 /// targetOverride: Optional parameter, if null or unspecified the default value
 /// from xcode_backend.sh is used 'lib/main.dart'.
 Future<void> updateGeneratedXcodeProperties({
@@ -44,6 +47,7 @@
   @required BuildInfo buildInfo,
   String targetOverride,
   bool useMacOSConfig = false,
+  String symrootOverride,
 }) async {
   final StringBuffer localsBuffer = StringBuffer();
 
@@ -65,7 +69,11 @@
   final String buildDirectory = useMacOSConfig
       ? getMacOSBuildDirectory()
       : getIosBuildDirectory();
-  localsBuffer.writeln('SYMROOT=\${SOURCE_ROOT}/../$buildDirectory');
+  if (symrootOverride != null) {
+    localsBuffer.writeln('SYMROOT=$symrootOverride');
+  } else {
+    localsBuffer.writeln('SYMROOT=\${SOURCE_ROOT}/../$buildDirectory');
+  }
 
   if (!project.isModule) {
     // For module projects we do not want to write the FLUTTER_FRAMEWORK_DIR
diff --git a/packages/flutter_tools/lib/src/macos/build_macos.dart b/packages/flutter_tools/lib/src/macos/build_macos.dart
index bba4df0..5d32089 100644
--- a/packages/flutter_tools/lib/src/macos/build_macos.dart
+++ b/packages/flutter_tools/lib/src/macos/build_macos.dart
@@ -17,21 +17,23 @@
 // TODO(jonahwilliams): support target option.
 // TODO(jonahwilliams): refactor to share code with the existing iOS code.
 Future<void> buildMacOS(FlutterProject flutterProject, BuildInfo buildInfo) async {
+  final Directory flutterBuildDir = fs.directory(getMacOSBuildDirectory());
+  final String symrootOverride = fs.path.join(flutterBuildDir.absolute.path, 'Build', 'Products');
+  if (!flutterBuildDir.existsSync()) {
+    flutterBuildDir.createSync(recursive: true);
+  }
   // Write configuration to an xconfig file in a standard location.
   await updateGeneratedXcodeProperties(
     project: flutterProject,
     buildInfo: buildInfo,
     useMacOSConfig: true,
+    symrootOverride: symrootOverride,
   );
   // Set debug or release mode.
   String config = 'Debug';
   if (buildInfo.isRelease) {
     config = 'Release';
   }
-  final Directory flutterBuildDir = fs.directory(getMacOSBuildDirectory());
-  if (!flutterBuildDir.existsSync()) {
-    flutterBuildDir.createSync(recursive: true);
-  }
   // Run build script provided by application.
   final Process process = await processManager.start(<String>[
     '/usr/bin/env',
@@ -42,7 +44,7 @@
     '-scheme', 'Runner',
     '-derivedDataPath', flutterBuildDir.absolute.path,
     'OBJROOT=${fs.path.join(flutterBuildDir.absolute.path, 'Build', 'Intermediates.noindex')}',
-    'SYMROOT=${fs.path.join(flutterBuildDir.absolute.path, 'Build', 'Products')}',
+    'SYMROOT=$symrootOverride',
   ], runInShell: true);
   final Status status = logger.startProgress(
     'Building macOS application...',