fpmake.pp 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. {$ifndef ALLPACKAGES}
  2. {$mode objfpc}{$H+}
  3. program fpmake;
  4. uses fpmkunit, classes, sysutils;
  5. {$endif ALLPACKAGES}
  6. const
  7. GdbLibName = 'libgdb.a';
  8. MinGWGdbLibName = 'libmingw32.a';
  9. procedure BeforeCompile_gdbint(Sender: TObject);
  10. var
  11. L : TStrings;
  12. P : TPackage;
  13. GdbLibDir, GdbLibFile: string;
  14. GdbLibFound: boolean;
  15. GdbintTarget, GdbVerTarget: TTarget;
  16. begin
  17. P := Sender as TPackage;
  18. // Search for a libgdb file.
  19. GdbLibFound:=false;
  20. // First try the environment setting GDBLIBDIR
  21. GdbLibDir := GetEnvironmentVariable('GDBLIBDIR');
  22. if (GdbLibDir<>'') then
  23. begin
  24. if DirectoryExists(GdbLibDir) then
  25. begin
  26. GdbLibFile:=IncludeTrailingPathDelimiter(GdbLibDir)+GdbLibName;
  27. if not FileExists(GdbLibFile) then
  28. Installer.BuildEngine.Log(vlCommand,
  29. 'GDBLIBDIR environment variable set, but libgdb not found. ('+GdbLibFile+')')
  30. else
  31. GdbLibFound:=true;
  32. end
  33. else
  34. Installer.BuildEngine.Log(vlCommand,
  35. 'GDBLIBDIR environment variable set, but directory does not exist. ('+GdbLibDir+')');
  36. end;
  37. // Try the default locations
  38. if not GdbLibFound then
  39. begin
  40. GdbLibDir:=Installer.BuildEngine.AddPathPrefix(p,'..'+PathDelim+'..'+PathDelim+'libgdb');
  41. if DirectoryExists(GdbLibDir) then
  42. begin
  43. GdbLibDir:=GdbLibDir+PathDelim+OSToString(Defaults.OS);
  44. GdbLibFile:=GdbLibDir+PathDelim+GdbLibName;
  45. if FileExists(GdbLibFile) then
  46. GdbLibFound:=true
  47. else
  48. begin
  49. GdbLibDir:=GdbLibDir+PathDelim+CPUToString(Defaults.CPU);
  50. GdbLibFile:=GdbLibDir+PathDelim+GdbLibName;
  51. GdbLibFound:=FileExists(GdbLibFile);
  52. end;
  53. end;
  54. end;
  55. GdbVerTarget:=TTarget(p.Targets.ItemByName('gdbver'));
  56. GdbintTarget:=TTarget(p.Targets.ItemByName('gdbint'));
  57. if GdbLibFound then
  58. Installer.BuildEngine.Log(vlCommand,'File libgdb.a found ('+GdbLibFile+')')
  59. else
  60. Installer.BuildEngine.Log(vlCommand,'File libgdb.a not found');
  61. if GdbLibFound then
  62. begin
  63. // Detect if gdblib.inc is available
  64. if FileExists(GDBLibDir+PathDelim+'gdblib.inc') then
  65. begin
  66. P.Options.Add('-dUSE_GDBLIBINC');
  67. P.Options.Add('-Fi'+GdbLibDir);
  68. P.Options.Add('-Fl'+GdbLibDir);
  69. // No need to use gdbver in this case
  70. p.Targets.Delete(GdbVerTarget.Index);
  71. Installer.BuildEngine.Log(vlCommand,'Using gdblib.inc include file')
  72. end
  73. // When we're cross-compiling, running the gdbver executable to detect the
  74. // gdb-version is not possible, unless a i386-win32 to
  75. // i386-go32v2 compilation is performed.
  76. else if (not Defaults.IsBuildDifferentFromTarget
  77. or ((Defaults.CPU=i386) and (Defaults.OS=go32v2) and
  78. (Defaults.BuildOS=win32) and (Defaults.BuildCPU=i386))
  79. ) then
  80. begin
  81. P.Options.Add('-Fl'+GdbLibDir);
  82. Installer.BuildEngine.CreateOutputDir(p);
  83. Installer.BuildEngine.Log(vlCommand,'GDB-lib found, compiling and running gdbver to obtain GDB-version');
  84. Installer.BuildEngine.Compile(P,GdbVerTarget);
  85. Installer.BuildEngine.ExecuteCommand(Installer.BuildEngine.AddPathPrefix(p,p.
  86. GetBinOutputDir(Defaults.CPU, Defaults.OS))+PathDelim+
  87. AddProgramExtension('gdbver',Defaults.BuildOS),'-o ' +
  88. Installer.BuildEngine.AddPathPrefix(p,'src'+PathDelim+'gdbver.inc'));
  89. with GdbintTarget.Dependencies do
  90. AddInclude('gdbver.inc');
  91. // Pass -dUSE_MINGW_GDB to the compiler when a MinGW gdb is used
  92. if FileExists(GdbLibDir+PathDelim+MinGWGdbLibName) then
  93. begin
  94. P.Options.Add('-dUSE_MINGW_GDB');
  95. Installer.BuildEngine.Log(vlCommand,'Using GDB (MinGW)')
  96. end
  97. else
  98. begin
  99. Installer.BuildEngine.Log(vlCommand,'Using GDB')
  100. end;
  101. end
  102. end
  103. else
  104. begin
  105. // No suitable gdb found
  106. // No need to compile gdbver.
  107. p.Targets.Delete(GdbVerTarget.Index);
  108. // use gdb_nogdb.inc
  109. L := TStringList.Create;
  110. try
  111. if P.Directory<>'' then
  112. L.values['src'+DirectorySeparator+'gdbver_nogdb.inc'] := IncludeTrailingPathDelimiter(P.Directory) +'src'+DirectorySeparator+'gdbver.inc'
  113. else
  114. L.values['src'+DirectorySeparator+'gdbver_nogdb.inc'] := 'src'+DirectorySeparator+'gdbver.inc';
  115. Installer.BuildEngine.cmdcopyfiles(L, Installer.BuildEngine.StartDir, nil);
  116. with GdbintTarget.Dependencies do
  117. AddInclude('gdbver.inc');
  118. finally
  119. L.Free;
  120. end;
  121. end;
  122. end;
  123. procedure AfterCompile_gdbint(Sender: TObject);
  124. var
  125. L : TStrings;
  126. P : TPackage;
  127. begin
  128. // Remove the generated gdbver.inc
  129. L := TStringList.Create;
  130. P := Sender as TPackage;
  131. try
  132. if P.Directory<>'' then
  133. L.add(IncludeTrailingPathDelimiter(P.Directory)+'src'+DirectorySeparator+'gdbver.inc')
  134. else
  135. L.add(IncludeTrailingPathDelimiter(Installer.BuildEngine.StartDir)+'src'+DirectorySeparator+'gdbver.inc');
  136. Installer.BuildEngine.CmdDeleteFiles(L);
  137. finally
  138. L.Free;
  139. end;
  140. end;
  141. procedure add_gdbint(const ADirectory: string);
  142. Var
  143. P : TPackage;
  144. T : TTarget;
  145. begin
  146. With Installer do
  147. begin
  148. P:=AddPackage('gdbint');
  149. P.ShortName:='gdb';
  150. P.Directory:=ADirectory;
  151. P.Version:='3.3.1';
  152. P.Author := 'Library : Cygnus, header: Peter Vreman';
  153. P.License := 'Library: GPL2 or later, header: LGPL with modification, ';
  154. P.HomepageURL := 'www.freepascal.org';
  155. P.Email := '';
  156. P.Description := 'Interface to libgdb, the GDB debugger in library format';
  157. P.NeedLibC:= true; // true for headers that indirectly link to libc?
  158. // In case of using a buildunit, it is not possible to compile a single
  159. // file within the BeforeCompile event.
  160. P.SupportBuildModes:= [bmOneByOne];
  161. P.OSes:=[aix,beos,haiku,freebsd,netbsd,openbsd,linux,win32,win64,go32v2,dragonfly,solaris];
  162. P.SourcePath.Add('src');
  163. P.IncludePath.Add('src');
  164. P.BeforeCompileProc:=@BeforeCompile_gdbint;
  165. P.AfterCompileProc:=@AfterCompile_gdbint;
  166. T := p.Targets.AddProgram('src'+PathDelim+'gdbver.pp');
  167. T.Install := false;
  168. //
  169. // NOTE: the gdbver.inc dependencies gives warnings because the makefile.fpc
  170. // does a "cp src/gdbver_nogdb.inc src/gdbver.inc" to create it
  171. T:=P.Targets.AddUnit('gdbcon.pp');
  172. with T.Dependencies do
  173. begin
  174. AddUnit('gdbint');
  175. end;
  176. T:=P.Targets.AddUnit('gdbint.pp');
  177. P.ExamplePath.add('examples');
  178. P.Targets.AddExampleProgram('testgdb.pp');
  179. P.Targets.AddExampleProgram('symify.pp');
  180. P.Targets.AddExampleUnit('mingw.pas');
  181. P.Sources.AddSrc('src/gdbver_nogdb.inc');
  182. end;
  183. end;
  184. {$ifndef ALLPACKAGES}
  185. begin
  186. add_gdbint('');
  187. Installer.Run;
  188. end.
  189. {$endif ALLPACKAGES}