8cd443 | 2000-06-28 | Henrik Grubbström (Grubba) | | #!/usr/local/bin/pike
|
47c9b2 | 2000-08-20 | Henrik Grubbström (Grubba) | |
|
e1cc17 | 2000-08-01 | Henrik Grubbström (Grubba) | |
|
8cd443 | 2000-06-28 | Henrik Grubbström (Grubba) | |
inherit "lib.pike";
int verbose=1;
int linking_failed;
string *tmpfiles=({});
void exit(int code)
{
if(getenv("CLEANUP")!="no")
Array.map(tmpfiles,rm);
predef::exit(code);
}
string get_ext(string file)
{
sscanf(file=lower_case(reverse(file)),"%s.",file);
return reverse(file);
}
string remove_ext(string file)
{
sscanf(file=reverse(file),"%*s.%s",file,file);
return reverse(file);
}
|
620d24 | 2000-08-14 | Henrik Grubbström (Grubba) | | string o_to_obj(string fname)
{
|
96f1a8 | 2000-08-14 | Henrik Grubbström (Grubba) | | if (fname[sizeof(fname)-2..] == ".o") {
|
620d24 | 2000-08-14 | Henrik Grubbström (Grubba) | | return fname + "bj";
}
return fname;
}
|
8cd443 | 2000-06-28 | Henrik Grubbström (Grubba) | |
int main(int argc, string *argv)
{
string *ldopts=({"-INCREMENTAL:no"});
string *cflags=({
|
e1cc17 | 2000-08-01 | Henrik Grubbström (Grubba) | | "-Wp64",
"-W3",
|
c4db5e | 2000-08-17 | Henrik Grubbström (Grubba) | |
"-D__WIN64__",
"-D_WIN64",
|
8cd443 | 2000-06-28 | Henrik Grubbström (Grubba) | | "-D__NT__",
"-nologo",
});
string target="exe";
int debug,optimize,share;
string output, wantfile;
mixed *opts=Getopt.find_all_options(argv, aggregate(
({"oper_pre",Getopt.NO_ARG, ({"-E"}) }),
|
52394a | 2000-08-01 | Henrik Grubbström (Grubba) | | ({"oper_asm",Getopt.NO_ARG, ({"-S"}) }),
|
8cd443 | 2000-06-28 | Henrik Grubbström (Grubba) | | ({"oper_comp",Getopt.NO_ARG, ({"-c"}) }),
({"verbose",Getopt.NO_ARG, ({"-v"}) }),
({"debug",Getopt.MAY_HAVE_ARG, ({"-g"}) }),
({"optimize",Getopt.MAY_HAVE_ARG, ({"-O"}) }),
|
47c9b2 | 2000-08-20 | Henrik Grubbström (Grubba) | | ({"inline", Getopt.MAY_HAVE_ARG, ({"-Q"}) }),
|
8cd443 | 2000-06-28 | Henrik Grubbström (Grubba) | | ({"include",Getopt.HAS_ARG, ({"-I"}) }),
({"link",Getopt.HAS_ARG, ({"-l"}) }),
({"share",Getopt.MAY_HAVE_ARG, ({"-s"}) }),
({"ignore",Getopt.MAY_HAVE_ARG, ({"-t"}) }),
({"ignore",Getopt.HAS_ARG, ({"-R","-L","-r"}) }),
({"warn",Getopt.MAY_HAVE_ARG, ({"-W"}) }),
({"define",Getopt.HAS_ARG, ({"-D"}) }),
({"undefine",Getopt.HAS_ARG, ({"-U"})}),
({"output",Getopt.HAS_ARG, ({"-o"}) }),
({"export",Getopt.HAS_ARG, ({"--export"}) })
));
foreach(opts, mixed *option)
{
switch(option[0])
{
case "verbose":
verbose++;
ldopts+=({"-VERBOSE:lib"});
break;
case "export":
break;
case "share":
switch(option[1])
{
case "hare":
share=1;
target="dll";
break;
case "tatic":
break;
}
break;
case "oper_pre":
cflags+=({ "-E" });
target="-";
break;
|
52394a | 2000-08-01 | Henrik Grubbström (Grubba) | | case "oper_asm":
cflags+=({ "-S" });
target="asm";
break;
|
8cd443 | 2000-06-28 | Henrik Grubbström (Grubba) | | case "oper_comp":
target="obj";
cflags+=({ "-c" });
break;
case "debug":
cflags+=({
"-Z7",
"-FR",
});
debug=1;
break;
case "optimize":
if(!option[1]) option[1]=1;
switch(optimize=(int)option[1])
{
case 0: optimize=0; break;
case 1: cflags+=({"-O1"}); break;
case 2: cflags+=({"-O2"}); break;
case 3..:
break;
}
break;
|
47c9b2 | 2000-08-20 | Henrik Grubbström (Grubba) | |
case "inline":
if (option[1] == "ip") {
cflags+=({"-Qip"});
}
break;
|
8cd443 | 2000-06-28 | Henrik Grubbström (Grubba) | |
case "include":
if(sscanf(option[1],"/usr/include/%*s") ||
sscanf(option[1],"/usr/local/%*s"))
break;
cflags+=({"-I"+fixpath(option[1])});
break;
case "link":
if(option[1]=="m" || option[1]=="c") break;
cflags-=({option[1]+".lib"});
cflags+=({option[1]+".lib"});
break;
case "warn":
if(option[1])
{
if(sscanf(option[1],"l,%s",string tmp))
{
if(sscanf(tmp,"-rpath%*s")) break;
cflags+=({tmp});
break;
}
}
switch(option[1])
{
|
47c9b2 | 2000-08-20 | Henrik Grubbström (Grubba) | | case "all": case "4":
cflags+=({"-W4"}); break;
|
8cd443 | 2000-06-28 | Henrik Grubbström (Grubba) | | default: cflags+=({"-W3"}); break;
}
break;
case "define": cflags+=({"-D"+option[1]}); break;
case "undefine": cflags+=({"-U"+option[1]}); break;
case "output":
output=option[1];
break;
}
}
argv=Getopt.get_args(argv);
|
620d24 | 2000-08-14 | Henrik Grubbström (Grubba) | | cflags+=Array.map(Array.map(argv[1..],fixpath), o_to_obj);
|
8cd443 | 2000-06-28 | Henrik Grubbström (Grubba) | |
foreach(argv[1..], string tmp)
{
if(tmp[0]=='-')
{
werror("Unrecognized option "+tmp+".\n");
exit(1);
}
}
switch(target)
{
case "exe":
if(!output) output="a.out";
cflags+=({"-Fe"+fixpath(output)+".exe"});
wantfile=output+".exe";
break;
case "obj":
if(!output)
output=remove_ext(argv[1])+".o";
|
620d24 | 2000-08-14 | Henrik Grubbström (Grubba) | | cflags+=({"-Fo"+fixpath(output+"bj")});
|
8cd443 | 2000-06-28 | Henrik Grubbström (Grubba) | | wantfile=output;
|
52394a | 2000-08-01 | Henrik Grubbström (Grubba) | | break;
case "asm":
if(!output)
output=remove_ext(argv[1])+".s";
cflags+=({"-Fa"+fixpath(output)});
wantfile=output;
|
8cd443 | 2000-06-28 | Henrik Grubbström (Grubba) | | break;
case "dll":
if(output)
cflags+=({"-Fe"+fixpath(output)});
else
output=remove_ext(argv[1])+".dll";
wantfile=output;
break;
case "-":
}
cflags+=({"-MT" + (debug?"d":"") });
if(output) rm(output);
array(string) cmd=({"ecl"})+cflags;
switch(target)
{
case "exe":
case "dll":
if(debug)
{
array libs=({"libc.lib","libcd.lib",
"libcmt.lib","libcmtd.lib",
"msvcrt.lib","msvcrtd.lib"});
string lib=(debug?"libcmtd.lib":"libcmt.lib");
libs-=({ lib });
for(int e=0;e<sizeof(libs);e++)
ldopts+=({"-nodefaultlib:"+libs[e]});
cmd+=({"-link",
"-DEBUGTYPE:BOTH",
"-DEBUG",
})
+ldopts;
}
}
int ret;
|
47c9b2 | 2000-08-20 | Henrik Grubbström (Grubba) | | int first_line=1;
int prototype_error=0;
string trailer = "";
ret = silent_do_cmd(cmd,
lambda(string output)
|
8cd443 | 2000-06-28 | Henrik Grubbström (Grubba) | | {
|
47c9b2 | 2000-08-20 | Henrik Grubbström (Grubba) | | trailer += output;
array(string) lines = trailer/"\n";
if (sizeof(lines) < 2) return;
|
8cd443 | 2000-06-28 | Henrik Grubbström (Grubba) | | if(first_line)
{
|
47c9b2 | 2000-08-20 | Henrik Grubbström (Grubba) | | if (verbose && (target != "-")) {
write(lines[0]+"\n");
}
lines = lines[1..];
first_line = 0;
}
trailer = lines[-1];
lines = lines[..sizeof(lines)-2];
for(int i; i < sizeof(lines); i++) {
if (search(lines[i], "warning #147:") != -1) {
prototype_error = 1;
lines[i] = replace(lines[i],
"warning #147:",
"error #147:");
|
8cd443 | 2000-06-28 | Henrik Grubbström (Grubba) | | }
}
|
47c9b2 | 2000-08-20 | Henrik Grubbström (Grubba) | | write(lines*"\n" + "\n");
}, 1);
if (sizeof(trailer)) {
write(trailer);
|
8cd443 | 2000-06-28 | Henrik Grubbström (Grubba) | | }
|
47c9b2 | 2000-08-20 | Henrik Grubbström (Grubba) | | ret = ret || prototype_error;
|
8cd443 | 2000-06-28 | Henrik Grubbström (Grubba) | |
if(ret)
{
werror("ECL returned error code %d.\n",ret);
exit(ret);
}
if(wantfile)
{
|
620d24 | 2000-08-14 | Henrik Grubbström (Grubba) | | if (target == "obj") {
if(!file_stat(wantfile+"bj"))
{
werror("RNTECL: output file not generated (%s).\n",
wantfile+"bj");
exit(1);
}
rm(wantfile);
hardlink(wantfile+"bj", wantfile);
}
|
8cd443 | 2000-06-28 | Henrik Grubbström (Grubba) | | if(!file_stat(wantfile))
{
werror("RNTECL: output file not generated (%s).\n",wantfile);
exit(1);
}
}
if(target=="exe" && !share)
{
rm(output);
Stdio.write_file(output,
"#!/usr/local/bin/pike\n"
"inherit \""+find_lib_location()+"\";\n"
"int main(int argc, string *argv) {\n"
|
e1cc17 | 2000-08-01 | Henrik Grubbström (Grubba) | | " if (lower_case(getenv(\"CROSSCOMPILING\")||\"no\") != \"no\")\n"
" exit(1);\n"
" argv[0]+=\".exe\";\n"
" argv[0]=getenv(\"NTDRIVE\")+fixpath(combine_path(getcwd(),argv[0]));\n"
|
8cd443 | 2000-06-28 | Henrik Grubbström (Grubba) | | " int ret=silent_do_cmd(argv);\n"
" exit(ret);\n"
"}\n");
chmod(output,0755);
}
exit(ret);
}
|