From e3e3cfb83e2d1c1e69a98ee4eebf5a292f2ff9ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20P=C3=B6chtrager?= Date: Tue, 29 Mar 2016 20:16:54 +0200 Subject: [PATCH] Misc pkg-config adjustments (closes #69) --- README.PKG-CONFIG.md | 21 +++++++++++++ wrapper/programs/pkg-config.cpp | 54 ++++++++++++++++++++++----------- 2 files changed, 57 insertions(+), 18 deletions(-) create mode 100644 README.PKG-CONFIG.md diff --git a/README.PKG-CONFIG.md b/README.PKG-CONFIG.md new file mode 100644 index 0000000..7ed4de3 --- /dev/null +++ b/README.PKG-CONFIG.md @@ -0,0 +1,21 @@ +OSXCross' pkg-config ignores `PKG_CONFIG_*` environment variables by default and maps to `OSXCROSS_PKG_*` to `PKG_*` internally to prevent including wrong header files (`/usr/include`, etc.). + +You can restore the default behavior by setting `OSXCROSS_PKG_CONFIG_USE_NATIVE_VARIABLES` (env) to 1. + +Usage examples: + + $ x86_64-apple-darwin15-pkg-config + osxcross: warning: x86_64-apple-darwin15-pkg-config is a no-op - please see README.PKG-CONFIG.md for more + ## Explanation: No MacPorts packages installed and no OSXCROSS_PKG_* variables set = no-op. ## + + $ x86_64-apple-darwin15-pkg-config --libs sdl2 + -L[...]/target/bin/../macports/pkgs/opt/local/lib -lSDL2 + + $ OSXCROSS_PKG_CONFIG_NO_MP_INC=1 x86_64-apple-darwin15-pkg-config --libs sdl2 + osxcross: warning: x86_64-apple-darwin15-pkg-config is a no-op - please see README.PKG-CONFIG.md for more + + $ OSXCROSS_PKG_CONFIG_LIBDIR= x86_64-apple-darwin15-pkg-config + ## Explanation: OSXCROSS_PKG_CONFIG_LIBDIR gets mapped to PKG_CONFIG_LIBDIR internally. ## + + $ OSXCROSS_PKG_CONFIG_USE_NATIVE_VARIABLES=1 PKG_CONFIG_LIBDIR= x86_64-apple-darwin15-pkg-config + ## Explanation: Restores the default behavior. PKG_CONFIG_LIBDIR is used and OSXCROSS_PKG_* variables will be ignored. ## diff --git a/wrapper/programs/pkg-config.cpp b/wrapper/programs/pkg-config.cpp index 0bdb522..dc250a5 100644 --- a/wrapper/programs/pkg-config.cpp +++ b/wrapper/programs/pkg-config.cpp @@ -48,50 +48,68 @@ int pkg_config(int argc, char **argv, Target &target) { std::vector envvars; std::vector unset; envvar evar; + bool usenativevariables = getenv("OSXCROSS_PKG_CONFIG_USE_NATIVE_VARIABLES"); if (!getenv("OSXCROSS_PKG_CONFIG_NO_MP_INC")) { std::string MacPortsSysRoot; if (target.getMacPortsSysRootDir(MacPortsSysRoot)) { - concatEnvVariable("OSXCROSS_PKG_CONFIG_SYSROOT_DIR", MacPortsSysRoot); + concatEnvVariable(usenativevariables ? "PKG_CONFIG_SYSROOT_DIR" + : "OSXCROSS_PKG_CONFIG_SYSROOT_DIR", + MacPortsSysRoot); + std::string MacPortsPkgConfigPath; if (target.getMacPortsPkgConfigDir(MacPortsPkgConfigPath)) - concatEnvVariable("OSXCROSS_PKG_CONFIG_PATH", MacPortsPkgConfigPath); + concatEnvVariable(usenativevariables ? "PKG_CONFIG_PATH" + : "OSXCROSS_PKG_CONFIG_PATH", + MacPortsPkgConfigPath); } } else { unsetenv("OSXCROSS_PKG_CONFIG_NO_MP_INC"); } - // Map OSXCROSS_PKG_* to PKG_*. - for (char **env = environ; *env; ++env) { - char *p = *env; + if (!usenativevariables) { + // Map OSXCROSS_PKG_* to PKG_*. + for (char **env = environ; *env; ++env) { + char *p = *env; - if (!strncmp(p, "OSXCROSS_PKG_CONFIG", 19)) { - p += 9; // skip OSXCROSS_ - envvars.push_back(var(p, evar)); - } else if (!strncmp(p, "PKG_CONFIG", 10)) { - // Unset native pkg-config vars. - unset.push_back(var(p, evar, true)); + if (!strncmp(p, "OSXCROSS_PKG_CONFIG", 19)) { + p += 9; // skip OSXCROSS_ + envvars.push_back(var(p, evar)); + } else if (!strncmp(p, "PKG_CONFIG", 10)) { + // Unset native pkg-config vars. + unset.push_back(var(p, evar, true)); + } } } - if (!envvars.empty()) { - for (const envvar &evar : unset) - unsetenv(evar.name.c_str()); + if (usenativevariables || !envvars.empty()) { + if (!usenativevariables) { + for (const envvar &evar : unset) { + warn << argv[0] << ": ignoring environment variable '" << evar.name + << "' - please see README.PKG-CONFIG.md for more" << warn.endl(); - for (const envvar &evar : envvars) - setenv(evar.name.c_str(), evar.value.c_str(), 1); + unsetenv(evar.name.c_str()); + } + + for (const envvar &evar : envvars) + setenv(evar.name.c_str(), evar.value.c_str(), 1); + } // Prevent pkg-config from looking for *.pc files // in pre-defined search paths, such as /usr. if (!getenv("PKG_CONFIG_LIBDIR")) setenv("PKG_CONFIG_LIBDIR", "", 1); - if (execvp("pkg-config", argv)) - err << "cannot find or execute pkg-config" << err.endl(); + execvp("pkg-config", argv); + err << "cannot find or execute pkg-config" << err.endl(); + return 1; } + warn << argv[0] << " is a no-op - please see README.PKG-CONFIG.md for more" + << warn.endl(); + return 1; }