* kind, whether express or implied.
static char ccache_path[PATH_MAX];
static char path[PATH_MAX];
static char sysroot[PATH_MAX];
static char source_time[sizeof("-D__TIME__=\"HH:MM:SS\"")];
static char source_date[sizeof("-D__DATE__=\"MMM DD YYYY\"")];
* GCC errors out with certain combinations of arguments (examples are
* -mfloat-abi={hard|soft} and -m{little|big}-endian), so we have to ensure
* that we only pass the predefined one to the real compiler if the inverse
* option isn't in the argument list.
* This specifies the worst case number of extra arguments we might pass
* -Wno-builtin-macro-redefined
static char *predef_args[] = {
program_invocation_short_name,
paranoid ? "ERROR" : "WARNING",
arg_has_path ? "" : "' '", /* close single-quote, space, open single-quote */
arg_has_path ? "" : path); /* so that arg and path are properly quoted. */
/* Read SOURCE_DATE_EPOCH from environment to have a deterministic
* timestamp to replace embedded current dates to get reproducible
* results. Returns -1 if SOURCE_DATE_EPOCH is not defined.
static time_t get_source_date_epoch()
source_date_epoch = getenv("SOURCE_DATE_EPOCH");
epoch = strtoll(source_date_epoch, &endptr, 10);
if ((errno == ERANGE && (epoch == LLONG_MAX || epoch == LLONG_MIN))
|| (errno != 0 && epoch == 0)) {
fprintf(stderr, "environment variable $SOURCE_DATE_EPOCH: "
"strtoll: %s\n", strerror(errno));
if (endptr == source_date_epoch) {
fprintf(stderr, "environment variable $SOURCE_DATE_EPOCH: "
"no digits were found: %s\n", endptr);
fprintf(stderr, "environment variable $SOURCE_DATE_EPOCH: "
"trailing garbage: %s\n", endptr);
fprintf(stderr, "environment variable $SOURCE_DATE_EPOCH: "
"value must be nonnegative: %lld \n", epoch);
int main(int argc, char **argv)
char **args, **cur, **exec_args;
char *relbasedir, *absbasedir;
char *progpath = argv[0];
int ret, i, count = 0, debug;
time_t source_date_epoch;
/* Calculate the relative paths */
basename = strrchr(progpath, '/');
relbasedir = malloc(strlen(progpath) + 7);
if (relbasedir == NULL) {
perror(__FILE__ ": malloc");
*cur++ = "-march=" BR_ARCH;
*cur++ = "-mcpu=" BR_CPU;
source_date_epoch = get_source_date_epoch();
if (source_date_epoch != -1) {
struct tm *tm = localtime(&source_date_epoch);
perror("__FILE__: localtime");
ret = strftime(source_time, sizeof(source_time), "-D__TIME__=\"%T\"", tm);
perror("__FILE__: overflow");
ret = strftime(source_date, sizeof(source_date), "-D__DATE__=\"%b %e %Y\"", tm);
perror("__FILE__: overflow");
*cur++ = "-Wno-builtin-macro-redefined";
paranoid_wrapper = getenv("BR_COMPILER_PARANOID_UNSAFE_PATH");
if (paranoid_wrapper && strlen(paranoid_wrapper) > 0)
/* Check for unsafe library and header paths */
for (i = 1; i < argc; i++) {
const struct str_len_s *opt;
for (opt=unsafe_opts; opt->str; opt++ ) {