|
@@ -27,8 +27,52 @@ uses
|
|
|
const
|
|
|
Version = '1.0';
|
|
|
|
|
|
+
|
|
|
+Procedure Usage;
|
|
|
+
|
|
|
+begin
|
|
|
+ writeln('instantfpc '+Version);
|
|
|
+ writeln;
|
|
|
+ writeln('instantfpc -h');
|
|
|
+ writeln(' This help message.');
|
|
|
+ writeln;
|
|
|
+ writeln('instantfpc -v');
|
|
|
+ writeln(' Print version and exit.');
|
|
|
+ writeln;
|
|
|
+ writeln('instantfpc [compiler options] <source file> [program parameters]');
|
|
|
+ writeln(' Compiles source and runs program.');
|
|
|
+ writeln(' Source is compared with the cache. If cache is not valid then');
|
|
|
+ writeln(' source is copied to cache with the shebang line commented and');
|
|
|
+ writeln(' cached source is compiled.');
|
|
|
+ writeln(' If compilation fails the fpc output is written to stdout and');
|
|
|
+ writeln(' instantfpc exits with error code 1.');
|
|
|
+ writeln(' If compilation was successful the program is executed.');
|
|
|
+ writeln(' If the compiler options contains -B the program is always');
|
|
|
+ writeln(' compiled.');
|
|
|
+ writeln;
|
|
|
+ writeln('instantfpc --get-cache');
|
|
|
+ writeln(' Prints cache directory to stdout.');
|
|
|
+ writeln;
|
|
|
+ writeln('instantfpc --set-cache=<path to cache>');
|
|
|
+ writeln(' Set the cache to be used.');
|
|
|
+ writeln;
|
|
|
+ writeln('instantfpc --compiler=<path to compiler>');
|
|
|
+ writeln(' Normally fpc is searched in PATH and used as compiler.');
|
|
|
+ writeln;
|
|
|
+ writeln('Normal usage is to add as first line ("shebang") "#!/usr/bin/instantfpc"');
|
|
|
+ writeln('to a program source file. Then you can execute the source like a script.');
|
|
|
+ Halt(0);
|
|
|
+end;
|
|
|
+
|
|
|
+Procedure DisplayCache;
|
|
|
+
|
|
|
+begin
|
|
|
+ write(GetCacheDir);
|
|
|
+ Halt(0);
|
|
|
+end ;
|
|
|
+
|
|
|
var
|
|
|
- i: Integer;
|
|
|
+ i,j: Integer;
|
|
|
p: String;
|
|
|
Filename: String;
|
|
|
Src: TStringList;
|
|
@@ -38,65 +82,78 @@ var
|
|
|
ExeExt: String;
|
|
|
E : String;
|
|
|
|
|
|
+// Return true if filename found.
|
|
|
+
|
|
|
+Function InterpretParam(p : String) : boolean;
|
|
|
+
|
|
|
+begin
|
|
|
+ Result:=False;
|
|
|
+ if (P='') then exit;
|
|
|
+ if p='-v' then
|
|
|
+ begin
|
|
|
+ writeln('instantfpc '+Version);
|
|
|
+ Halt(1);
|
|
|
+ end
|
|
|
+ else if p='-h' then
|
|
|
+ usage
|
|
|
+ else if p='--get-cache' then
|
|
|
+ DisplayCache
|
|
|
+ else if copy(p,1,11)='--compiler=' then
|
|
|
+ begin
|
|
|
+ delete(P,1,11);
|
|
|
+ SetCompiler(p);
|
|
|
+ end
|
|
|
+ else if copy(p,1,12)='--set-cache=' then
|
|
|
+ begin
|
|
|
+ delete(P,1,12);
|
|
|
+ SetCacheDir(p);
|
|
|
+ end
|
|
|
+ else if (P<>'') and (p[1]<>'-') then
|
|
|
+ begin
|
|
|
+ Filename:=p;
|
|
|
+ Result:=True;
|
|
|
+ end;
|
|
|
+end;
|
|
|
+
|
|
|
begin
|
|
|
Filename:='';
|
|
|
{ For example:
|
|
|
/usr/bin/instantfpc -MObjFpc -Sh ./envvars.pas param1
|
|
|
}
|
|
|
- for i:=1 to Paramcount do begin
|
|
|
+ for i:=1 to Paramcount do
|
|
|
+ begin
|
|
|
p:=ParamStr(i);
|
|
|
- //writeln('Param: ',i,' ',p);
|
|
|
if p='' then
|
|
|
continue
|
|
|
- else if p='-v' then begin
|
|
|
- writeln('instantfpc '+Version);
|
|
|
- Halt(1);
|
|
|
- end
|
|
|
- else if p='-h' then begin
|
|
|
- writeln('instantfpc '+Version);
|
|
|
- writeln;
|
|
|
- writeln('instantfpc -h');
|
|
|
- writeln(' This help message.');
|
|
|
- writeln;
|
|
|
- writeln('instantfpc -v');
|
|
|
- writeln(' Print version and exit.');
|
|
|
- writeln;
|
|
|
- writeln('instantfpc [compiler options] <source file> [program parameters]');
|
|
|
- writeln(' Compiles source and runs program.');
|
|
|
- writeln(' Source is compared with the cache. If cache is not valid then');
|
|
|
- writeln(' source is copied to cache with the shebang line commented and');
|
|
|
- writeln(' cached source is compiled.');
|
|
|
- writeln(' If compilation fails the fpc output is written to stdout and');
|
|
|
- writeln(' instantfpc exits with error code 1.');
|
|
|
- writeln(' If compilation was successful the program is executed.');
|
|
|
- writeln(' If the compiler options contains -B the program is always');
|
|
|
- writeln(' compiled.');
|
|
|
- writeln;
|
|
|
- writeln('instantfpc --get-cache');
|
|
|
- writeln(' Prints cache directory to stdout.');
|
|
|
- writeln;
|
|
|
- writeln('instantfpc --compiler=<path to compiler>');
|
|
|
- writeln(' Normally fpc is searched in PATH and used as compiler.');
|
|
|
- writeln;
|
|
|
- writeln('Normal usage is to add as first line ("shebang") "#!/usr/bin/instantfpc"');
|
|
|
- writeln('to a program source file. Then you can execute the source like a script.');
|
|
|
- Halt(0);
|
|
|
- end else if p='--get-cache' then begin
|
|
|
- CacheDir:=GetCacheDir;
|
|
|
- write(CacheDir);
|
|
|
- Halt(0);
|
|
|
- end else if (p[1]<>'-') then begin
|
|
|
- // the first non flag parameter is the file name of the script
|
|
|
- // followed by the parameters for the script
|
|
|
- Filename:=p;
|
|
|
- break;
|
|
|
- end;
|
|
|
+ else
|
|
|
+ begin
|
|
|
+ if (I<>1) then
|
|
|
+ begin
|
|
|
+ if InterpretParam(p) then
|
|
|
+ Break;
|
|
|
+ end
|
|
|
+ else
|
|
|
+ begin
|
|
|
+ // The linux kernel passes the whole shebang line as 1 argument.
|
|
|
+ // We must parse and split it ourselves.
|
|
|
+ Repeat
|
|
|
+ J:=Pos(' ',P);
|
|
|
+ if (J=0) then
|
|
|
+ J:=Length(P)+1;
|
|
|
+ if InterpretParam(Copy(P,1,J-1)) then
|
|
|
+ Break;
|
|
|
+ Delete(P,1,J);
|
|
|
+ Until (P='');
|
|
|
+ if (FileName<>'') then
|
|
|
+ Break;
|
|
|
+ end;
|
|
|
+ end;
|
|
|
end;
|
|
|
- if Filename='' then begin
|
|
|
+ if (Filename='') then
|
|
|
+ begin
|
|
|
writeln('missing source file');
|
|
|
Halt(1);
|
|
|
- end;
|
|
|
-
|
|
|
+ end;
|
|
|
CheckSourceName(Filename);
|
|
|
|
|
|
Src:=TStringList.Create;
|