mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-27 10:33:54 +02:00
489 lines
7.9 KiB
ObjectPascal
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. |