diff options
author | Peter Korsgaard <jacmet@sunsite.dk> | 2011-04-29 13:09:26 +0200 |
---|---|---|
committer | Peter Korsgaard <jacmet@sunsite.dk> | 2011-05-05 23:38:58 +0200 |
commit | 85dc57f6fd2755d8f5b193f369dad35796e764c2 (patch) | |
tree | 26b3731d84932c55f4e0fb9c65df01f48242dc1d /toolchain/toolchain-external/ext-toolchain-wrapper.c | |
parent | 6721878972275695e74b4976f9d0779b5cb77e4e (diff) |
Add toolchain wrapper for external toolchains
Add a simple toolchain wrapper for external toolchains, which forces the
correct sysroot/march/mtune/floating point options needed to use it
with buildroot.
With this in place the external toolchain behaves similar to the internal
ones, and the special handling can be removed. This also means that the
toolchain is usable outside buildroot without having to pass any special
compiler flags.
Also adjust the downloadable external toolchain support to install under
HOST_DIR so it can be used after the temporary build files are removed.
Signed-off-by: Peter Korsgaard <jacmet@sunsite.dk>
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; +} |