summaryrefslogtreecommitdiff
path: root/packages/gdbint/fpmake.pp
blob: bc6d0d5f304c537a85adb5ed1aa1ac4164a59a33 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
{$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;
begin
  // Remove the generated gdbver.inc
  L := TStringList.Create;
  try
    L.add(IncludeTrailingPathDelimiter(Installer.BuildEngine.StartDir)+'src/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.0.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];

    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}