fpmake.pp 6.9 KB

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