From 958f597a6c68e52e3289a3ceccdaa5eeb2fcea15 Mon Sep 17 00:00:00 2001 From: Oliver Smith Date: Wed, 3 Apr 2019 20:45:16 +0200 Subject: [PATCH] cross/crossdirect: use ccache, execve, -Werror (!299) Instead of running compilers directly, let them go through the native ccache binary. Note that it will still use the foreign arches cache dir because the native cache dir would be at /native/home/pmos/.ccache. Use execve instead of setenv and execv, because that didn't work with LD_LIBRARY_PATH (ccache was complaining that it couldn't load zlib). Enable -Werror, because we are maintaining this program and it helps us catching bugs early. --- cross/crossdirect/APKBUILD | 12 +++++++++--- cross/crossdirect/crossdirect.c | 16 +++++++++++----- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/cross/crossdirect/APKBUILD b/cross/crossdirect/APKBUILD index 1cd2ba968..a0d4cf4ff 100644 --- a/cross/crossdirect/APKBUILD +++ b/cross/crossdirect/APKBUILD @@ -13,7 +13,7 @@ # implementation details (llvm, fakeroot, rpath). pkgname=crossdirect -pkgver=1 +pkgver=2 pkgrel=0 pkgdesc="Wrappers to launch native cross compilers in foreign chroots" url="https://postmarketOS.org" @@ -29,7 +29,13 @@ build() { for _arch in $_archs; do [ "$_arch" == "$CARCH" ] && continue _hostspec="$(arch_to_hostspec $_arch)" - $CC -o "crossdirect-$_arch" -static -DHOSTSPEC="\"$_hostspec\"" \ + + # Build with -Werror, because we maintain this short program. (If + # upstream is elsewhere, having -Werror is usually not desired.) + $CC -o "crossdirect-$_arch" \ + -static \ + -Werror \ + -DHOSTSPEC="\"$_hostspec\"" \ crossdirect.c done } @@ -57,4 +63,4 @@ package() { done done } -sha512sums="12801031928103bd898a0d54a5c68b33da9bded10a3d145fdf5ce8b70eb0bbbcdd50764279004b6997d85d710fa581dc8b05aa5e0eb62d50c1054cc6d66db87f crossdirect.c" +sha512sums="6a94a2e0842c95b8ca862b71a7b54f280d0fe9da40fe40691628ef6089a995159c1b53513fb006589af064110a9d2592b24c772264c02d27e7bac9871428f757 crossdirect.c" diff --git a/cross/crossdirect/crossdirect.c b/cross/crossdirect/crossdirect.c index 5cff6cccb..319e11fca 100644 --- a/cross/crossdirect/crossdirect.c +++ b/cross/crossdirect/crossdirect.c @@ -9,6 +9,8 @@ #include #include +#define NATIVE_BIN_DIR "/native/usr/lib/ccache/bin" + void exit_userfriendly() { fprintf(stderr, "Please report this at: https://gitlab.com/postmarketOS/pmaports/issues\n"); fprintf(stderr, "As a workaround, you can compile without crossdirect.\n"); @@ -25,9 +27,9 @@ int main(int argc, char** argv) { bool startsWithHostSpec = (strncmp(HOSTSPEC, executableName, sizeof(HOSTSPEC) -1) == 0); if (isClang || startsWithHostSpec) { - snprintf(newExecutable, sizeof(newExecutable), "/native/usr/bin/%s", executableName); + snprintf(newExecutable, sizeof(newExecutable), NATIVE_BIN_DIR "/%s", executableName); } else { - snprintf(newExecutable, sizeof(newExecutable), "/native/usr/bin/" HOSTSPEC "-%s", executableName); + snprintf(newExecutable, sizeof(newExecutable), NATIVE_BIN_DIR "/" HOSTSPEC "-%s", executableName); } char** newArgsPtr = newargv; @@ -58,19 +60,23 @@ int main(int argc, char** argv) { *newArgsPtr = NULL; // new arguments prepared; now setup environmental vars - setenv("LD_LIBRARY_PATH", "/native/lib:/native/usr/lib", true); + char* env[] = {"LD_PRELOAD=", + "LD_LIBRARY_PATH=/native/lib:/native/usr/lib", + "CCACHE_PATH=/native/usr/bin", + NULL}; char* ldPreload = getenv("LD_PRELOAD"); if (ldPreload) { if (strcmp(ldPreload, "/usr/lib/libfakeroot.so") == 0) { - setenv("LD_PRELOAD", "/native/usr/lib/libfakeroot.so", true); + env[0] = "LD_PRELOAD=/native/usr/lib/libfakeroot.so"; } else { fprintf(stderr, "ERROR: crossdirect: can't handle LD_PRELOAD: %s\n", ldPreload); exit_userfriendly(); } } - if (execv(newExecutable, newargv) == -1) { + if (execve(newExecutable, newargv, env) == -1) { fprintf(stderr, "ERROR: crossdirect: failed to execute %s: %s\n", newExecutable, strerror(errno)); + fprintf(stderr, "Maybe the target arch is missing in the ccache-cross-symlinks package?\n"); exit_userfriendly(); } return 1;