Browse Source

* detection of installed fpc added

git-svn-id: trunk@7542 -
peter 18 years ago
parent
commit
5e9e617625
4 changed files with 51 additions and 10 deletions
  1. 0 2
      utils/fppkg/pkgfpmake.pp
  2. 28 3
      utils/fppkg/pkgglobals.pp
  3. 7 0
      utils/fppkg/pkgmessages.pp
  4. 16 5
      utils/fppkg/pkgoptions.pp

+ 0 - 2
utils/fppkg/pkgfpmake.pp

@@ -97,8 +97,6 @@ begin
       { Call compiler }
       { Call compiler }
       C:=Defaults.FPMakeCompiler;
       C:=Defaults.FPMakeCompiler;
       O:='-vi -n -Fu'+Defaults.FPMakeUnitDir+' -Fu'+RTLDir;
       O:='-vi -n -Fu'+Defaults.FPMakeUnitDir+' -Fu'+RTLDir;
-//      if FPPkgDir<>'' then
-//        O:=O+' -Fu'+FPPkgDir+' -Fafpmkpkg';
       O:=O+' '+FPmakeSrc;
       O:=O+' '+FPmakeSrc;
       If ExecuteProcess(C,O)<>0 then
       If ExecuteProcess(C,O)<>0 then
         Error(SErrFailedToCompileFPCMake)
         Error(SErrFailedToCompileFPCMake)

+ 28 - 3
utils/fppkg/pkgglobals.pp

@@ -18,7 +18,7 @@ Const
 {$endif unix}
 {$endif unix}
 
 
 Type
 Type
-  TVerbosity = (vError,vInfo,vCommands,vDebug);
+  TVerbosity = (vError,vWarning,vInfo,vCommands,vDebug);
   TVerbosities = Set of TVerbosity;
   TVerbosities = Set of TVerbosity;
 
 
   EPackagerError = class(Exception);
   EPackagerError = class(Exception);
@@ -36,6 +36,7 @@ function maybequoted(const s:string):string;
 Function FixPath(const S : String) : string;
 Function FixPath(const S : String) : string;
 Procedure DeleteDir(const ADir:string);
 Procedure DeleteDir(const ADir:string);
 Procedure SearchFiles(SL:TStringList;const APattern:string);
 Procedure SearchFiles(SL:TStringList;const APattern:string);
+Function GetCompilerInfo(const ACompiler,AOptions:string):string;
 
 
 var
 var
   Verbosity : TVerbosities;
   Verbosity : TVerbosities;
@@ -45,6 +46,7 @@ Implementation
 
 
 uses
 uses
   typinfo,
   typinfo,
+  process,
   contnrs,
   contnrs,
   uriparser,
   uriparser,
   pkgmessages;
   pkgmessages;
@@ -68,9 +70,15 @@ end;
 
 
 
 
 procedure Log(Level:TVerbosity;Msg: String);
 procedure Log(Level:TVerbosity;Msg: String);
+var
+  Prefix : string;
 begin
 begin
-  if Level in Verbosity then
-    Writeln(stdErr,Msg);
+  if not(Level in Verbosity) then
+    exit;
+  Prefix:='';
+  if Level=vWarning then
+    Prefix:=SWarning;
+  Writeln(stdErr,Prefix,Msg);
 end;
 end;
 
 
 
 
@@ -188,5 +196,22 @@ begin
 end;
 end;
 
 
 
 
+Function GetCompilerInfo(const ACompiler,AOptions:string):string;
+Const
+  BUFSIZE=1024;
+Var
+  S : TProcess;
+  Buf : Array[0..BUFSIZE-1] of char;
+  Count : longint;
+begin
+  S:=TProcess.Create(Nil);
+  S.Commandline:=ACOmpiler+' '+AOptions;
+  S.Options:=[poUsePipes,poNoConsole];
+  S.execute;
+  Count:=s.output.read(buf,BufSize);
+  SetLength(Result,Count);
+  Move(Buf,Result[1],Count);
+  S.Free;
+end;
 
 
 end.
 end.

+ 7 - 0
utils/fppkg/pkgmessages.pp

@@ -6,9 +6,12 @@ interface
 
 
 
 
 Resourcestring
 Resourcestring
+  SWarning                   = 'Warning: ';
+
   SErrInValidArgument        = 'Invalid command-line argument at position %d : %s';
   SErrInValidArgument        = 'Invalid command-line argument at position %d : %s';
   SErrNeedArgument           = 'Option at position %d (%s) needs an argument';
   SErrNeedArgument           = 'Option at position %d (%s) needs an argument';
   SErrMissingFPC             = 'Could not find a fpc executable in the PATH';
   SErrMissingFPC             = 'Could not find a fpc executable in the PATH';
+  SErrInvalidFPCInfo         = 'Compiler returns invalid information, check if fpc -iV works';
   SErrMissingFPMake          = 'Missing configuration fpmake.pp';
   SErrMissingFPMake          = 'Missing configuration fpmake.pp';
   SErrMissingMakefilefpc     = 'Missing configuration Makefile.fpc';
   SErrMissingMakefilefpc     = 'Missing configuration Makefile.fpc';
   SErrMissingDirectory       = 'Missing directory "%s"';
   SErrMissingDirectory       = 'Missing directory "%s"';
@@ -34,6 +37,8 @@ Resourcestring
   SErrCWDFailed              = 'FTP CWD "%s" command failed.';
   SErrCWDFailed              = 'FTP CWD "%s" command failed.';
   SErrGETFailed              = 'FTP GET "%s" command failed.';
   SErrGETFailed              = 'FTP GET "%s" command failed.';
 
 
