@@ -322,14 +322,27 @@ mod linker_config {
322322 // Link against the microtex-cairo library (contains Cairo rendering code)
323323 println ! ( "cargo:rustc-link-lib=static=microtex-cairo" ) ;
324324
325- // Always link C++ runtime on macOS
325+ // Link C++ standard library
326326 #[ cfg( target_os = "macos" ) ]
327327 {
328328 println ! ( "cargo:rustc-link-lib=dylib=c++" ) ;
329329 }
330330
331- // Try to use pkg-config to find Cairo dependencies
332- // This is more reliable than hardcoding library names
331+ #[ cfg( target_os = "linux" ) ]
332+ {
333+ println ! ( "cargo:rustc-link-lib=dylib=stdc++" ) ;
334+ }
335+
336+ #[ cfg( target_os = "windows" ) ]
337+ {
338+ println ! ( "cargo:rustc-link-lib=dylib=msvcrt" ) ;
339+ }
340+
341+ // Use pkg-config to find and link all Cairo and Pango dependencies
342+ let mut cairo_libs = Vec :: new ( ) ;
343+ let mut search_paths = Vec :: new ( ) ;
344+
345+ // Get Cairo flags from pkg-config
333346 if let Ok ( output) = Command :: new ( "pkg-config" )
334347 . arg ( "--exists" )
335348 . arg ( "cairo" )
@@ -340,19 +353,52 @@ mod linker_config {
340353
341354 if let Ok ( libs_output) = Command :: new ( "pkg-config" )
342355 . arg ( "--libs" )
356+ . arg ( "--static" )
343357 . arg ( "cairo" )
358+ . arg ( "pango" )
359+ . arg ( "pangocairo" )
344360 . output ( )
345361 {
346362 let libs_str = String :: from_utf8_lossy ( & libs_output. stdout ) ;
347- println ! ( "cargo:warning=Cairo linker flags: {}" , libs_str. trim( ) ) ;
363+ println ! ( "cargo:warning=Cairo/Pango linker flags: {}" , libs_str. trim( ) ) ;
348364
349365 for flag in libs_str. split_whitespace ( ) {
350366 if flag. starts_with ( "-l" ) {
351367 let lib_name = & flag[ 2 ..] ;
352- println ! ( "cargo:rustc-link-lib={}" , lib_name) ;
368+ if !cairo_libs. contains ( & lib_name. to_string ( ) ) {
369+ cairo_libs. push ( lib_name. to_string ( ) ) ;
370+ println ! ( "cargo:rustc-link-lib={}" , lib_name) ;
371+ }
353372 } else if flag. starts_with ( "-L" ) {
354373 let lib_path = & flag[ 2 ..] ;
355- println ! ( "cargo:rustc-link-search=native={}" , lib_path) ;
374+ if !search_paths. contains ( & lib_path. to_string ( ) ) {
375+ search_paths. push ( lib_path. to_string ( ) ) ;
376+ println ! ( "cargo:rustc-link-search=native={}" , lib_path) ;
377+ }
378+ }
379+ }
380+ } else {
381+ // Fallback: try to get libs without --static flag
382+ if let Ok ( libs_output) = Command :: new ( "pkg-config" )
383+ . arg ( "--libs" )
384+ . arg ( "cairo" )
385+ . output ( )
386+ {
387+ let libs_str = String :: from_utf8_lossy ( & libs_output. stdout ) ;
388+ println ! ( "cargo:warning=Cairo linker flags: {}" , libs_str. trim( ) ) ;
389+
390+ for flag in libs_str. split_whitespace ( ) {
391+ if flag. starts_with ( "-l" ) {
392+ let lib_name = & flag[ 2 ..] ;
393+ if !cairo_libs. contains ( & lib_name. to_string ( ) ) {
394+ println ! ( "cargo:rustc-link-lib={}" , lib_name) ;
395+ }
396+ } else if flag. starts_with ( "-L" ) {
397+ let lib_path = & flag[ 2 ..] ;
398+ if !search_paths. contains ( & lib_path. to_string ( ) ) {
399+ println ! ( "cargo:rustc-link-search=native={}" , lib_path) ;
400+ }
401+ }
356402 }
357403 }
358404 }
0 commit comments