(libDir string)
| 442 | } |
| 443 | |
| 444 | func (b *BuildConfig) appendLibDir(libDir string) { |
| 445 | // Windows: MSVC/Clang-cl ----------- Linux: GCC/Clang |
| 446 | // LIB=xxx\lib;%LIB% ---------------- -L "xxx/lib" |
| 447 | // LINK=mylib.lib %LINK% ------------ -l "mylib" |
| 448 | |
| 449 | // Toolchain may throw error if lib dir not exists. |
| 450 | if !fileio.PathExists(libDir) { |
| 451 | return |
| 452 | } |
| 453 | |
| 454 | toolchain := b.Ctx.Platform().GetToolchain() |
| 455 | switch toolchain.GetName() { |
| 456 | case "gcc", "clang", "qcc": |
| 457 | ldflags := os.Getenv("LDFLAGS") |
| 458 | parts := strings.Fields(ldflags) |
| 459 | |
| 460 | // -L flag: used to specify the directory that libraries looking for directly. |
| 461 | linkFlag := "-L" + libDir |
| 462 | |
| 463 | // -Wl,-rpath-link, used to specify the directory that libraries looking for indirectly. |
| 464 | rpathlinkFlag := "-Wl,-rpath-link," + libDir |
| 465 | |
| 466 | // Check if this is a dependency lib dir (tmpDeps/lib) - if so, prepend it. |
| 467 | tmpDepsPrefix := filepath.Join(dirs.TmpDepsDir, b.PortConfig.LibraryDir) |
| 468 | isDepsLibDir := strings.Contains(libDir, tmpDepsPrefix) |
| 469 | |
| 470 | // Prepend dependency lib dir flags to prioritize them. |
| 471 | var newAppended = false |
| 472 | if !slices.Contains(parts, linkFlag) { |
| 473 | if isDepsLibDir { |
| 474 | parts = append([]string{linkFlag}, parts...) |
| 475 | } else { |
| 476 | parts = append(parts, linkFlag) |
| 477 | } |
| 478 | newAppended = true |
| 479 | } |
| 480 | if !slices.Contains(parts, rpathlinkFlag) { |
| 481 | if isDepsLibDir { |
| 482 | parts = append([]string{rpathlinkFlag}, parts...) |
| 483 | } else { |
| 484 | parts = append(parts, rpathlinkFlag) |
| 485 | } |
| 486 | newAppended = true |
| 487 | } |
| 488 | |
| 489 | // Update environment variable with modified flags. |
| 490 | if newAppended { |
| 491 | b.envBackup.setenv("LDFLAGS", strings.Join(parts, " ")) |
| 492 | } |
| 493 | |
| 494 | case "msvc", "clang-cl": |
| 495 | libs := os.Getenv("LIB") |
| 496 | parts := strings.Fields(libs) |
| 497 | |
| 498 | if !slices.Contains(parts, libDir) { |
| 499 | parts = append(parts, libDir) |
| 500 | b.envBackup.setenv("LIB", strings.Join(parts, ";")) |
| 501 | } |
no test coverage detected