+  SWarnFPMKUnitNotFound      = 'Unit directory of fpmkunit is not found, compiling fpmake may file';
+
   SLogGeneratingFPMake       = 'Generating fpmake.pp';
   SLogGeneratingFPMake       = 'Generating fpmake.pp';
   SLogNotCompilingFPMake     = 'Skipping compiling of fpmake.pp, fpmake executable already exists';
   SLogNotCompilingFPMake     = 'Skipping compiling of fpmake.pp, fpmake executable already exists';
   SLogCommandLineAction      = 'Adding action from commandline: "%s %s"';
   SLogCommandLineAction      = 'Adding action from commandline: "%s %s"';
@@ -46,6 +51,8 @@ Resourcestring
   SLogLoadingGlobalConfig    = 'Loading global configuration from "%s"';
   SLogLoadingGlobalConfig    = 'Loading global configuration from "%s"';
   SLogLoadingCompilerConfig  = 'Loading compiler configuration from "%s"';
   SLogLoadingCompilerConfig  = 'Loading compiler configuration from "%s"';
   SLogGeneratingGlobalConfig = 'Generating default global configuration in "%s"';
   SLogGeneratingGlobalConfig = 'Generating default global configuration in "%s"';
+  SLogDetectedCompiler       = 'Detected compiler "%s" (version %s for %s)';
+  SLogDetectedFPCDIR         = 'Detected FPCDIR "%s" will be used installation';
   SLogGeneratingCompilerConfig  = 'Generating default compiler configuration in "%s"';
   SLogGeneratingCompilerConfig  = 'Generating default compiler configuration in "%s"';
   SLogLoadingPackagesFile    = 'Loading packages information from "%s"';
   SLogLoadingPackagesFile    = 'Loading packages information from "%s"';
   SLogLoadingVersionsFile    = 'Loading local versions information from "%s"';
   SLogLoadingVersionsFile    = 'Loading local versions information from "%s"';

+ 16 - 5
utils/fppkg/pkgoptions.pp

@@ -258,19 +258,27 @@ begin
   // Other config
   // Other config
   FDefaultCompilerConfig:='default';
   FDefaultCompilerConfig:='default';
   FCurrentCompilerConfig:=FDefaultCompilerConfig;
   FCurrentCompilerConfig:=FDefaultCompilerConfig;
-  FDefaultVerbosity:='error,info,debug,commands';
+  FDefaultVerbosity:='error,warning,info,debug,commands';
 end;
 end;
 
 
 
 
 Procedure TPackagerOptions.InitCompilerDefaults;
 Procedure TPackagerOptions.InitCompilerDefaults;
+var
+  infoSL : TStringList;
 begin
 begin
   FCompiler:=FileSearch('fpc'+ExeExt,GetEnvironmentVariable('PATH'));
   FCompiler:=FileSearch('fpc'+ExeExt,GetEnvironmentVariable('PATH'));
   if FCompiler='' then
   if FCompiler='' then
     Raise EPackagerError.Create(SErrMissingFPC);
     Raise EPackagerError.Create(SErrMissingFPC);
-{$warning TODO detect compiler version/target from -i options }
-  FCompilerVersion:='2.0.4';
-  FCompilerCPU:=StringToCPU({$I %FPCTARGETCPU%});
-  FCompilerOS:=StringToOS({$I %FPCTARGETOS%});
+  // Detect compiler version/target from -i option
+  infosl:=TStringList.Create;
+  infosl.Delimiter:=' ';
+  infosl.DelimitedText:=GetCompilerInfo(FCompiler,'-iVTPTO');
+  if infosl.Count<>3 then
+    Raise EPackagerError.Create(SErrInvalidFPCInfo);
+  FCompilerVersion:=infosl[0];
+  FCompilerCPU:=StringToCPU(infosl[1]);
+  FCompilerOS:=StringToOS(infosl[2]);
+  Log(vDebug,SLogDetectedCompiler,[FCompiler,FCompilerVersion,MakeTargetString(FCompilerCPU,FCompilerOS)]);
   // Use the same algorithm as the compiler, see options.pas
   // Use the same algorithm as the compiler, see options.pas
 {$ifdef Unix}
 {$ifdef Unix}
   FInstallDir:=FixPath(GetEnvironmentVariable('FPCDIR'));
   FInstallDir:=FixPath(GetEnvironmentVariable('FPCDIR'));
@@ -291,9 +299,12 @@ begin
         FInstallDir:=FInstallDir+'../';
         FInstallDir:=FInstallDir+'../';
     end;
     end;
 {$endif unix}
 {$endif unix}
+  Log(vDebug,SLogDetectedFPCDIR,[FInstallDir]);
   // Detect directory where fpmake units are located
   // Detect directory where fpmake units are located
   FFPMakeCompiler:=FCompiler;
   FFPMakeCompiler:=FCompiler;
   FFPMakeUnitDir:=FInstallDir+'units'+PathDelim+CompilerTarget+PathDelim+'fpmkunit'+PathDelim;
   FFPMakeUnitDir:=FInstallDir+'units'+PathDelim+CompilerTarget+PathDelim+'fpmkunit'+PathDelim;
+  if not DirectoryExists(FFPMakeUnitDir) then
+    Log(vWarning,SWarnFPMKUnitNotFound);
 end;
 end;