3 IMPORT Kernel
, Files
, Log
, Strings
, DswOpts
, DswProcs
, DswDocuments
, DevCPM
, DevCPT
, DevCPR
, DevCPS
;
12 null
= 0; times
= 1; slash
= 2; div
= 3; mod
= 4;
13 and
= 5; plus
= 6; minus
= 7; or
= 8; eql
= 9;
14 neq
= 10; lss
= 11; leq
= 12; gtr
= 13; geq
= 14;
15 in
= 15; is
= 16; arrow
= 17; dollar
= 18; period
= 19;
16 comma
= 20; colon
= 21; upto
= 22; rparen
= 23; rbrak
= 24;
17 rbrace
= 25; of
= 26; then
= 27; do
= 28; to
= 29;
19 lparen
= 40; lbrak
= 41; lbrace
= 42; becomes
= 44;
20 number
= 45; nil
= 46; string
= 47; ident
= 48; semicolon
= 49;
21 bar
= 50; end
= 51; else
= 52; elsif
= 53; until
= 54;
22 if
= 55; case
= 56; while
= 57; repeat
= 58; for
= 59;
23 loop
= 60; with
= 61; exit
= 62; return
= 63; array
= 64;
24 record
= 65; pointer
= 66; begin
= 67; const
= 68; type
= 69;
25 var
= 70; out
= 71; procedure
= 72; close
= 73; import
= 74;
26 module
= 75; eof
= 76;
28 (* module state flags *)
29 imported
= 0; trace
= 1; hasObj
= 2; hasSym
= 3; hasErrors
= 4; library
= 5;
32 anymach
= 0; cmach
= 1; mach386
= 10; mach68k
= 20;
34 (* operation system types *)
35 anyos
= 0; linux
= 1; freebsd
= 2; openbsd
= 3; win32
= 4; cygwin
= 5; darwin
= 6;
38 anycp
= 0; cpnative
= 1; cpfront
= 2;
40 (* internal linker types *)
49 String
= POINTER TO ARRAY OF CHAR;
50 StringList
= POINTER TO ARRAY OF String
;
52 Selector
= POINTER TO RECORD
58 Module
= POINTER TO RECORD
61 selectors
: Selector
; (* with head, list of selectors for this module *)
62 depth
: INTEGER; (* 0: leaf, MAX: root *)
64 imp
: ARRAY maxImps
OF Module
;
66 worker
: DswProcs
.Process
;
71 mno
, rno
: INTEGER; (* num modules *)
72 modList
, lnkList
, cmpList
: ARRAY maxImps
OF Module
;
73 def
: Selector
; (* with head, global list of selectors *)
74 processor
, compiler
, os
, linker
: INTEGER;
75 cpcExe
, cplExe
: String
;
76 cpcArgs
, cplArgs
: StringList
;
81 PROCEDURE Error (e
: INTEGER; IN p0
, p1
: ARRAY OF CHAR; i2
: INTEGER);
82 VAR msg
, p2
: ARRAY 128 OF CHAR;
85 |
0: msg
:= "option -D expect + or - after identifier"
86 |
1: msg
:= "option -D expect identifier"
87 |
2: msg
:= "option -U expect identifier"
88 |
3: msg
:= "module name must be identifier"
89 |
4: msg
:= "expected integer" (* p0 = in str *)
90 |
5: msg
:= "unterminated string"
91 |
6: msg
:= "unknown processor ^0"
92 |
7: msg
:= "unknown os ^0"
93 |
8: msg
:= "unknown compiler ^0"
94 |
9: msg
:= "unknown linker ^0"
95 |
10: msg
:= "missing argument for option ^0"
96 |
11: msg
:= "unknown option ^0"
97 |
12: msg
:= "compiler not selected"
98 |
13: msg
:= "processor not selected"
99 |
14: msg
:= "processor not supported by native compiler"
100 |
15: msg
:= "internal linker not required for cpfront"
101 |
16: msg
:= "cpfront can't out executable file"
102 |
17: msg
:= "linker not selected"
103 |
18: msg
:= "os not selected"
104 |
19: msg
:= "output file name can't be empty"
105 |
20: msg
:= "recursive import of ^0 in ^1"
106 |
21: msg
:= "unable to open module ^1"
107 |
22: msg
:= "linker terminated with code ^2"
108 |
23: msg
:= "unable to execute linker"
109 |
24: msg
:= "trap occured"
111 Strings
.IntToString(err
, msg
)
113 Strings
.IntToString(i2
, p2
);
114 Log
.String(Kernel
.argv
[0]$
); Log
.String(": ");
115 Log
.ParamMsg(msg
, p0
, p1
, p2
); Log
.Ln
;
119 (* --------- options --------- *)
121 PROCEDURE IdentLen (IN s
: ARRAY OF CHAR): INTEGER;
125 IF Strings
.IsIdentStart(s
[0]) THEN
126 REPEAT INC(i
) UNTIL ~Strings
.IsIdent(s
[i
])
131 PROCEDURE Define (n
: ARRAY OF CHAR);
132 VAR i
: INTEGER; v
: BOOLEAN; s
: Selector
;
136 IF ~
((n
[i
] = 0X
) OR (((n
[i
] = "+") OR (n
[i
] = "-")) & (n
[i
+ 1] = 0X
))) THEN
139 v
:= n
[i
] # "-"; n
[i
] := 0X
; s
:= def
;
140 WHILE (s
.next
# NIL) & (s
.next
.name$
# n$
) DO s
:= s
.next
END;
143 Strings
.StringToUtf8(n
, s
.next
.name
, i
);
152 PROCEDURE Undefine (IN n
: ARRAY OF CHAR);
153 VAR i
: INTEGER; s
: Selector
;
156 IF (i
# 0) & (n
[i
] = 0X
) THEN
158 WHILE (s
.next
# NIL) & (s
.next
.name$
# n$
) DO s
:= s
.next
END;
159 IF s
.next
# NIL THEN s
.next
:= s
.next
.next
END
165 PROCEDURE CopySelectorList (base
: Selector
): Selector
;
166 VAR s
, t
, x
: Selector
;
168 ASSERT(base
# NIL, 20);
169 s
:= base
; NEW(t
); x
:= t
;
172 IF s
.next
# NIL THEN NEW(x
.next
); x
:= x
.next
END;
176 END CopySelectorList
;
178 PROCEDURE AddModule (IN n
: ARRAY OF CHAR; selectors
: Selector
);
179 VAR i
, res
: INTEGER; m
: Module
;
182 IF (i
# 0) & (n
[i
] = 0X
) THEN
184 WHILE (i
< mno
) & (modList
[i
].name$
# n$
) DO INC(i
) END;
187 Strings
.StringToUtf8(n
, m
.name
, res
);
189 m
.selectors
:= CopySelectorList(selectors
);
198 PROCEDURE StrToInt (IN s
: ARRAY OF CHAR; def
: INTEGER): INTEGER;
201 Strings
.StringToInt(s
, x
, res
);
209 PROCEDURE NewStr (IN s
: ARRAY OF CHAR): String
;
212 NEW(p
, LEN(s$
) + 1); p^
:= s$
;
216 PROCEDURE ToStringList (IN s
: ARRAY OF CHAR): StringList
;
217 VAR i
: INTEGER; ch
, term
: CHAR; pars
: StringList
;
219 PROCEDURE AddChar (c
: CHAR);
220 VAR i
, n
, len
: INTEGER; str
: String
;
223 NEW(pars
, 1); NEW(pars
[0], 2); pars
[0, 0] := c
226 len
:= LEN(pars
[n
]$
);
228 FOR i
:= 0 TO len
- 1 DO
237 VAR i
, len
: INTEGER; p
: StringList
;
240 NEW(pars
, 1); i
:= 0;
244 FOR i
:= 0 TO len
- 1 DO
254 REPEAT ch
:= s
[i
]; INC(i
) UNTIL ch
# " ";
258 term := ch; ch := s[i]; INC(i);
259 WHILE (ch # term) & (ch # 0X) DO
260 AddChar(ch); ch := s[i]; INC(i)
262 IF ch # 0X THEN ch := s[i]; INC(i)
263 ELSE Error(5, "", "", 0)
266 REPEAT ch := s[i]; INC(i) UNTIL ch # " ";
267 IF ch # 0X THEN AddLine END
269 AddChar(ch); ch := s[i]; INC(i)
277 Log.String("Usage
: cpmake
[options
] module
..."); Log.Ln;
278 Log.String("Options
:"); Log.Ln;
279 Log.String(" -Tm cpu Generate code for specified processor
"); Log.Ln;
280 Log.String(" none Unknown
processor (cpfront only
)"); Log.Ln;
281 Log.String(" 486 Intel
486"); Log.Ln;
282 Log.String(" -Ts os Generate code for specified operation system
"); Log.Ln;
283 Log.String(" none Unknown operation system
"); Log.Ln;
284 Log.String(" linux Linux
"); Log.Ln;
285 Log.String(" -Tg compiler Specify Component Pascal compiler
"); Log.Ln;
286 Log.String(" native BlackBox based native code compiler
"); Log.Ln;
287 Log.String(" cpfront BlackBox based C code translator
"); Log.Ln;
288 Log.String(" -Ti linker Specify internal
linker (native only
)"); Log.Ln;
289 Log.String(" dev2 Dev2 based ELF
/PE linker
"); Log.Ln;
291 Log.String(" -Fp path Add path with project
"); Log.Ln;
292 Log.String(" -Fx path Add postfix for project directories
"); Log.Ln;
294 Log.String(" -Xp path Use executable file for Component Pascal compiler
"); Log.Ln;
295 Log.String(" -Xi path Use executable file for internal
linker (native only
)"); Log.Ln;
296 Log.String(" -Cg params Pass parameters to Component Pasacal compiler directly
"); Log.Ln;
297 Log.String(" -Ci params Pass parameters to internal linker directly
"); Log.Ln;
298 Log.String(" -a Enable automatic dependency resolution
"); Log.Ln;
299 Log.String(" -o name Generate executable file
"); Log.Ln;
300 Log.String(" -j num Specifies the number of jobs to run simultaneously
"); Log.Ln;
301 Log.String(' -D ident["+"|"-"] Add preprocessor selector'); Log.Ln;
302 Log.String(' -U ident Remove preprocessor selector'); Log.Ln;
303 Log.String(" -h Print help and quit
"); Log.Ln;
304 Log.String(" -V Print version and quit
"); Log.Ln;
310 Log.String(version); Log.Ln;
314 PROCEDURE ParseTargetOpts;
315 VAR s: DswOpts.String;
317 CASE DswOpts.GetOpt("m
:s
:g
:i
:") OF
320 Strings.ToLower(s, s);
321 IF s$ = "none
" THEN processor := anymach
322 ELSIF s$ = "486" THEN processor := mach386
323 ELSIF s$ = "68k
" THEN processor := mach68k
324 ELSE Error(6, s, "", 0)
328 Strings.ToLower(s, s);
329 IF s$ = "none
" THEN os := anyos
330 ELSIF s$ = "linux
" THEN os := linux
331 ELSIF s$ = "freebsd
" THEN os := freebsd
332 ELSIF s$ = "openbsd
" THEN os := openbsd
333 ELSIF s$ = "win32
" THEN os := win32
334 ELSIF s$ = "cygwin
" THEN os := cygwin
335 ELSIF s$ = "darwin
" THEN os := darwin
336 ELSE Error(7, s, "", 0)
340 Strings.ToLower(s, s);
341 IF s$ = "native
" THEN compiler := cpnative
342 ELSIF s$ = "cpfront
" THEN compiler := cpfront
343 ELSE Error(8, s, "", 0)
347 Strings.ToLower(s, s);
348 IF s$ = "dev2
" THEN linker := dev2
349 ELSE Error(9, s, "", 0)
351 | ":": Error(10, "-T
" + DswOpts.str, "", 0)
352 | "?
": Error(11, "-T
" + DswOpts.str, "", 0)
353 | 0X: Error(11, "-T
", "", 0)
357 PROCEDURE ParseCommandOpts;
359 CASE DswOpts.GetOpt("g
:i
:") OF
360 | "g
": cpcArgs := ToStringList(DswOpts.str);
361 | "i
": cplArgs := ToStringList(DswOpts.str);
362 | ":": Error(10, "-C
" + DswOpts.str, "", 0)
363 | "?
": Error(11, "-C
" + DswOpts.str, "", 0)
364 | 0X: Error(11, "-C
", "", 0)
366 END ParseCommandOpts;
368 PROCEDURE ParseExternalOpts;
370 CASE DswOpts.GetOpt("g
:i
:") OF
371 | "g
": cpcExe := DswOpts.str;
372 | "i
": cplExe := DswOpts.str;
373 | ":": Error(10, "-X
" + DswOpts.str, "", 0)
374 | "?
": Error(11, "-X
" + DswOpts.str, "", 0)
375 | 0X: Error(11, "-X
", "", 0)
377 END ParseExternalOpts;
381 exe := NIL; auto := FALSE; jobs := 1; def.next := NIL; mno := 0; rno := 0;
382 processor := anymach; os := anyos; compiler := anycp;
384 CASE DswOpts.GetOpt("ao
:j
:D
:U
:TCXhV
") OF
386 | "o
": exe := DswOpts.str
387 | "j
": jobs := MIN(MAX(StrToInt(DswOpts.str, 1), 1), maxJobs)
390 | "D
": Define(DswOpts.str)
391 | "U
": Undefine(DswOpts.str)
392 | "T
": ParseTargetOpts
393 | "C
": ParseCommandOpts
394 | "X
": ParseExternalOpts
395 | ":": Error(10, "-" + DswOpts.str, "", 0)
396 | "?
": Error(11, "-" + DswOpts.str, "", 0)
397 | "$
": AddModule(DswOpts.str, def)
403 PROCEDURE CheckParams;
405 IF compiler = anycp THEN
407 ELSIF compiler = cpnative THEN
408 IF processor = anymach THEN
410 ELSIF processor # mach386 THEN
414 IF (compiler = cpfront) & (linker # anyint) THEN
417 IF (compiler = cpfront) & (exe # NIL) THEN
420 IF (exe # NIL) & (compiler = cpnative) & (linker = anyint) THEN
423 IF (linker = dev2) & (os = anyos) THEN
426 IF (exe # NIL) & (exe^ = "") THEN
430 IF compiler = cpnative THEN cpcExe := NewStr("cpc486
")
431 ELSIF compiler = cpfront THEN cpcExe := NewStr("cpfront
")
435 IF linker = dev2 THEN cplExe := NewStr("cpl486
") END
439 (* --------- loader --------- *)
441 PROCEDURE Import (m: Module; IN name: DevCPT.Name);
442 VAR i, j: INTEGER; imp: Module;
445 ASSERT(name # "", 21);
446 IF debugImport THEN Log.String(" import
"); Log.String(name$) END;
447 IF name = "SYSTEM
" THEN INCL(DevCPM.options, DevCPM.sysImp)
448 ELSIF name = "COM
" THEN INCL(DevCPM.options, DevCPM.com)
449 ELSIF name = "JAVA
" THEN INCL(DevCPM.options, DevCPM.java)
451 IF debugImport THEN Log.Char(" ") END;
452 i := 0; (* find module in local list *)
453 WHILE (i < m.mno) & (m.imp[i].name$ # name$) DO INC(i) END;
455 j := 0; (* find module in global list *)
456 WHILE (j < mno) & (modList[j].name$ # name$) DO INC(j) END;
459 Log.String("module
" + name + " required before
" + m.name); Log.Ln; INC(werr)
461 NEW(imp); imp.name := name$; imp.selectors := CopySelectorList(m.selectors);
462 modList[mno] := imp; INC(mno)
466 m.imp[m.mno] := imp; INC(m.mno)
470 IF debugImport THEN Log.Ln END;
473 PROCEDURE ParseModule (m: Module);
474 VAR sym: BYTE; SelfName, impName, aliasName: DevCPT.Name;
476 PROCEDURE err (n: SHORTINT);
480 PROCEDURE CheckSym(s: SHORTINT);
482 IF sym = s THEN DevCPS.Get(sym) ELSE DevCPM.err(s) END
486 IF debugImport THEN Log.String("module
" + m.name); Log.Ln END;
487 DevCPS.Init; DevCPS.Get(sym);
488 IF sym = module THEN DevCPS.Get(sym) ELSE err(16) END;
490 SelfName := DevCPS.name$; DevCPS.Get(sym);
492 INCL(DevCPM.options, DevCPM.interface); DevCPS.Get(sym);
493 IF sym = eql THEN DevCPS.Get(sym)
494 ELSE INCL(DevCPM.options, DevCPM.noCode)
496 IF sym = string THEN INCL(m.flags, library); DevCPS.Get(sym)
502 IF sym = import THEN DevCPS.Get(sym);
505 aliasName := DevCPS.name$; impName := aliasName$; DevCPS.Get(sym);
506 IF sym = becomes THEN DevCPS.Get(sym);
507 IF sym = ident THEN impName := DevCPS.name$; DevCPS.Get(sym) ELSE err(ident) END
512 IF sym = comma THEN DevCPS.Get(sym)
513 ELSIF sym = ident THEN err(comma)
519 LOOP (* preprocessor must read module fully *)
525 IF DevCPS.name # SelfName THEN err(4) END;
547 PROCEDURE CheckModule (m: Module; source: String; OUT ok: BOOLEAN);
552 DevCPM.symList := m.insym;
553 DevCPM.codePath := m.outcode;
554 DevCPM.symPath := m.outsym;
556 DevCPM.name := m.name$;
558 IF m.found THEN INCL(DevCPM.options, DevCPM.comAware) END;
559 IF errorTrap IN m.opts THEN INCL(DevCPM.options, DevCPM.trap) END;
560 IF oberon IN m.opts THEN INCL(DevCPM.options, DevCPM.oberon) END;
563 s := m.selectors.next;
565 DevCPR.Set(s.name, s.value);
577 PROCEDURE GetSource (IN modName: ARRAY OF CHAR; OUT path: Files.Name; OUT s: String);
578 CONST modDir = "Mod
"; sysDir = "System
";
579 VAR dir, name: Files.Name; loc: Files.Locator;
580 text: DswDocuments.Model; r: DswDocuments.Reader; i, res: INTEGER;
582 PROCEDURE MakePath (dir, name: Files.Name; type: Files.Type; OUT path: Files.Name);
584 ASSERT(name # "", 21);
585 IF dir = "" THEN path := modDir + "/" + name
586 ELSE path := dir + "/" + modDir + "/" + name
588 Kernel.MakeFileName(path, type)
592 s := NIL; path := "";
593 Kernel.SplitName(modName, dir, name);
594 loc := Files.dir.This(dir).This(modDir);
595 (* --> Kernel.MakeFileName(name, Kernel.docType); <-- *)
596 MakePath(dir, name, "cp
", path);
597 DswDocuments.Open(loc, name + ".cp
", text, res);
599 MakePath(dir, name, "odc
", path);
600 DswDocuments.Open(loc, name + ".odc
", text, res);
601 IF (text = NIL) & (dir = "") THEN
602 MakePath(sysDir, name, "cp
", path);
603 loc := Files.dir.This(sysDir).This(modDir);
604 DswDocuments.Open(loc, name + ".cp
", text, res);
606 MakePath(sysDir, name, "odc
", path);
607 DswDocuments.Open(loc, name + ".odc
", text, res);
615 NEW(s, text.Length() + 1);
617 r := text.NewReader(NIL);
618 FOR i := 0 TO text.Length() - 1 DO
619 r.Read; s[i] := r.char
625 PROCEDURE Trace (m, parent: Module; VAR lno: INTEGER);
628 IF ~(trace IN m.flags) THEN
629 INCL(m.flags, trace);
630 FOR i := 0 TO m.mno - 1 DO
631 Trace(m.imp[i], m, lno);
632 m.depth := MAX(m.depth, m.imp[i].depth + 1)
634 IF ~(imported IN m.flags) THEN
635 INCL(m.flags, imported);
641 Error(20, m.name$, parent.name$, 0)
646 VAR i, j: INTEGER; m: Module;
648 ASSERT((mno = 0) OR (lnkList[0] # NIL), 20);
654 WHILE (j >= 0) & (cmpList[j].depth > m.depth) DO
655 cmpList[j + 1] := cmpList[j];
664 VAR i, j, num: INTEGER; m: Module; s: String; ok: BOOLEAN;
667 WHILE (err = 0) & (i < mno) DO
669 GetSource(m.name$, m.path, s);
671 CheckModule(m, s, ok);
672 IF ~ok THEN INC(err) END
674 Error(21, m.name$, "", 0)
680 FOR i := 0 TO rno - 1 DO
681 Trace(modList[i], modList[i], num)
683 ASSERT((err # 0) OR (num = mno), 100);
686 Log.String("Parallel depth
:"); Log.Ln;
687 FOR i := 0 TO mno - 1 DO
688 Log.String(" " + cmpList[i].name); Log.Int(cmpList[i].depth); Log.Ln;
693 PROCEDURE IsCompiled (m: Module): BOOLEAN;
694 CONST target = {hasSym, hasObj};
695 VAR i: INTEGER; ready: BOOLEAN;
699 ready := ~(hasErrors IN m.flags) & (m.flags * target = target);
700 WHILE ready & (i < m.mno) DO
701 ready := IsCompiled(m.imp[i]);
707 PROCEDURE Ready (m: Module): BOOLEAN;
708 CONST target = {hasSym, hasObj};
709 VAR i: INTEGER; ready: BOOLEAN;
712 ready := ~(hasErrors IN m.flags) & (m.flags * target # target) & (m.worker = NIL);
713 WHILE ready & (i < m.mno) DO
714 ready := IsCompiled(m.imp[i]);
720 PROCEDURE PutParams (w: DswProcs.Process; p: StringList);
724 IF debugArgs THEN Log.String("PutParams
") END;
726 IF debugArgs THEN Log.String(":[" + p[0]) END;
728 FOR i := 1 TO LEN(p) - 1 DO
729 IF debugArgs THEN Log.String("|
" + p[i]) END;
732 IF debugArgs THEN Log.Char("]") END
734 IF debugArgs THEN Log.Ln END
737 PROCEDURE ExecuteCompiler (m: Module): DswProcs.Process;
738 VAR w: DswProcs.Process; ok: BOOLEAN;
741 ASSERT(m.path # "", 21);
742 ASSERT(m.worker = NIL, 22);
743 w := DswProcs.dir.New();
745 w.PutParam("-legacy
");
746 PutParams(w, cpcArgs);
749 w.PutParam("-define
+"); w.PutParam("CPFRONT
");
750 w.PutParam("-define
-"); w.PutParam("NATIVE
");
752 w.PutParam("-define
-"); w.PutParam("CPFRONT
");
753 w.PutParam("-define
+"); w.PutParam("NATIVE
");
757 w.PutParam("-define
+"); w.PutParam("I486
");
758 w.PutParam("-define
-"); w.PutParam("M68K
");
760 w.PutParam("-define
+"); w.PutParam("I486
");
761 w.PutParam("-define
-"); w.PutParam("M68K
");
763 w.PutParam("-define
-"); w.PutParam("I486
");
764 w.PutParam("-define
-"); w.PutParam("M68K
");
768 w.PutParam("-define
-"); w.PutParam("POSIX
");
769 w.PutParam("-define
-"); w.PutParam("LINUX
");
770 w.PutParam("-define
-"); w.PutParam("FREEBSD
");
771 w.PutParam("-define
-"); w.PutParam("OPENBSD
");
772 w.PutParam("-define
-"); w.PutParam("WIN32
");
773 w.PutParam("-define
-"); w.PutParam("DARWIN
");
775 w.PutParam("-define
+"); w.PutParam("POSIX
");
776 w.PutParam("-define
+"); w.PutParam("LINUX
");
777 w.PutParam("-define
-"); w.PutParam("FREEBSD
");
778 w.PutParam("-define
-"); w.PutParam("OPENBSD
");
779 w.PutParam("-define
-"); w.PutParam("WIN32
");
780 w.PutParam("-define
-"); w.PutParam("DARWIN
");
782 w.PutParam("-define
+"); w.PutParam("POSIX
");
783 w.PutParam("-define
-"); w.PutParam("LINUX
");
784 w.PutParam("-define
+"); w.PutParam("FREEBSD
");
785 w.PutParam("-define
-"); w.PutParam("OPENBSD
");
786 w.PutParam("-define
-"); w.PutParam("WIN32
");
787 w.PutParam("-define
-"); w.PutParam("CYGWIN
");
788 w.PutParam("-define
-"); w.PutParam("DARWIN
");
790 w.PutParam("-define
+"); w.PutParam("POSIX
");
791 w.PutParam("-define
-"); w.PutParam("LINUX
");
792 w.PutParam("-define
-"); w.PutParam("FREEBSD
");
793 w.PutParam("-define
+"); w.PutParam("OPENBSD
");
794 w.PutParam("-define
-"); w.PutParam("WIN32
");
795 w.PutParam("-define
-"); w.PutParam("CYGWIN
");
796 w.PutParam("-define
-"); w.PutParam("DARWIN
");
798 w.PutParam("-define
-"); w.PutParam("POSIX
");
799 w.PutParam("-define
-"); w.PutParam("LINUX
");
800 w.PutParam("-define
-"); w.PutParam("FREEBSD
");
801 w.PutParam("-define
-"); w.PutParam("OPENBSD
");
802 w.PutParam("-define
+"); w.PutParam("WIN32
");
803 w.PutParam("-define
-"); w.PutParam("CYGWIN
");
804 w.PutParam("-define
-"); w.PutParam("DARWIN
");
806 w.PutParam("-define
+"); w.PutParam("POSIX
");
807 w.PutParam("-define
-"); w.PutParam("LINUX
");
808 w.PutParam("-define
-"); w.PutParam("FREEBSD
");
809 w.PutParam("-define
-"); w.PutParam("OPENBSD
");
810 w.PutParam("-define
+"); w.PutParam("WIN32
");
811 w.PutParam("-define
+"); w.PutParam("CYGWIN
");
812 w.PutParam("-define
-"); w.PutParam("DARWIN
");
814 w.PutParam("-define
+"); w.PutParam("POSIX
");
815 w.PutParam("-define
-"); w.PutParam("LINUX
");
816 w.PutParam("-define
-"); w.PutParam("FREEBSD
");
817 w.PutParam("-define
-"); w.PutParam("OPENBSD
");
818 w.PutParam("-define
-"); w.PutParam("WIN32
");
819 w.PutParam("-define
-"); w.PutParam("CYGWIN
");
820 w.PutParam("-define
+"); w.PutParam("DARWIN
");
824 w.PutParam("-define
+"); w.PutParam("DEV2
");
826 w.PutParam("-define
-"); w.PutParam("DEV2
");
831 Log.String("Compile
" + m.name + " (" + m.path + ")"); Log.Ln;
839 VAR i, j, num: INTEGER; ok: BOOLEAN; m: Module; w: DswProcs.Process;
841 IF mno = 0 THEN RETURN END;
843 WHILE (err = 0) & (num < mno) OR (j > 0) DO
845 WHILE (err = 0) & (i < mno) & (j < jobs) DO
848 w := ExecuteCompiler(m);
849 IF debugJobs THEN Log.String("Start job
" + m.name) END;
851 IF debugJobs THEN Log.String(" ok
") END;
855 IF debugJobs THEN Log.String(" fail
") END;
856 INCL(m.flags, hasErrors);
859 IF debugJobs THEN Log.Ln END
863 WHILE (err = 0) & (j >= jobs) OR (j > 0) DO
865 WHILE (j > 0) & (i < mno) DO
868 IF (w # NIL) & w.IsTerminated() THEN
869 IF debugJobs THEN Log.String("Stop job
" + m.name); Log.Int(w.Result()); Log.Ln END;
870 IF w.Result() = 0 THEN
871 INCL(m.flags, hasObj);
872 INCL(m.flags, hasSym);
875 INCL(m.flags, hasErrors);
888 VAR p: DswProcs.Process; i, res: INTEGER; ok: BOOLEAN;
890 ASSERT((exe # NIL) & (exe^ # ""), 20);
891 ASSERT(processor = mach386, 21);
892 ASSERT(compiler = cpnative, 22);
893 p := DswProcs.dir.New();
898 | linux: p.PutParam("linux
")
899 | freebsd: p.PutParam("freebsd
")
900 | openbsd: p.PutParam("openbsd
")
901 | win32, cygwin: p.PutParam("win32
")
902 | darwin: p.PutParam("darwin
")
905 p.PutParam("-kernel
");
906 p.PutParam("Kernel
");
908 p.PutParam("Kernel
");
909 p.PutParam("-legacycodedir
");
913 PutParams(p, cplArgs);
916 IF ~(library IN lnkList[i].flags) THEN
917 p.PutParam(lnkList[i].name$)
923 Log.String("Link
"); Log.String(exe); Log.Ln;
926 Error(22, "", "", res)
937 | anyint: (* do not link *)
944 VAR m: Module; s: Selector; p: DswProcs.Process; ok: BOOLEAN; i, res: INTEGER;
946 IF Kernel.trapCount = 0 THEN
960 ELSE Error(24, "", "", 0)
962 IF err = 0 THEN Kernel.Quit(0)