lazarus/components/aggpas/find_compilers_linux.dpr
mattias 36a2b1ea07 added aggpas
git-svn-id: trunk@21942 -
2009-10-01 12:24:32 +00:00

489 lines
7.9 KiB
ObjectPascal

{target:linux}
{linux_console_app}
//
// AggPas 2.4 RM3 Helper utility application
// Milan Marusinec alias Milano (c) 2006 - 2008
//
program
find_compilers_linux ;
uses
SysUtils ,
agg_basics ,
file_utils_ ,
libc ;
{$I agg_mode.inc }
{$- }
type
src_key = record
key ,
val : string[99 ];
end;
const
key_max = 99;
pool_max = 65536;
make_max = 99;
fpc_comp = 'ppc386';
fpc_libs = '-Fu"src;src/ctrl;src/platform/linux;src/util;src/svg;expat-wrap"';
fpc_incl = '-Fisrc';
fpc_outd = '-FU_debug';
fpc_conf = '-Mdelphi -Tlinux -Sg -Se3 -XX -Xs -B -v0i';
fpc_gapp = '-WG';
fpc_capp = '-WC';
var
key_array : array[0..key_max - 1 ] of src_key;
key_count ,
key_lastx : unsigned;
key_scanx : shortstring;
pool_buff : pointer;
pool_aloc ,
pool_size : unsigned;
make_array : array[0..make_max - 1 ] of string[99 ];
make_count : unsigned;
{ WRPOOL }
procedure WrPool(str : shortstring; crlf : boolean = false );
begin
if crlf then
str:=str + #10;
if pool_size + length(str ) < pool_aloc then
begin
System.move(
str[1 ] ,
pointer(ptrcomp(pool_buff ) + pool_size )^ ,
length(str ) );
inc(pool_size ,length(str ) );
end;
end;
{ WRFILE }
function WrFile(fname : shortstring ) : boolean;
var
df : file;
wr : int;
begin
result:=false;
AssignFile(df ,fname );
rewrite (df ,1 );
if IOResult = 0 then
begin
blockwrite(df ,pool_buff^ ,pool_size ,wr );
close (df );
fname:=fname + #0;
libc.chmod(
PChar(@fname[1 ] ) ,
S_IRWXU or S_IRWXG or S_IROTH or S_IWOTH );
if pool_size = wr then
result:=true;
end;
end;
{ NEXTKEY }
function NextKey(var val : shortstring ) : boolean;
begin
result:=false;
while key_lastx < key_count do
begin
inc(key_lastx );
if cmp_str(key_array[key_lastx - 1 ].key ) = key_scanx then
begin
val :=key_array[key_lastx - 1 ].val;
result:=true;
break;
end;
end;
end;
{ FIRSTKEY }
function FirstKey(key : shortstring; var val : shortstring ) : boolean;
begin
key_lastx:=0;
key_scanx:=cmp_str(key );
result:=NextKey(val );
end;
{ LOADKEYS }
procedure LoadKeys(buff : char_ptr; size : int );
type
e_scan = (expect_lp ,load_key ,load_val ,next_ln ,expect_crlf );
var
scan : e_scan;
key ,
val : shortstring;
procedure add_key;
begin
if key_count < key_max then
begin
key_array[key_count ].key:=key;
key_array[key_count ].val:=val;
inc(key_count );
end;
key:='';
val:='';
end;
begin
key_count:=0;
scan:=expect_lp;
key :='';
val :='';
while size > 0 do
begin
case scan of
expect_lp :
case buff^ of
'{' :
scan:=load_key;
else
break;
end;
load_key :
case buff^ of
#13 ,#10 :
break;
':' :
scan:=load_val;
'}' :
begin
add_key;
scan:=next_ln;
end;
else
key:=key + buff^;
end;
load_val :
case buff^ of
#13 ,#10 :
break;
'}' :
begin
add_key;
scan:=next_ln;
end;
else
val:=val + buff^;
end;
next_ln :
case buff^ of
#13 ,#10 :
scan:=expect_crlf;
' ' :
else
break;
end;
expect_crlf :
case buff^ of
'{' :
scan:=load_key;
#13 ,#10 :
else
break;
end;
end;
dec(size );
inc(ptrcomp(buff ) );
end;
end;
{ WRITECOMPILESCRIPT }
function WriteCompileScript(name ,ext : shortstring ) : boolean;
var
cp : shortstring;
begin
result:=false;
// Create the script in memory
pool_size:=0;
WrPool(fpc_comp + ' ' );
WrPool(fpc_libs + ' ' );
WrPool(fpc_incl + ' ' );
WrPool(fpc_outd + ' ' );
WrPool(fpc_conf + ' ' );
if FirstKey('linux_console_app' ,cp ) then
WrPool(fpc_capp + ' ' )
else
WrPool(fpc_gapp + ' ' );
WrPool(name + ext ,true );
// WriteFile
name:='compile-' + name;
if WrFile(name ) then
begin
if make_count < make_max then
begin
make_array[make_count ]:=name;
inc(make_count );
end;
result:=true;
end;
end;
{ CREATECOMPILESCRIPT }
procedure CreateCompileScript(name ,ext : shortstring );
var
loaded : boolean;
target ,value : shortstring;
lf : file;
fs ,
ls : int;
bf : pointer;
begin
write(' ' ,name ,ext ,' ... ' );
// Open Source .DPR file
AssignFile(lf ,name + ext );
reset (lf ,1 );
if IOResult = 0 then
begin
loaded:=false;
// Load DPR keys
fs:=filesize(lf );
if (fs > 0 ) and
agg_getmem(bf ,fs ) then
begin
blockread(lf ,bf^ ,fs ,ls );
if fs = ls then
begin
loaded:=true;
LoadKeys(bf ,fs );
end;
agg_freemem(bf ,fs );
end;
// Close DPR
close(lf );
// Create compilation script
if loaded then
begin
if FirstKey('skip' ,value ) then
writeln('to be not included -> skipped' )
else
begin
target:='linux';
FirstKey('target' ,target );
if cmp_str(target ) = cmp_str('linux' ) then
if WriteCompileScript(name ,ext ) then
writeln('OK' )
else
writeln('Failed to generate compile script !' )
else
writeln('different target (' ,target ,') -> skipped' );
end;
end
else
writeln('Failed to read the source file !' );
end
else
writeln('Failed to open !' );
end;
{ PROCESSOBJECT }
procedure ProcessObject(found : shortstring );
var
file_path ,file_name ,file_ext : shortstring;
begin
spread_name(found ,file_path ,file_name ,file_ext );
if cmp_str(file_ext ) = cmp_str('.dpr' ) then
CreateCompileScript(file_name ,file_ext );
end;
{ ITERATEFOLDER }
procedure IterateFolder(inFolder : shortstring );
var
dp : libc.PDIR;
ep : libc.Pdirent;
begin
inFolder:=inFolder + #0;
dp:=libc.opendir(PChar(@inFolder[1 ] ) );
if dp <> NIL then
begin
repeat
ep:=libc.readdir(dp );
if ep <> NIL then
ProcessObject(strpas(ep.d_name ) );
until ep = NIL;
libc.closedir(dp );
end;
end;
{ CREATEMAKEFILE }
procedure CreateMakeFile;
var
i : unsigned;
begin
pool_size:=0;
i:=0;
while i < make_count do
begin
WrPool('./' + make_array[i ] ,true );
inc(i );
end;
WrFile('compile_make_all' );
end;
{ SCANDEMOS }
procedure ScanDemos;
begin
IterateFolder('./' );
writeln;
if make_count > 0 then
begin
CreateMakeFile;
writeln('SUCCESS: FPC compilation script files were created' );
writeln(' for the AggPas demos listed above.' );
writeln;
writeln(' To compile the demos, run Terminal, change to the current' );
writeln(' directory and type "./compile_make_all"' );
writeln(' or "./compile-xxx", where "xxx" is the name of the demo.' );
end
else
writeln('MESSAGE: No AggPas demo files were found in current folder !' );
writeln;
end;
BEGIN
writeln;
writeln('*************************************************************' );
writeln('* Welcome to the AggPas 2.4 RM3 vector graphics library. *' );
writeln('*************************************************************' );
writeln('* *' );
writeln('* This helper utility will generate the compilation script *' );
writeln('* files with current paths and options needed to compile *' );
writeln('* properly all the AggPas demos on your Linux station. *' );
writeln('* *' );
writeln('* Currently the Free Pascal compiler is supported. *' );
writeln('* (www.freepascal.org) *' );
writeln('* *' );
writeln('*************************************************************' );
writeln;
writeln('[Press ENTER key to continue ...]' );
writeln;
readln;
if agg_getmem(pool_buff ,pool_max ) then
begin
pool_aloc :=pool_max;
pool_size :=0;
make_count:=0;
ScanDemos;
agg_freemem(pool_buff ,pool_aloc );
end
else
writeln('ERROR: Not enough memory for the pool buffer !' );
END.