kumquat-buildroot/toolchain/toolchain-external/ext-toolchain-wrapper.c
Thomas Petazzoni b95e436ee0 Expand external toolchain wrapper to custom flags
The BR2_TARGET_OPTIMIZATION flags were not used by the external
toolchain wrapper, which broke the multilib selection logic of
multilib external toolchains. It also simplifies the compilation of
external programs since all flags are properly passed automatically by
the toolchain wrapper.

Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
2012-03-01 20:26:37 +01:00

91 lines
1.8 KiB
C

/**
* 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>
* (C) 2011 Daniel Nyström <daniel.nystrom@timeterminal.se>
*
* 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>
#include <stdlib.h>
static char path[PATH_MAX] = BR_CROSS_PATH;
static char *predef_args[] = {
path,
"--sysroot", BR_SYSROOT,
#ifdef BR_ARCH
"-march=" BR_ARCH,
#endif /* BR_ARCH */
#ifdef BR_TUNE
"-mtune=" BR_TUNE,
#endif /* BR_TUNE */
#ifdef BR_CPU
"-mcpu=" BR_CPU,
#endif
#ifdef BR_ABI
"-mabi=" BR_ABI,
#endif
#ifdef BR_SOFTFLOAT
"-msoft-float",
#endif /* BR_SOFTFLOAT */
#ifdef BR_VFPFLOAT
"-mfpu=vfp",
#endif /* BR_VFPFLOAT */
#ifdef BR_ADDITIONAL_CFLAGS
BR_ADDITIONAL_CFLAGS
#endif
};
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)
{
char **args, **cur;
cur = args = malloc(sizeof(predef_args) + (sizeof(char *) * argc));
if (args == NULL) {
perror(__FILE__ ": malloc");
return 2;
}
/* start with predefined args */
memcpy(cur, predef_args, sizeof(predef_args));
cur += sizeof(predef_args) / sizeof(predef_args[0]);
/* append forward args */
memcpy(cur, &argv[1], sizeof(char *) * (argc - 1));
cur += argc - 1;
/* finish with NULL termination */
*cur = NULL;
strcat(path, get_basename(argv[0]));
if (execv(path, args))
perror(path);
free(args);
return 2;
}