int main(int argc, char *argv[]) { char exec_path[PATH_MAX]; char link_path[PATH_MAX]; uint32_t exec_path_size = sizeof(exec_path); char *compiler_path = exec_path; char *lastslash; int link = 1; int inputs = 0; int verbose = 0; int m_32_64_set = 0; /* Find the path to this executable. */ if (_NSGetExecutablePath(exec_path, &exec_path_size)) memcpy(exec_path, "/usr/bin/c99", sizeof("/usr/bin/c99")); if (realpath(exec_path, link_path)) compiler_path = link_path; /* Chop off c99 and replace it with clang. */ lastslash = strrchr(compiler_path, '/'); if (!lastslash) err(EX_OSERR, "unexpected path name: %s", compiler_path); strcpy(lastslash+1, "clang"); addarg(compiler_path); addarg("-std=iso9899:1999"); addarg("-pedantic"); addarg("-Wextra-tokens"); /* Radar 4205857 */ addarg("-Wno-error=return-type"); /* Radar 13535926 */ addarg("-Wstatic-in-inline"); /* Radar 12866627 */ addarg("-Wignored-qualifiers"); /* Radar 13535742 */ addarg("-fmath-errno"); /* Radar 4011622 */ addarg("-fno-blocks"); /* Radar 13118788 */ for (;;) { int ch = getopt(argc, argv, "cD:EgI:L:o:O:sU:W:l:"); if (optind >= argc && ch == -1) break; switch (ch) { case 'c': addarg ("-c"); link = 0; break; case 'D': add_def (optarg); break; case 'E': addarg ("-E"); link = 0; break; case 'g': addarg ("-g"); break; case 'I': combine_and_addarg ("-I", optarg); break; case 'L': combine_and_addarg ("-L", optarg); break; case 'o': addarg ("-o"); addarg (optarg); break; case 'O': combine_and_addarg ("-O", optarg); break; case 's': addarg ("-s"); break; case 'U': record_undef (optarg); combine_and_addarg ("-U", optarg); break; case 'W': if (strcmp (optarg, "32") == 0) { addarg ("-m32"); m_32_64_set = 1; } else if (strcmp (optarg, "64") == 0) { addarg ("-m64"); m_32_64_set = 1; } else if (strcmp (optarg, "verbose") == 0) { addarg ("-v"); verbose = 1; } else errx(EX_USAGE, "invalid argument `%s' to -W", optarg); break; case 'l': addlib (optarg); break; case -1: if (strcmp (argv[optind-1], "--") == 0) { while (optind < argc) { if (argv[optind][0] == '-') combine_and_addarg ("./", argv[optind]); else addarg (argv[optind]); inputs++; optind++; } } else { addarg (argv[optind++]); inputs++; } break; case '?': usage (); break; } } /* If the user didn't set the width, set it from the current host architecture. */ #ifdef __LP64__ if (!m_32_64_set) addarg("-m64"); #else if (!m_32_64_set) addarg("-m32"); #endif if (link && inputs > 0) { addarg("-liconv"); } if (verbose) { int i; for (i = 0; args[i]; i++) printf ("\"%s\" ", args[i]); putchar ('\n'); } /* Exec clang. */ execv(compiler_path, args); err(EX_OSERR, "failed to exec compiler %s", compiler_path); }
int main(int argc, char *argv[]) { int ch, i; args = NULL; cargs = nargs = 0; while ((ch = getopt(argc, argv, "cD:EgI:L:o:O:sU:l:")) != -1) { if (ch == 'l') { /* Gone too far. Back up and get out. */ if (argv[optind - 1][0] == '-') optind -= 1; else optind -= 2; break; } else if (ch == '?') usage(); } addarg("cc"); addarg("-std=iso9899:1990"); addarg("-pedantic"); addarg("-m32"); for (i = 1; i < optind; i++) { /* "--" indicates end of options. Radar 3761967. */ if (strcmp (argv[i], "--") == 0) dash_dash_seen = 1; /* White space is OK between -O and 1 or 2. Radar 3762315. */ else if (strcmp (argv[i], "-O") == 0) { if (i+1 < argc) { if (strcmp (argv[i+1], "1") == 0 || strcmp (argv[i+1], "0") == 0) { combine_and_addarg(argv[i], argv[i+1]); i++; } else addarg(argv[i]); } } else if (strcmp (argv[i], "-U") == 0) { /* Record undefined macros. */ record_undef (argv[i+1]); addarg(argv[i]); addarg(argv[i+1]); i++; } else if (strncmp (argv[i], "-U", 2) == 0) { /* Record undefined macros. */ record_undef (argv[i]+2); addarg(argv[i]); } else if (strcmp (argv[i], "-L") == 0 && i+1 < argc) { combine_and_addarg(argv[i], argv[i+1]); i++; } else if (strcmp (argv[i], "-D") == 0) { add_def (argv[i+1]); i++; } else if (strncmp (argv[i], "-D", 2) == 0) add_def (argv[i]+2); else addarg(argv[i]); } while (i < argc) { if (strncmp(argv[i], "-l", 2) == 0) { if (argv[i][2] != '\0') addlib(argv[i++] + 2); else { if (argv[++i] == NULL) usage(); addlib(argv[i++]); } } else if (strcmp (argv[i], "-L") == 0 && i+1 < argc) { combine_and_addarg(argv[i], argv[i+1]); i+=2; } else if (strcmp (argv[i], "--") == 0) { dash_dash_seen = 1; } else addarg(argv[i++]); } execv("/usr/bin/cc", args); err(1, "/usr/bin/cc"); }