* Use fpmkunit to obtain gcclib-dir for configuration files

git-svn-id: trunk@24753 -
This commit is contained in:
joost 2013-06-01 22:27:16 +00:00
parent ec76b2cf40
commit 76c1b9da71
2 changed files with 44 additions and 117 deletions

View File

@ -17,13 +17,13 @@
program fpcmkcfg; program fpcmkcfg;
uses uses
fpmkunit,
SysUtils, SysUtils,
Classes, Classes,
{$ifdef unix} {$ifdef unix}
baseunix, baseunix,
{$endif} {$endif}
fpTemplate, fpTemplate;
process;
{ {
The inc files must be built from a template with the data2inc The inc files must be built from a template with the data2inc
@ -168,128 +168,55 @@ end;
function GetDefaultGCCDir: string; function GetDefaultGCCDir: string;
var GccExecutable: string; var
OS: TOS;
CPU: TCPU;
s: string;
function GetGccExecutable: string; procedure AddConditionalLinkerPath(const aCpuType: string; const ACPU: TCPU; var ConfigFileOption: string);
var
path: string;
ErrS: string;
begin begin
if GccExecutable='' then path := GetDefaultLibGCCDir(ACPU, OS, ErrS);
if ErrS<>'' then
Writeln(StdErr, ErrS);
if path <> '' then
begin begin
GccExecutable := ExeSearch('gcc'+ExeExt,GetEnvironmentVariable('PATH')); if ConfigFileOption<>'' then ConfigFileOption:=ConfigFileOption+LineEnding;
if GccExecutable='' then ConfigFileOption := ConfigFileOption + '#ifdef ' + ACpuType + LineEnding + '-Fl' + Path + LineEnding + '#endif';
begin
Writeln(StdErr,SWarngccNotFound);
GccExecutable:='-';
end;
end; end;
if GccExecutable = '-' then
result := ''
else
result := GccExecutable;
end;
function ExecuteProc(const CommandLine: string; ReadStdErr: boolean) : string;
const BufSize=2048;
var S: TProcess;
buf: array[0..BufSize-1] of byte;
count: integer;
begin
result := '';
S:=TProcess.Create(Nil);
try
S.Commandline:=CommandLine;
S.Options:=[poUsePipes,poWaitOnExit];
try
S.execute;
Count:=s.output.read(buf,BufSize);
if (count=0) and ReadStdErr then
Count:=s.Stderr.read(buf,BufSize);
setlength(result,count);
move(buf[0],result[1],count);
except
Writeln(StdErr,Format(SWarnCouldNotExecute,[CommandLine]));
end;
finally
S.Free;
end;
end;
function Get4thWord(const AString: string): string;
var p: pchar;
spacecount: integer;
StartWord: pchar;
begin
if length(AString)>6 then
begin
p := @AString[1];
spacecount:=0;
StartWord:=nil;
while (not (p^ in [#0,#10,#13])) and ((p^<>' ') or (StartWord=nil)) do
begin
if p^=' ' then
begin
inc(spacecount);
if spacecount=3 then StartWord:=p+1;
end;
inc(p);
end;
if StartWord<>nil then
begin
SetLength(result,p-StartWord);
move(StartWord^,result[1],p-StartWord);
end
else
result := '';
end;
end;
function GetGccDirArch(const ACpuType, GCCParams: string) : string;
var ExecResult: string;
libgccFilename: string;
gccDir: string;
begin
if FileExists(GetGccExecutable) then
begin
ExecResult:=ExecuteProc(GetGccExecutable+' -v '+GCCParams, True);
libgccFilename:=Get4thWord(ExecResult);
if libgccFilename='' then
libgccFilename:=ExecuteProc(GetGccExecutable+' --print-libgcc-file-name '+GCCParams, False);
gccDir := ExtractFileDir(libgccFilename);
end
else
gccDir := '';
if gccDir='' then
result := ''
else if ACpuType = '' then
result := '-Fl'+gccDir
else
result := '#ifdef ' + ACpuType + LineEnding + '-Fl' + gccDir + LineEnding + '#endif';
end; end;
begin begin
CPU := StringToCPU(BuildTarget);
OS := StringToOS(BuildOSTarget);
result := ''; result := '';
GccExecutable:='';
if sametext(BuildOSTarget,'Freebsd') or sametext(BuildOSTarget,'Openbsd') then case OS of
result := '-Fl/usr/local/lib' freebsd, openbsd, netbsd :
else if sametext(BuildOSTarget,'Netbsd') then result := '-Fl'+GetDefaultLibGCCDir(CPU, OS, S);
result := '-Fl/usr/pkg/lib' linux :
else if sametext(BuildOSTarget,'Linux') then begin
begin if CPU in [i386, x86_64] then
if (BuildTarget = 'i386') or (BuildTarget = 'x86_64') then begin
result := GetGccDirArch('cpui386','-m32') + LineEnding + AddConditionalLinkerPath('cpui386', i386, result);
GetGccDirArch('cpux86_64','-m64') AddConditionalLinkerPath('cpux86_64', x86_64, result);
else if (BuildTarget = 'powerpc') or (BuildTarget = 'powerpc64') then end
result := GetGccDirArch('cpupowerpc','-m32') + LineEnding + else if CPU in [powerpc, powerpc64] then
GetGccDirArch('cpupowerpc64','-m64') begin
end AddConditionalLinkerPath('cpupowerpc', powerpc, result);
else if sametext(BuildOSTarget,'Darwin') then AddConditionalLinkerPath('cpupowerpc64', powerpc64, result);
result := GetGccDirArch('cpupowerpc','-arch ppc') + LineEnding + end
GetGccDirArch('cpupowerpc64','-arch ppc64') + LineEnding + end;
GetGccDirArch('cpui386','-arch i386') + LineEnding + darwin :
GetGccDirArch('cpux86_64','-arch x86_64'); begin
AddConditionalLinkerPath('cpui386', i386, result);
AddConditionalLinkerPath('cpux86_64', x86_64, result);
AddConditionalLinkerPath('cpupowerpc', powerpc, result);
AddConditionalLinkerPath('cpupowerpc64', powerpc64, result);
end
end; {case}
end; end;

View File

@ -30,7 +30,7 @@ begin
P.Version:='2.7.1'; P.Version:='2.7.1';
P.Dependencies.Add('fcl-base'); P.Dependencies.Add('fcl-base');
P.Dependencies.Add('fcl-process'); P.Dependencies.Add('fpmkunit');
Data2IncBin := AddProgramExtension('data2inc',Defaults.BuildOS); Data2IncBin := AddProgramExtension('data2inc',Defaults.BuildOS);
p.Commands.AddCommand(caBeforeCompile, Data2IncBin, '-b -s fpc.cft fpccfg.inc DefaultConfig','fpccfg.inc','fpc.cft'); p.Commands.AddCommand(caBeforeCompile, Data2IncBin, '-b -s fpc.cft fpccfg.inc DefaultConfig','fpccfg.inc','fpc.cft');