diff options
-rw-r--r-- | etc/patches/wrapper.c | 55 | ||||
-rw-r--r-- | src/bootstrap/stage-0-busybox.TARGETS | 2 | ||||
-rw-r--r-- | src/bootstrap/stage-0-gcc.TARGETS | 87 |
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"]] } } |