diff options
Diffstat (limited to 'toolchain/toolchain-external/ext-toolchain-wrapper.c')
-rw-r--r-- | toolchain/toolchain-external/ext-toolchain-wrapper.c | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/toolchain/toolchain-external/ext-toolchain-wrapper.c b/toolchain/toolchain-external/ext-toolchain-wrapper.c new file mode 100644 index 000000000..a485e740d --- /dev/null +++ b/toolchain/toolchain-external/ext-toolchain-wrapper.c @@ -0,0 +1,75 @@ +/** + * Buildroot wrapper for external toolchains. This simply executes the real + * toolchain with a number of arguments (sysroot/arch/..) hardcoded, + * to ensure the external toolchain uses the correct configuration. + * + * (C) 2011 Peter Korsgaard <jacmet@sunsite.dk> + * + * This file is licensed under the terms of the GNU General Public License + * version 2. This program is licensed "as is" without any warranty of any + * kind, whether express or implied. + */ + +#include <stdio.h> +#include <string.h> +#include <limits.h> +#include <unistd.h> + +#define MAXARGS 1000 + +static char path[PATH_MAX] = BR_CROSS_PATH; + +static char *args[MAXARGS] = { + path, + "--sysroot", BR_SYSROOT, +#ifdef BR_ARCH + "-march=" BR_ARCH, +#endif /* BR_ARCH */ +#ifdef BR_TUNE + "-mtune=" BR_TUNE, +#endif /* BR_TUNE */ +#ifdef BR_ABI + "-mabi=" BR_ABI, +#endif +#ifdef BR_SOFTFLOAT + "-msoft-float", +#endif /* BR_SOFTFLOAT */ +#ifdef BR_VFPFLOAT + "-mfpu=vfp", +#endif /* BR_VFPFLOAT */ +}; + +static const char *get_basename(const char *name) +{ + const char *base; + + base = strrchr(name, '/'); + if (base) + base++; + else + base = name; + + return base; +} + +int main(int argc, char **argv) +{ + int i; + + for (i=0; args[i]; i++); + + if ((argc+i) >= MAXARGS) { + fputs("Too many arguments\n", stderr); + return 1; + } + + /* forward args */ + memcpy(&args[i], &argv[1], sizeof(argv[0]) * (argc - 1)); + + strcat(path, get_basename(argv[0])); + + if (execv(path, args)) + perror(path); + + return 2; +} |