ソースを参照

* quote parameters for compiler command line

git-svn-id: trunk@10131 -
peter 17 年 前
コミット
2400207ead
1 ファイル変更67 行追加13 行削除
  1. 67 13
      packages/fpmkunit/src/fpmkunit.pp

+ 67 - 13
packages/fpmkunit/src/fpmkunit.pp

@@ -1117,6 +1117,50 @@ begin
 end;
 
 
+function maybequoted(const s:string):string;
+const
+  {$IFDEF MSWINDOWS}
+    FORBIDDEN_CHARS = ['!', '@', '#', '$', '%', '^', '&', '*', '(', ')',
+                       '{', '}', '''', '`', '~'];
+  {$ELSE}
+    FORBIDDEN_CHARS = ['!', '@', '#', '$', '%', '^', '&', '*', '(', ')',
+                       '{', '}', '''', ':', '\', '`', '~'];
+  {$ENDIF}
+var
+  s1 : string;
+  i  : integer;
+  quoted : boolean;
+begin
+  quoted:=false;
+  s1:='"';
+  for i:=1 to length(s) do
+   begin
+     case s[i] of
+       '"' :
+         begin
+           quoted:=true;
+           s1:=s1+'\"';
+         end;
+       ' ',
+       #128..#255 :
+         begin
+           quoted:=true;
+           s1:=s1+s[i];
+         end;
+       else begin
+         if s[i] in FORBIDDEN_CHARS then
+           quoted:=True;
+         s1:=s1+s[i];
+       end;
+     end;
+   end;
+  if quoted then
+    maybequoted:=s1+'"'
+  else
+    maybequoted:=s;
+end;
+
+
 // Callback for Sysutils getapplicationname.
 Function GetFPMakeName : String;
 
@@ -3408,33 +3452,37 @@ end;
 Function TBuildEngine.GetCompilerCommand(APackage : TPackage; ATarget : TTarget) : String;
 Var
   PD,OD : String;
-  L : TStringList;
+  L,Args : TStringList;
+
   i : Integer;
 begin
+  Args:=TStringList.Create;
+  Args.Duplicates:=dupIgnore;
+
   PD:=GetPackageDir(APackage,True);
 
   Result := '';
 
   //compiler configuration
   if Defaults.NoFPCCfg then
-    Result := '-n';
+    Args.Add('-n');
 
   // Target OS
   Result:=Result+' -T'+OSToString(Defaults.OS);
 
   // Compile mode
   If ATarget.Mode<>cmFPC then
-    Result:=Result+' -M'+ModeToString(ATarget.Mode)
+    Args.Add('-M'+ModeToString(ATarget.Mode))
   else If Defaults.Mode<>cmFPC then
-    Result:=Result+' -M'+ModeToString(Defaults.Mode);
+    Args.Add('-M'+ModeToString(Defaults.Mode));
   // Output file paths
   If ATarget.TargetType in ProgramTargets then
     begin
       OD:=GetBinOutputDir(APackage,True);
-      Result:=Result+' -FE' + ExtractRelativePath(PD,OD);
+      Args.Add('-FE' + ExtractRelativePath(PD,OD));
     end;
   OD:=GetUnitsOutputDir(APackage,True);
-  Result := Result + ' -FU' + ExtractRelativePath(PD,OD);
+  Args.Add('-FU' + ExtractRelativePath(PD,OD));
   // Object Path
   L:=TStringList.Create;
   L.Sorted:=true;
@@ -3442,7 +3490,7 @@ begin
   AddConditionalStrings(L,APackage.ObjectPath,Defaults.CPU,Defaults.OS);
   AddConditionalStrings(L,ATarget.ObjectPath,Defaults.CPU,Defaults.OS);
   for i:=0 to L.Count-1 do
-    Result:=Result+' -Fo'+L[i];
+    Args.Add('-Fo'+L[i]);
   FreeAndNil(L);
   // Unit Dirs
   L:=TStringList.Create;
@@ -3452,7 +3500,7 @@ begin
   AddConditionalStrings(L,APackage.UnitPath,Defaults.CPU,Defaults.OS);
   AddConditionalStrings(L,ATarget.UnitPath,Defaults.CPU,Defaults.OS);
   for i:=0 to L.Count-1 do
-    Result:=Result+' -Fu'+L[i];
+    Args.Add('-Fu'+L[i]);
   FreeAndNil(L);
   // Include Path
   L:=TStringList.Create;
@@ -3462,17 +3510,23 @@ begin
   AddConditionalStrings(L,APackage.IncludePath,Defaults.CPU,Defaults.OS);
   AddConditionalStrings(L,ATarget.IncludePath,Defaults.CPU,Defaults.OS);
   for i:=0 to L.Count-1 do
-    Result:=Result+' -Fi'+L[i];
+    Args.Add('-Fi'+L[i]);
   FreeAndNil(L);
   // Custom Options
   If (Defaults.Options<>'') then
-    Result:=Result+' '+Defaults.Options;
+    Args.Add(Defaults.Options);
   If (APackage.Options<>'') then
-    Result:=Result+' '+APackage.Options;
+    Args.Add(APackage.Options);
   If (ATarget.Options<>'') then
-    Result:=Result+' '+ATarget.Options;
+    Args.Add(ATarget.Options);
   // Add Filename to compile
-  Result:=Result+' '+ExtractRelativePath(PD, ExpandFileName(ATarget.TargetSourceFileName));
+  Args.Add(ExtractRelativePath(PD, ExpandFileName(ATarget.TargetSourceFileName)));
+  // Convert to string
+  Result:='';
+  for i:=0 to Args.Count-1 do
+    Result:=Result+' '+maybequoted(Args[i]);
+  Delete(result,1,1);
+  Args.Free;
 end;