fpmake.pp 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  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. 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. if GdbLibFound then
  57. Installer.BuildEngine.Log(vlCommand,'File libgdb.a found ('+GdbLibFile+')')
  58. else
  59. Installer.BuildEngine.Log(vlCommand,'File libgdb.a not found');
  60. // When we're cross-compiling, running the gdbver executable to detect the
  61. // gdb-version is not possible, unless a i386-win32 to i386-go32v2 compilation
  62. // is performed.
  63. if GdbLibFound and
  64. (not Defaults.IsBuildDifferentFromTarget
  65. or ((Defaults.CPU=i386) and (Defaults.OS=go32v2) and (Defaults.BuildOS=win32) and (Defaults.BuildCPU=i386))) then
  66. begin
  67. P.Options.Add('-Fl'+GdbLibDir);
  68. Installer.BuildEngine.CreateOutputDir(p);
  69. Installer.BuildEngine.Log(vlCommand,'GDB-lib found, compiling and running gdbver to obtain GDB-version');
  70. Installer.BuildEngine.Compile(P,GdbVerTarget);
  71. Installer.BuildEngine.ExecuteCommand(Installer.BuildEngine.AddPathPrefix(p,p.
  72. GetBinOutputDir(Defaults.CPU, Defaults.OS))+PathDelim+
  73. AddProgramExtension('gdbver',Defaults.BuildOS),'-o ' +
  74. Installer.BuildEngine.AddPathPrefix(p,'src'+PathDelim+'gdbver.inc'));
  75. // Pass -dUSE_MINGW_GDB to the compiler when a MinGW gdb is used
  76. if FileExists(GdbLibDir+PathDelim+MinGWGdbLibName) then
  77. begin
  78. P.Options.Add('-dUSE_MINGW_GDB');
  79. Installer.BuildEngine.Log(vlCommand,'Using GDB (MinGW)')
  80. end
  81. else
  82. begin
  83. Installer.BuildEngine.Log(vlCommand,'Using GDB')
  84. end;
  85. // Detect if gdblib.inc is available
  86. if FileExists(GDBLibDir+PathDelim+'gdblib.inc') then
  87. begin
  88. P.Options.Add('-dUSE_GDBLIBINC');
  89. P.Options.Add('-Fi'+GdbLibDir);
  90. Installer.BuildEngine.Log(vlCommand,'Using gdblib.inc include file')
  91. end;
  92. end
  93. else
  94. begin
  95. // No suitable gdb found
  96. // No need to compile gdbver.
  97. p.Targets.Delete(GdbVerTarget.Index);
  98. // use gdb_nogdb.inc
  99. L := TStringList.Create;
  100. try
  101. if P.Directory<>'' then
  102. L.values[Installer.BuildEngine.AddPathPrefix(P,'src')+DirectorySeparator+'gdbver_nogdb.inc'] := IncludeTrailingPathDelimiter(P.Directory) +'src'+DirectorySeparator+'gdbver.inc'
  103. else
  104. L.values[Installer.BuildEngine.AddPathPrefix(P,'src')+DirectorySeparator+'gdbver_nogdb.inc'] := 'src'+DirectorySeparator+'gdbver.inc';
  105. Installer.BuildEngine.cmdcopyfiles(L, Installer.BuildEngine.StartDir);
  106. finally
  107. L.Free;
  108. end;
  109. end;
  110. end;
  111. procedure AfterCompile_gdbint(Sender: TObject);
  112. var
  113. L : TStrings;
  114. begin
  115. // Remove the generated gdbver.inc
  116. L := TStringList.Create;
  117. try
  118. L.add(IncludeTrailingPathDelimiter(Installer.BuildEngine.StartDir)+'src/gdbver.inc');
  119. Installer.BuildEngine.CmdDeleteFiles(L);
  120. finally
  121. L.Free;
  122. end;
  123. end;
  124. procedure add_gdbint(const ADirectory: string);
  125. Var
  126. P : TPackage;
  127. T : TTarget;
  128. begin
  129. With Installer do
  130. begin
  131. P:=AddPackage('gdbint');
  132. P.Directory:=ADirectory;
  133. P.Version:='2.7.1';
  134. P.Author := 'Library : Cygnus, header: Peter Vreman';
  135. P.License := 'Library: GPL2 or later, header: LGPL with modification, ';
  136. P.HomepageURL := 'www.freepascal.org';
  137. P.Email := '';
  138. P.Description := 'Interface to libgdb, the GDB debugger in library format';
  139. P.NeedLibC:= true; // true for headers that indirectly link to libc?
  140. // In case of using a buildunit, it is not possible to compile a single
  141. // file within the BeforeCompile event.
  142. P.SupportBuildModes:= [bmOneByOne];
  143. P.OSes:=[beos,haiku,freebsd,netbsd,openbsd,linux,win32,win64,go32v2];
  144. P.SourcePath.Add('src');
  145. P.IncludePath.Add('src');
  146. P.BeforeCompileProc:=@BeforeCompile_gdbint;
  147. P.AfterCompileProc:=@AfterCompile_gdbint;
  148. p.Targets.AddProgram('src'+PathDelim+'gdbver.pp');
  149. //
  150. // NOTE: the gdbver.inc dependancies gives warnings because the makefile.fpc
  151. // does a "cp src/gdbver_nogdb.inc src/gdbver.inc" to create it
  152. T:=P.Targets.AddUnit('gdbcon.pp');
  153. with T.Dependencies do
  154. begin
  155. AddUnit('gdbint');
  156. end;
  157. T:=P.Targets.AddUnit('gdbint.pp');
  158. with T.Dependencies do
  159. begin
  160. AddInclude('gdbver.inc');
  161. end;
  162. P.ExamplePath.add('tests');
  163. P.Targets.AddExampleProgram('testgdb.pp');
  164. P.Targets.AddExampleProgram('simify.pp');
  165. end;
  166. end;
  167. {$ifndef ALLPACKAGES}
  168. begin
  169. add_gdbint('');
  170. Installer.Run;
  171. end.
  172. {$endif ALLPACKAGES}