소스 검색

* variable substition like GNU Make. wildcard,addprefix,addsuffix
already implemented

peter 24 년 전
부모
커밋
1be1aab60d
1개의 변경된 파일138개의 추가작업 그리고 44개의 파일을 삭제
  1. 138 44
      utils/fpcm/fpcmmain.pp

+ 138 - 44
utils/fpcm/fpcmmain.pp

@@ -115,7 +115,7 @@ interface
         function  GetTargetRequires(t:TTarget):TStringList;
         function  CheckLibcRequire:boolean;
         procedure CreateExportSection;
-        procedure SubstVariables(var s:string);
+        function  SubstVariables(const s:string):string;
         function  GetVariable(const inivar:string):string;
         function  SetVariable(const inivar,value:string;add:boolean):string;
         procedure Print;
@@ -153,14 +153,6 @@ implementation
         dir,unitdir,packdir : string;
       end;
 
-    const
-      specialdirs = 4;
-      specialdir : array[1..specialdirs] of tspecialdir=(
-        (dir: 'rtl';  unitdir: '$(UNITSDIR)/rtl';  packdir: '$(FPCDIR)/rtl'),
-        (dir: 'fcl';  unitdir: '$(UNITSDIR)/fcl';  packdir: '$(FPCDIR)/fcl'),
-        (dir: 'api';  unitdir: '$(UNITSDIR)/api';  packdir: '$(FPCDIR)/api'),
-        (dir: 'fv';   unitdir: '$(UNITSDIR)/fv';   packdir: '$(FPCDIR)/fv')
-      );
 
 {****************************************************************************
                                  Helpers
@@ -661,23 +653,10 @@ implementation
 
       var
         s : string;
-        i : integer;
       begin
-        s:='$(PACKAGESDIR)/'+ReqName;
-        For i:=1 to SpecialDirs do
-         if SpecialDir[i].Dir=ReqName then
-          begin
-            s:=SpecialDir[i].PackDir;
-            break;
-          end;
-        SubstVariables(s);
-        if TryFile(s+'/Makefile.fpc') then
+        s:=SubstVariables('$(wildcard $(addsuffix /'+ReqName+'/Makefile.fpc,$(FPCDIR)) $(addsuffix /'+ReqName+'/Makefile.fpc,$(PACKAGESDIR)) $(addsuffix /'+ReqName+'/Makefile.fpc,$(REQUIRE_PACKAGESDIR)))');
+        if TryFile(s) then
          exit;
-        {s:=GetVariable('default.fpcdir');
-        writeln('s: ',s);
-        if (s<>'') and (TryFile(s+'/Makefile.fpc')) then
-         exit; }
-
         Raise Exception.Create('s_package_not_found '+Reqname);
       end;
 
@@ -880,34 +859,145 @@ implementation
       end;
 
 
-    procedure TFPCMake.SubstVariables(var s:string);
+    function TFPCMake.SubstVariables(const s:string):string;
+
+      function Expect(var s:string;c:char):boolean;
+      begin
+        if (s<>'') and (s[1]=c) then
+         begin
+           Delete(s,1,1);
+           Result:=true;
+         end
+        else
+         begin
+           writeln('Error "',c,'" expected');
+           Result:=false;
+         end;
+      end;
+
+      function GetVar(var s:string;untilc:char):string;
       var
         i,j,k : integer;
-        s2,s3 : string;
+        first : boolean;
+        func,
+        tok,s1,s2,s3 : string;
         Sec   : TFPCMakeSection;
       begin
+        Result:='';
         repeat
+          j:=Pos(untilc,s);
+          if j=0 then
+           j:=Length(s)+1;
           i:=Pos('$(',s);
-          if i=0 then
+          if (j<i) or (i=0) then
            break;
-          j:=PosIdx(')',s,i+2);
-          s2:=Copy(s,i+2,j-i-2);
-          k:=pos('.',s2);
-          if k>0 then
+          Result:=Result+Copy(s,1,i-1);
+          Delete(s,1,i+1);
+          { Maybe Function ? }
+          j:=Pos(')',s);
+          if j=0 then
+           j:=Length(s)+1;
+          i:=Pos(' ',s);
+          if i=0 then
+           i:=Length(s)+1;
+          if i<j then
            begin
-             s3:=Copy(s2,k+1,Length(s2)-k);
-             s2:=Copy(s2,1,k-1);
-             Sec:=TFPCMakeSection(Section[s2]);
-             if assigned(Sec) then
-              s2:=Sec[s3]
-             else
-              s2:='';
+             { It's a function }
+             Func:=Copy(s,1,i-1);
+             if Func='wildcard' then
+              begin
+                Delete(s,1,9);
+                s1:=GetVar(s,')');
+                Expect(s,')');
+writeln('$(wildcard ',s1,')');
+                first:=true;
+                repeat
+                  tok:=GetToken(s1);
+                  if tok='' then
+                   break;
+                  if FileExists(tok) then
+                   begin
+                     if not first then
+                      Result:=Result+' '
+                     else
+                      first:=false;
+                     Result:=Result+tok;
+                   end;
+                until false;
+              end
+             else if Func='addprefix' then
+              begin
+                Delete(s,1,10);
+                s1:=GetVar(s,',');
+                if Expect(s,',') then
+                 begin
+                   s2:=GetVar(s,')');
+                   Expect(s,')');
+                 end;
+                first:=true;
+                repeat
+                  tok:=GetToken(s2);
+                  if tok='' then
+                   break;
+                  if not first then
+                   Result:=Result+' '
+                  else
+                   first:=false;
+                  Result:=Result+s1+tok;
+                until false;
+              end
+             else if Func='addsuffix' then
+              begin
+                Delete(s,1,10);
+                s1:=GetVar(s,',');
+                if Expect(s,',') then
+                 begin
+                   s2:=GetVar(s,')');
+                   Expect(s,')');
+                 end;
+                first:=true;
+                repeat
+                  tok:=GetToken(s2);
+                  if tok='' then
+                   break;
+                  if not first then
+                   Result:=Result+' '
+                  else
+                   first:=false;
+                  Result:=Result+tok+s1;
+                until false;
+              end;
            end
           else
-           s2:=Variables[s2];
-          Delete(s,i,j-i+1);
-          Insert(s2,s,i);
+           begin
+             s2:=Copy(s,1,j-1);
+             Delete(s,1,j);
+             k:=pos('_',s2);
+             if k>0 then
+              begin
+                s3:=LowerCase(Copy(s2,k+1,Length(s2)-k));
+                s2:=LowerCase(Copy(s2,1,k-1));
+                Sec:=TFPCMakeSection(Section[s2]);
+                if assigned(Sec) then
+                 s2:=Sec[s3]
+                else
+                 s2:='';
+              end
+             else
+              s2:=Variables[s2];
+             Insert(s2,s,1);
+           end;
         until false;
+        Result:=Result+Copy(s,1,j-1);
+        Delete(s,1,j-1);
+      end;
+
+      var
+        s1 : string;
+      begin
+        s1:=s;
+        Result:=GetVar(s1,#0);
+writeln('R: ',result);
       end;
 
 
@@ -918,7 +1008,7 @@ implementation
         i   : integer;
       begin
         Result:='';
-        i:=Pos('.',inivar);
+        i:=Pos('_',inivar);
         if i<>0 then
          begin
            Sec:=TFPCMakeSection(FSections[Copy(Inivar,1,i-1)]);
@@ -943,7 +1033,7 @@ implementation
         key : string;
       begin
         Result:='';
-        i:=Pos('.',inivar);
+        i:=Pos('_',inivar);
         if i<>0 then
          begin
            Sec:=TFPCMakeSection(FSections[Copy(Inivar,1,i-1)]);
@@ -992,7 +1082,11 @@ implementation
 end.
 {
   $Log$
-  Revision 1.3  2001-02-01 22:00:10  peter
+  Revision 1.4  2001-02-05 20:44:56  peter
+    * variable substition like GNU Make. wildcard,addprefix,addsuffix
+      already implemented
+
+  Revision 1.3  2001/02/01 22:00:10  peter
     * default.fpcdir is back
     * subdir requirement checking works, but not very optimal yet as
       it can load the same Makefile.fpc multiple times