summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--etc/patches/wrapper.c55
-rw-r--r--src/bootstrap/stage-0-busybox.TARGETS2
-rw-r--r--src/bootstrap/stage-0-gcc.TARGETS87
3 files changed, 103 insertions, 41 deletions
diff --git a/etc/patches/wrapper.c b/etc/patches/wrapper.c
index ca4f4b1..727bd0c 100644
--- a/etc/patches/wrapper.c
+++ b/etc/patches/wrapper.c
@@ -6,25 +6,45 @@
int main(int argc, char** argv) {
#include "toolname.h"
#include "link_args.h"
- char *s, *path, *newpath, *prgdir, *cwd, **newargv, *tool;
- size_t size, s_s, s_cwd, s_prgdir, s_path, s_toolname;
+ char *s, *path, *newpath, *prgdir, *cwd, **newargv, *tool, *tmp;
+ size_t size, s_s, s_cwd, s_prgdir, s_path, s_toolname, s_tmp;
int i;
for (link_args_c =0; link_args[link_args_c] != NULL; link_args_c++) {}
- if ((prgdir=strdup(argv[0])) == NULL) {
+ if ((tmp=strdup(argv[0])) == NULL) {
return 66;
}
- s = strrchr(prgdir, '/');
+ s = strrchr(tmp, '/');
if (s == NULL) {
- prgdir = getenv("CC_REAL_DIRECTORY");
- if (prgdir == NULL) {
- prgdir = ".";
+ s = getenv("CC_DIR");
+ if (s == NULL) {
+ s = getenv("CC");
}
- } else {
+ if (s == NULL) {
+ s = getenv("CXX");
+ }
+ if (s != NULL) {
+ if ((tmp=strdup(s)) == NULL) {
+ return 66;
+ }
+ s = strrchr(tmp, '/');
+ }
+ }
+ if (s != NULL) {
*s = '\0';
+ s_tmp = strlen(tmp);
+ if ((prgdir=(char*)malloc(s_tmp + 1 + strlen(dir_offset) + 1)) == NULL) {
+ return 66;
+ }
+ strcpy(prgdir, tmp);
+ strcpy(&prgdir[s_tmp], "/");
+ strcpy(&prgdir[s_tmp+1], dir_offset);
+ } else {
+ prgdir = dir_offset; /* last resort */
}
+ cwd = ".";
if (*prgdir != '/') {
/* called by non-absolute path, need to prefix with cwd */
for (size = 1024;; size *= 2) {
@@ -50,7 +70,7 @@ int main(int argc, char** argv) {
strcpy(&prgdir[s_cwd+1], s);
}
- /* prgdir is now our best guess for the directory argv[0] is located in */
+ /* prgdir is now our best guess for the directory the real program is located in */
path = getenv("PATH");
if (path == NULL) {
path = prgdir;
@@ -70,14 +90,6 @@ int main(int argc, char** argv) {
if ((newargv=(char**)malloc((argc + link_args_c + 1)*sizeof(char*)))==NULL) {
return 66;
}
- for (i=0; i<argc; i++) {
- newargv[i] = argv[i];
- }
- for (i=0; i < link_args_c; i++) {
- newargv[argc+i] = link_args[i];
- }
- newargv[argc+link_args_c] = NULL;
-
s_prgdir = strlen(prgdir);
s_toolname = strlen(toolname);
if ((tool=(char*)malloc(s_prgdir+1+s_toolname+1))==NULL) {
@@ -87,6 +99,15 @@ int main(int argc, char** argv) {
strcpy(&tool[s_prgdir], "/");
strcpy(&tool[s_prgdir+1], toolname);
+ newargv[0] = tool;
+ for (i=1; i<argc; i++) {
+ newargv[i] = argv[i];
+ }
+ for (i=0; i < link_args_c; i++) {
+ newargv[argc+i] = link_args[i];
+ }
+ newargv[argc+link_args_c] = NULL;
+
execv(tool, newargv);
return 65; /* exec failed */
diff --git a/src/bootstrap/stage-0-busybox.TARGETS b/src/bootstrap/stage-0-busybox.TARGETS
index ee2133c..09fb1bd 100644
--- a/src/bootstrap/stage-0-busybox.TARGETS
+++ b/src/bootstrap/stage-0-busybox.TARGETS
@@ -585,8 +585,8 @@
, "cmds":
[ "export NJOBS=$(nproc --all 2>/dev/null || echo 1)"
, "export PATH=${LOCALBASE}/bin:${LOCALBASE}/gcc/bin:$PATH"
- , "export CC_REAL_DIRECTORY=${LOCALBASE}/gcc/bin"
, "export MAKE=${LOCALBASE}/bin/make"
+ , "export CC_DIR=${LOCALBASE}/gcc/bin/"
, "export CC=${LOCALBASE}/gcc/bin/gcc"
, "export CXX=${LOCALBASE}/gcc/bin/g++"
, "unset CFLAGS LDFLAGS"
diff --git a/src/bootstrap/stage-0-gcc.TARGETS b/src/bootstrap/stage-0-gcc.TARGETS
index 278cfe9..26fbfa3 100644
--- a/src/bootstrap/stage-0-gcc.TARGETS
+++ b/src/bootstrap/stage-0-gcc.TARGETS
@@ -160,14 +160,12 @@
, "mv ${GCC_LIBDIR}/include-fixed ${TMPDIR}/"
, "cp -rL ${TMPDIR}/include-fixed ${GCC_LIBDIR}/. # resolve symlinks"
, "cd ${DESTDIR}/bin"
- , "mv gcc gcc.real"
- , "mv g++ g++.real"
]
, "out_dirs": ["."]
}
, "link_args.h":
{ "type": "file_gen"
- , "arguments_config": ["TOOLCHAIN_CONFIG"]
+ , "arguments_config": ["TOOLCHAIN_CONFIG", "USE_LINK_ARGS"]
, "name": "link_args.h"
, "data":
{ "type": "let*"
@@ -184,7 +182,13 @@
]
, [ "link_args"
, { "type": "if"
- , "cond": {"type": "var", "name": "system_lib_dir"}
+ , "cond":
+ { "type": "and"
+ , "$1":
+ [ {"type": "var", "name": "system_lib_dir"}
+ , {"type": "var", "name": "USE_LINK_ARGS"}
+ ]
+ }
, "then":
[ { "type": "join"
, "$1": ["-B", {"type": "var", "name": "system_lib_dir"}]
@@ -244,15 +248,13 @@
{ "type": "join"
, "$1":
[ "char *toolname = "
- , { "type": "json_encode"
- , "$1":
- {"type": "join", "$1": [{"type": "var", "name": "TOOL"}, ".real"]}
- }
+ , {"type": "json_encode", "$1": {"type": "var", "name": "TOOL"}}
, ";\n"
+ , "char *dir_offset = \"../__real/bin\";\n"
]
}
}
-, "wrapper":
+, "wrapper (real)":
{ "type": ["@", "rules", "CC", "binary"]
, "arguments_config": ["TOOL"]
, "pure C": [""]
@@ -262,25 +264,64 @@
}
, "gcc":
{ "type": "configure"
- , "target": "wrapper"
- , "config": {"type": "singleton_map", "key": "TOOL", "value": "gcc"}
+ , "target": "wrapper (real)"
+ , "config":
+ { "type": "let*"
+ , "bindings": [["TOOL", "gcc"], ["USE_LINK_ARGS", true]]
+ , "body": {"type": "env", "vars": ["TOOL", "USE_LINK_ARGS"]}
+ }
}
, "g++":
{ "type": "configure"
- , "target": "wrapper"
- , "config": {"type": "singleton_map", "key": "TOOL", "value": "g++"}
+ , "target": "wrapper (real)"
+ , "config":
+ { "type": "let*"
+ , "bindings": [["TOOL", "g++"], ["USE_LINK_ARGS", true]]
+ , "body": {"type": "env", "vars": ["TOOL", "USE_LINK_ARGS"]}
+ }
+ }
+, "ar":
+ { "type": "configure"
+ , "target": "wrapper (real)"
+ , "config":
+ { "type": "let*"
+ , "bindings": [["TOOL", "ar"], ["USE_LINK_ARGS", false]]
+ , "body": {"type": "env", "vars": ["TOOL", "USE_LINK_ARGS"]}
+ }
+ }
+, "ranlib":
+ { "type": "configure"
+ , "target": "wrapper (real)"
+ , "config":
+ { "type": "let*"
+ , "bindings": [["TOOL", "ranlib"], ["USE_LINK_ARGS", false]]
+ , "body": {"type": "env", "vars": ["TOOL", "USE_LINK_ARGS"]}
+ }
+ }
+, "ld":
+ { "type": "configure"
+ , "target": "wrapper (real)"
+ , "config":
+ { "type": "let*"
+ , "bindings": [["TOOL", "ld"], ["USE_LINK_ARGS", false]]
+ , "body": {"type": "env", "vars": ["TOOL", "USE_LINK_ARGS"]}
+ }
+ }
+, "strip":
+ { "type": "configure"
+ , "target": "wrapper (real)"
+ , "config":
+ { "type": "let*"
+ , "bindings": [["TOOL", "strip"], ["USE_LINK_ARGS", false]]
+ , "body": {"type": "env", "vars": ["TOOL", "USE_LINK_ARGS"]}
+ }
}
, "wrappers":
- {"type": "install", "files": {"wrapper/gcc": "gcc", "wrapper/g++": "g++"}}
+ { "type": ["@", "rules", "CC", "install-with-deps"]
+ , "targets": ["gcc", "g++", "ar", "ranlib", "ld", "strip"]
+ }
, "gcc-4.7.4":
- { "type": ["@", "rules", "CC/foreign/shell", "data"]
- , "project": ["gcc-4.7.4 (real)"]
- , "localbase": [["@", "busybox", "", "bootstrap"], "wrappers"]
- , "cmds":
- [ "export PATH=$(pwd)/binutils/bin:${LOCALBASE}/bin:$PATH"
- , "cp -r . ${DESTDIR}"
- , "cp ${LOCALBASE}/wrapper/gcc ${LOCALBASE}/wrapper/g++ ${DESTDIR}/bin"
- ]
- , "out_dirs": ["."]
+ { "type": "install"
+ , "dirs": [["wrappers", "."], ["gcc-4.7.4 (real)", "__real"]]
}
}