@@ -59,6 +59,7 @@ const XcframeworkInfoSchema = zod.looseObject({
5959 BinaryPath : zod . string ( ) ,
6060 LibraryIdentifier : zod . string ( ) ,
6161 LibraryPath : zod . string ( ) ,
62+ DebugSymbolsPath : zod . string ( ) . optional ( ) ,
6263 } ) ,
6364 ) ,
6465 CFBundlePackageType : zod . literal ( "XFWK" ) ,
@@ -100,13 +101,12 @@ export async function writeFrameworkInfo(
100101
101102type LinkFrameworkOptions = {
102103 frameworkPath : string ;
104+ debugSymbolsPath ?: string ;
103105 newLibraryName : string ;
104106} ;
105107
106- export async function linkFramework ( {
107- frameworkPath,
108- newLibraryName,
109- } : LinkFrameworkOptions ) {
108+ export async function linkFramework ( options : LinkFrameworkOptions ) {
109+ const { frameworkPath } = options ;
110110 assert . equal (
111111 process . platform ,
112112 "darwin" ,
@@ -117,14 +117,15 @@ export async function linkFramework({
117117 `Expected framework at '${ frameworkPath } '` ,
118118 ) ;
119119 if ( fs . existsSync ( path . join ( frameworkPath , "Versions" ) ) ) {
120- await linkVersionedFramework ( { frameworkPath , newLibraryName } ) ;
120+ await linkVersionedFramework ( options ) ;
121121 } else {
122- await linkFlatFramework ( { frameworkPath , newLibraryName } ) ;
122+ await linkFlatFramework ( options ) ;
123123 }
124124}
125125
126126export async function linkFlatFramework ( {
127127 frameworkPath,
128+ debugSymbolsPath,
128129 newLibraryName,
129130} : LinkFrameworkOptions ) {
130131 assert . equal (
@@ -151,16 +152,44 @@ export async function linkFlatFramework({
151152 ...frameworkInfo ,
152153 CFBundleExecutable : newLibraryName ,
153154 } ) ;
155+
154156 // Rename the actual binary
155157 await fs . promises . rename (
156158 path . join ( frameworkPath , frameworkInfo . CFBundleExecutable ) ,
157159 path . join ( frameworkPath , newLibraryName ) ,
158160 ) ;
159161 // Rename the framework directory
160- await fs . promises . rename (
161- frameworkPath ,
162- path . join ( path . dirname ( frameworkPath ) , `${ newLibraryName } .framework` ) ,
162+ const newFrameworkPath = path . join (
163+ path . dirname ( frameworkPath ) ,
164+ `${ newLibraryName } .framework` ,
163165 ) ;
166+ await fs . promises . rename ( frameworkPath , newFrameworkPath ) ;
167+
168+ if ( debugSymbolsPath ) {
169+ const frameworkDebugSymbolsPath = path . join (
170+ debugSymbolsPath ,
171+ `${ path . basename ( frameworkPath ) } .dSYM` ,
172+ ) ;
173+ if ( fs . existsSync ( frameworkDebugSymbolsPath ) ) {
174+ // Remove existing DWARF data
175+ await fs . promises . rm ( frameworkDebugSymbolsPath , {
176+ recursive : true ,
177+ force : true ,
178+ } ) ;
179+ // Rebuild DWARF data
180+ await spawn (
181+ "dsymutil" ,
182+ [
183+ path . join ( newFrameworkPath , newLibraryName ) ,
184+ "-o" ,
185+ path . join ( debugSymbolsPath , newLibraryName + ".dSYM" ) ,
186+ ] ,
187+ {
188+ outputMode : "buffered" ,
189+ } ,
190+ ) ;
191+ }
192+ }
164193}
165194
166195export async function linkVersionedFramework ( {
@@ -282,7 +311,17 @@ export async function linkXcframework({
282311 framework . LibraryIdentifier ,
283312 framework . LibraryPath ,
284313 ) ;
285- await linkFramework ( { frameworkPath, newLibraryName } ) ;
314+ await linkFramework ( {
315+ frameworkPath,
316+ newLibraryName,
317+ debugSymbolsPath : framework . DebugSymbolsPath
318+ ? path . join (
319+ outputPath ,
320+ framework . LibraryIdentifier ,
321+ framework . DebugSymbolsPath ,
322+ )
323+ : undefined ,
324+ } ) ;
286325 } ) ,
287326 ) ;
288327
0 commit comments