mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-08 21:48:09 +02:00
211 lines
6.7 KiB
ObjectPascal
211 lines
6.7 KiB
ObjectPascal
{$ifndef ALLPACKAGES}
|
|
{$mode objfpc}{$H+}
|
|
program fpmake;
|
|
|
|
uses fpmkunit, classes, sysutils;
|
|
|
|
{$endif ALLPACKAGES}
|
|
|
|
const
|
|
GdbLibName = 'libgdb.a';
|
|
MinGWGdbLibName = 'libmingw32.a';
|
|
|
|
procedure BeforeCompile_gdbint(Sender: TObject);
|
|
var
|
|
L : TStrings;
|
|
P : TPackage;
|
|
GdbLibDir, GdbLibFile: string;
|
|
GdbLibFound: boolean;
|
|
GdbintTarget, GdbVerTarget: TTarget;
|
|
begin
|
|
P := Sender as TPackage;
|
|
// Search for a libgdb file.
|
|
GdbLibFound:=false;
|
|
|
|
// First try the environment setting GDBLIBDIR
|
|
GdbLibDir := GetEnvironmentVariable('GDBLIBDIR');
|
|
if (GdbLibDir<>'') then
|
|
begin
|
|
if DirectoryExists(GdbLibDir) then
|
|
begin
|
|
GdbLibFile:=IncludeTrailingPathDelimiter(GdbLibDir)+GdbLibName;
|
|
if not FileExists(GdbLibFile) then
|
|
Installer.BuildEngine.Log(vlCommand,
|
|
'GDBLIBDIR environment variable set, but libgdb not found. ('+GdbLibFile+')')
|
|
else
|
|
GdbLibFound:=true;
|
|
end
|
|
else
|
|
Installer.BuildEngine.Log(vlCommand,
|
|
'GDBLIBDIR environment variable set, but directory does not exist. ('+GdbLibDir+')');
|
|
end;
|
|
|
|
// Try the default locations
|
|
if not GdbLibFound then
|
|
begin
|
|
GdbLibDir:=Installer.BuildEngine.AddPathPrefix(p,'..'+PathDelim+'..'+PathDelim+'libgdb');
|
|
if DirectoryExists(GdbLibDir) then
|
|
begin
|
|
GdbLibDir:=GdbLibDir+PathDelim+OSToString(Defaults.OS);
|
|
GdbLibFile:=GdbLibDir+PathDelim+GdbLibName;
|
|
if FileExists(GdbLibFile) then
|
|
GdbLibFound:=true
|
|
else
|
|
begin
|
|
GdbLibDir:=GdbLibDir+PathDelim+CPUToString(Defaults.CPU);
|
|
GdbLibFile:=GdbLibDir+PathDelim+GdbLibName;
|
|
GdbLibFound:=FileExists(GdbLibFile);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
GdbVerTarget:=TTarget(p.Targets.ItemByName('gdbver'));
|
|
GdbintTarget:=TTarget(p.Targets.ItemByName('gdbint'));
|
|
|
|
if GdbLibFound then
|
|
Installer.BuildEngine.Log(vlCommand,'File libgdb.a found ('+GdbLibFile+')')
|
|
else
|
|
Installer.BuildEngine.Log(vlCommand,'File libgdb.a not found');
|
|
if GdbLibFound then
|
|
begin
|
|
// Detect if gdblib.inc is available
|
|
if FileExists(GDBLibDir+PathDelim+'gdblib.inc') then
|
|
begin
|
|
P.Options.Add('-dUSE_GDBLIBINC');
|
|
P.Options.Add('-Fi'+GdbLibDir);
|
|
P.Options.Add('-Fl'+GdbLibDir);
|
|
// No need to use gdbver in this case
|
|
p.Targets.Delete(GdbVerTarget.Index);
|
|
Installer.BuildEngine.Log(vlCommand,'Using gdblib.inc include file')
|
|
end
|
|
// When we're cross-compiling, running the gdbver executable to detect the
|
|
// gdb-version is not possible, unless a i386-win32 to
|
|
// i386-go32v2 compilation is performed.
|
|
else if (not Defaults.IsBuildDifferentFromTarget
|
|
or ((Defaults.CPU=i386) and (Defaults.OS=go32v2) and
|
|
(Defaults.BuildOS=win32) and (Defaults.BuildCPU=i386))
|
|
) then
|
|
begin
|
|
P.Options.Add('-Fl'+GdbLibDir);
|
|
Installer.BuildEngine.CreateOutputDir(p);
|
|
Installer.BuildEngine.Log(vlCommand,'GDB-lib found, compiling and running gdbver to obtain GDB-version');
|
|
Installer.BuildEngine.Compile(P,GdbVerTarget);
|
|
Installer.BuildEngine.ExecuteCommand(Installer.BuildEngine.AddPathPrefix(p,p.
|
|
GetBinOutputDir(Defaults.CPU, Defaults.OS))+PathDelim+
|
|
AddProgramExtension('gdbver',Defaults.BuildOS),'-o ' +
|
|
Installer.BuildEngine.AddPathPrefix(p,'src'+PathDelim+'gdbver.inc'));
|
|
|
|
with GdbintTarget.Dependencies do
|
|
AddInclude('gdbver.inc');
|
|
// Pass -dUSE_MINGW_GDB to the compiler when a MinGW gdb is used
|
|
if FileExists(GdbLibDir+PathDelim+MinGWGdbLibName) then
|
|
begin
|
|
P.Options.Add('-dUSE_MINGW_GDB');
|
|
Installer.BuildEngine.Log(vlCommand,'Using GDB (MinGW)')
|
|
end
|
|
else
|
|
begin
|
|
Installer.BuildEngine.Log(vlCommand,'Using GDB')
|
|
end;
|
|
end
|
|
end
|
|
else
|
|
begin
|
|
// No suitable gdb found
|
|
// No need to compile gdbver.
|
|
p.Targets.Delete(GdbVerTarget.Index);
|
|
// use gdb_nogdb.inc
|
|
L := TStringList.Create;
|
|
try
|
|
if P.Directory<>'' then
|
|
L.values['src'+DirectorySeparator+'gdbver_nogdb.inc'] := IncludeTrailingPathDelimiter(P.Directory) +'src'+DirectorySeparator+'gdbver.inc'
|
|
else
|
|
L.values['src'+DirectorySeparator+'gdbver_nogdb.inc'] := 'src'+DirectorySeparator+'gdbver.inc';
|
|
Installer.BuildEngine.cmdcopyfiles(L, Installer.BuildEngine.StartDir, nil);
|
|
with GdbintTarget.Dependencies do
|
|
AddInclude('gdbver.inc');
|
|
finally
|
|
L.Free;
|
|
end;
|
|
|
|
end;
|
|
end;
|
|
|
|
procedure AfterCompile_gdbint(Sender: TObject);
|
|
var
|
|
L : TStrings;
|
|
P : TPackage;
|
|
begin
|
|
// Remove the generated gdbver.inc
|
|
L := TStringList.Create;
|
|
P := Sender as TPackage;
|
|
try
|
|
if P.Directory<>'' then
|
|
L.add(IncludeTrailingPathDelimiter(P.Directory)+'src'+DirectorySeparator+'gdbver.inc')
|
|
else
|
|
L.add(IncludeTrailingPathDelimiter(Installer.BuildEngine.StartDir)+'src'+DirectorySeparator+'gdbver.inc');
|
|
Installer.BuildEngine.CmdDeleteFiles(L);
|
|
finally
|
|
L.Free;
|
|
end;
|
|
end;
|
|
|
|
procedure add_gdbint(const ADirectory: string);
|
|
|
|
Var
|
|
P : TPackage;
|
|
T : TTarget;
|
|
begin
|
|
With Installer do
|
|
begin
|
|
P:=AddPackage('gdbint');
|
|
P.ShortName:='gdb';
|
|
P.Directory:=ADirectory;
|
|
P.Version:='3.3.1';
|
|
P.Author := 'Library : Cygnus, header: Peter Vreman';
|
|
P.License := 'Library: GPL2 or later, header: LGPL with modification, ';
|
|
P.HomepageURL := 'www.freepascal.org';
|
|
P.Email := '';
|
|
P.Description := 'Interface to libgdb, the GDB debugger in library format';
|
|
P.NeedLibC:= true; // true for headers that indirectly link to libc?
|
|
// In case of using a buildunit, it is not possible to compile a single
|
|
// file within the BeforeCompile event.
|
|
P.SupportBuildModes:= [bmOneByOne];
|
|
|
|
P.OSes:=[aix,beos,haiku,freebsd,netbsd,openbsd,linux,win32,win64,go32v2,dragonfly,solaris];
|
|
|
|
P.SourcePath.Add('src');
|
|
P.IncludePath.Add('src');
|
|
|
|
P.BeforeCompileProc:=@BeforeCompile_gdbint;
|
|
P.AfterCompileProc:=@AfterCompile_gdbint;
|
|
|
|
T := p.Targets.AddProgram('src'+PathDelim+'gdbver.pp');
|
|
T.Install := false;
|
|
//
|
|
// NOTE: the gdbver.inc dependencies gives warnings because the makefile.fpc
|
|
// does a "cp src/gdbver_nogdb.inc src/gdbver.inc" to create it
|
|
|
|
T:=P.Targets.AddUnit('gdbcon.pp');
|
|
with T.Dependencies do
|
|
begin
|
|
AddUnit('gdbint');
|
|
end;
|
|
T:=P.Targets.AddUnit('gdbint.pp');
|
|
P.ExamplePath.add('examples');
|
|
P.Targets.AddExampleProgram('testgdb.pp');
|
|
P.Targets.AddExampleProgram('symify.pp');
|
|
P.Targets.AddExampleUnit('mingw.pas');
|
|
|
|
P.Sources.AddSrc('src/gdbver_nogdb.inc');
|
|
end;
|
|
end;
|
|
|
|
{$ifndef ALLPACKAGES}
|
|
begin
|
|
add_gdbint('');
|
|
Installer.Run;
|
|
end.
|
|
{$endif ALLPACKAGES}
|
|
|