Subversion Repositories Kolibri OS

Rev

Rev 9847 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
7983 leency 1
(*
7597 akron1 2
    BSD 2-Clause License
6613 leency 3
 
9893 akron1 4
    Copyright (c) 2018-2023, Anton Krotov
7597 akron1 5
    All rights reserved.
6613 leency 6
*)
7
 
8
MODULE Compiler;
9
 
7983 leency 10
IMPORT ST := STATEMENTS, PARS, UTILS, PATHS, PROG, C := CONSOLE,
9177 akron1 11
       ERRORS, STRINGS, WRITER, MSP430, THUMB, TARGETS, SCAN, TEXTDRV;
6613 leency 12
 
13
 
8859 leency 14
CONST
15
 
16
    DEF_WINDOWS   = "WINDOWS";
17
    DEF_LINUX     = "LINUX";
18
    DEF_KOLIBRIOS = "KOLIBRIOS";
19
    DEF_CPU_X86   = "CPU_X86";
20
    DEF_CPU_X8664 = "CPU_X8664";
21
 
22
 
7696 akron1 23
PROCEDURE keys (VAR options: PROG.OPTIONS; VAR out: PARS.PATH);
6613 leency 24
VAR
7597 akron1 25
    param: PARS.PATH;
26
    i, j:  INTEGER;
8097 maxcodehac 27
    _end:  BOOLEAN;
7597 akron1 28
    value: INTEGER;
29
    minor,
30
    major: INTEGER;
7693 akron1 31
    checking: SET;
6613 leency 32
 
9177 akron1 33
 
34
    PROCEDURE getVal (VAR i: INTEGER; VAR value: INTEGER);
35
    VAR
36
        param: PARS.PATH;
37
        val: INTEGER;
38
    BEGIN
39
        INC(i);
40
        UTILS.GetArg(i, param);
41
        IF STRINGS.StrToInt(param, val) THEN
42
            value := val
43
        END;
44
        IF param[0] = "-" THEN
45
            DEC(i)
46
        END
47
    END getVal;
48
 
49
 
6613 leency 50
BEGIN
9893 akron1 51
    options.lower := TRUE;
7696 akron1 52
    out := "";
7693 akron1 53
    checking := options.checking;
8097 maxcodehac 54
    _end := FALSE;
7696 akron1 55
    i := 3;
7597 akron1 56
    REPEAT
57
        UTILS.GetArg(i, param);
6613 leency 58
 
7597 akron1 59
        IF param = "-stk" THEN
60
            INC(i);
61
            UTILS.GetArg(i, param);
62
            IF STRINGS.StrToInt(param, value) & (1 <= value) & (value <= 32) THEN
7693 akron1 63
                options.stack := value
7597 akron1 64
            END;
65
            IF param[0] = "-" THEN
66
                DEC(i)
67
            END
6613 leency 68
 
7696 akron1 69
        ELSIF param = "-out" THEN
7597 akron1 70
            INC(i);
71
            UTILS.GetArg(i, param);
72
            IF param[0] = "-" THEN
73
                DEC(i)
7696 akron1 74
            ELSE
75
                out := param
7597 akron1 76
            END
6613 leency 77
 
9177 akron1 78
        ELSIF param = "-tab" THEN
79
            getVal(i, options.tab)
80
 
7693 akron1 81
        ELSIF param = "-ram" THEN
9177 akron1 82
            getVal(i, options.ram)
7693 akron1 83
 
84
        ELSIF param = "-rom" THEN
9177 akron1 85
            getVal(i, options.rom)
7693 akron1 86
 
7597 akron1 87
        ELSIF param = "-nochk" THEN
88
            INC(i);
89
            UTILS.GetArg(i, param);
6613 leency 90
 
7597 akron1 91
            IF param[0] = "-" THEN
92
                DEC(i)
93
            ELSE
94
                j := 0;
95
                WHILE param[j] # 0X DO
6613 leency 96
 
7597 akron1 97
                    IF    param[j] = "p" THEN
98
                        EXCL(checking, ST.chkPTR)
99
                    ELSIF param[j] = "t" THEN
100
                        EXCL(checking, ST.chkGUARD)
101
                    ELSIF param[j] = "i" THEN
102
                        EXCL(checking, ST.chkIDX)
103
                    ELSIF param[j] = "b" THEN
104
                        EXCL(checking, ST.chkBYTE)
105
                    ELSIF param[j] = "c" THEN
106
                        EXCL(checking, ST.chkCHR)
107
                    ELSIF param[j] = "w" THEN
108
                        EXCL(checking, ST.chkWCHR)
109
                    ELSIF param[j] = "r" THEN
110
                        EXCL(checking, ST.chkCHR);
111
                        EXCL(checking, ST.chkWCHR);
112
                        EXCL(checking, ST.chkBYTE)
8859 leency 113
                    ELSIF param[j] = "s" THEN
114
                        EXCL(checking, ST.chkSTK)
7597 akron1 115
                    ELSIF param[j] = "a" THEN
116
                        checking := {}
117
                    END;
6613 leency 118
 
7597 akron1 119
                    INC(j)
7693 akron1 120
                END;
121
 
7597 akron1 122
            END
6613 leency 123
 
7597 akron1 124
        ELSIF param = "-ver" THEN
125
            INC(i);
126
            UTILS.GetArg(i, param);
127
            IF STRINGS.StrToVer(param, major, minor) THEN
7693 akron1 128
                options.version := major * 65536 + minor
7597 akron1 129
            END;
130
            IF param[0] = "-" THEN
131
                DEC(i)
132
            END
6613 leency 133
 
8097 maxcodehac 134
        ELSIF param = "-lower" THEN
135
            options.lower := TRUE
136
 
9893 akron1 137
        ELSIF param = "-upper" THEN
138
            options.lower := FALSE
139
 
7597 akron1 140
        ELSIF param = "-pic" THEN
7693 akron1 141
            options.pic := TRUE
6613 leency 142
 
9579 akron1 143
        ELSIF param = "-uses" THEN
144
            options.uses := TRUE
145
 
8097 maxcodehac 146
        ELSIF param = "-def" THEN
147
            INC(i);
148
            UTILS.GetArg(i, param);
149
            SCAN.NewDef(param)
150
 
7597 akron1 151
        ELSIF param = "" THEN
8097 maxcodehac 152
            _end := TRUE
6613 leency 153
 
7107 akron1 154
        ELSE
7693 akron1 155
            ERRORS.BadParam(param)
7107 akron1 156
        END;
6613 leency 157
 
7597 akron1 158
        INC(i)
8097 maxcodehac 159
    UNTIL _end;
6613 leency 160
 
7693 akron1 161
    options.checking := checking
7597 akron1 162
END keys;
6613 leency 163
 
164
 
7983 leency 165
PROCEDURE OutTargetItem (target: INTEGER; text: ARRAY OF CHAR);
166
VAR
167
    width: INTEGER;
168
 
169
BEGIN
170
    width := 15;
171
    width := width - LENGTH(TARGETS.Targets[target].ComLinePar) - 4;
172
    C.String("  '"); C.String(TARGETS.Targets[target].ComLinePar); C.String("'");
173
    WHILE width > 0 DO
174
        C.String(20X);
175
        DEC(width)
176
    END;
177
    C.StringLn(text)
178
END OutTargetItem;
179
 
180
 
7597 akron1 181
PROCEDURE main;
182
VAR
183
    path:       PARS.PATH;
184
    inname:     PARS.PATH;
185
    ext:        PARS.PATH;
186
    app_path:   PARS.PATH;
187
    lib_path:   PARS.PATH;
188
    modname:    PARS.PATH;
189
    outname:    PARS.PATH;
190
    param:      PARS.PATH;
191
    temp:       PARS.PATH;
192
    target:     INTEGER;
193
    time:       INTEGER;
7693 akron1 194
    options:    PROG.OPTIONS;
6613 leency 195
 
196
BEGIN
7693 akron1 197
    options.stack := 2;
9177 akron1 198
    options.tab := TEXTDRV.defTabSize;
7693 akron1 199
    options.version := 65536;
200
    options.pic := FALSE;
8097 maxcodehac 201
    options.lower := FALSE;
9579 akron1 202
    options.uses := FALSE;
7693 akron1 203
    options.checking := ST.chkALL;
6613 leency 204
 
7597 akron1 205
    PATHS.GetCurrentDirectory(app_path);
6613 leency 206
 
8859 leency 207
    UTILS.GetArg(0, temp);
208
    PATHS.split(temp, path, modname, ext);
209
    IF PATHS.isRelative(path) THEN
210
        PATHS.RelPath(app_path, path, temp);
211
        path := temp
212
    END;
213
    lib_path := path;
214
 
7597 akron1 215
    UTILS.GetArg(1, inname);
8859 leency 216
    STRINGS.replace(inname, "\", UTILS.slash);
217
    STRINGS.replace(inname, "/", UTILS.slash);
6613 leency 218
 
7693 akron1 219
    C.Ln;
7983 leency 220
    C.String("Akron Oberon Compiler v"); C.Int(UTILS.vMajor); C.String("."); C.Int2(UTILS.vMinor);
8859 leency 221
        C.String(" ("); C.Int(UTILS.bit_depth); C.StringLn("-bit) " + UTILS.Date);
9893 akron1 222
    C.StringLn("Copyright (c) 2018-2023, Anton Krotov");
7693 akron1 223
 
7597 akron1 224
    IF inname = "" THEN
7693 akron1 225
        C.Ln;
7696 akron1 226
        C.StringLn("Usage: Compiler 
[optional settings]"); C.Ln;
7983 leency 227
        C.StringLn("target =");
7597 akron1 228
        IF UTILS.bit_depth = 64 THEN
7983 leency 229
            OutTargetItem(TARGETS.Win64C, "Windows64 Console");
230
            OutTargetItem(TARGETS.Win64GUI, "Windows64 GUI");
231
            OutTargetItem(TARGETS.Win64DLL, "Windows64 DLL");
232
            OutTargetItem(TARGETS.Linux64, "Linux64 Exec");
233
            OutTargetItem(TARGETS.Linux64SO, "Linux64 SO")
7107 akron1 234
        END;
7983 leency 235
        OutTargetItem(TARGETS.Win32C, "Windows32 Console");
236
        OutTargetItem(TARGETS.Win32GUI, "Windows32 GUI");
237
        OutTargetItem(TARGETS.Win32DLL, "Windows32 DLL");
238
        OutTargetItem(TARGETS.Linux32, "Linux32 Exec");
239
        OutTargetItem(TARGETS.Linux32SO, "Linux32 SO");
240
        OutTargetItem(TARGETS.KolibriOS, "KolibriOS Exec");
241
        OutTargetItem(TARGETS.KolibriOSDLL, "KolibriOS DLL");
242
        OutTargetItem(TARGETS.MSP430, "MSP430x{1,2}xx microcontrollers");
243
        OutTargetItem(TARGETS.STM32CM3, "STM32 Cortex-M3 microcontrollers");
244
        C.Ln;
7597 akron1 245
        C.StringLn("optional settings:"); C.Ln;
7983 leency 246
        C.StringLn("  -out       output"); C.Ln;
247
        C.StringLn("  -stk            set size of stack in Mbytes (Windows, Linux, KolibriOS)"); C.Ln;
248
        C.StringLn("  -nochk <'ptibcwra'>   disable runtime checking (pointers, types, indexes,");
249
        C.StringLn("                        BYTE, CHR, WCHR)"); C.Ln;
9893 akron1 250
        C.StringLn("  -lower                allow lower case for keywords (default)"); C.Ln;
251
        C.StringLn("  -upper                only upper case for keywords"); C.Ln;
8097 maxcodehac 252
        C.StringLn("  -def      define conditional compilation symbol"); C.Ln;
7983 leency 253
        C.StringLn("  -ver     set version of program (KolibriOS DLL)"); C.Ln;
254
        C.StringLn("  -ram            set size of RAM in bytes (MSP430) or Kbytes (STM32)"); C.Ln;
255
        C.StringLn("  -rom            set size of ROM in bytes (MSP430) or Kbytes (STM32)"); C.Ln;
9177 akron1 256
        C.StringLn("  -tab           set width for tabs"); C.Ln;
9579 akron1 257
        C.StringLn("  -uses                 list imported modules"); C.Ln;
7597 akron1 258
        UTILS.Exit(0)
6613 leency 259
    END;
260
 
8859 leency 261
    C.Dashes;
7597 akron1 262
    PATHS.split(inname, path, modname, ext);
6613 leency 263
 
7983 leency 264
    IF ext # UTILS.FILE_EXT THEN
7693 akron1 265
        ERRORS.Error(207)
6613 leency 266
    END;
7693 akron1 267
 
7597 akron1 268
    IF PATHS.isRelative(path) THEN
269
        PATHS.RelPath(app_path, path, temp);
270
        path := temp
6613 leency 271
    END;
272
 
7696 akron1 273
    UTILS.GetArg(2, param);
7597 akron1 274
    IF param = "" THEN
7693 akron1 275
        ERRORS.Error(205)
6613 leency 276
    END;
277
 
8097 maxcodehac 278
    SCAN.NewDef(param);
279
 
7983 leency 280
    IF TARGETS.Select(param) THEN
281
        target := TARGETS.target
282
    ELSE
7693 akron1 283
        ERRORS.Error(206)
6613 leency 284
    END;
285
 
8859 leency 286
    IF TARGETS.CPU = TARGETS.cpuMSP430 THEN
7693 akron1 287
        options.ram := MSP430.minRAM;
288
        options.rom := MSP430.minROM
289
    END;
6613 leency 290
 
8859 leency 291
    IF (TARGETS.CPU = TARGETS.cpuTHUMB) & (TARGETS.OS = TARGETS.osNONE) THEN
292
        options.ram := THUMB.minRAM;
293
        options.rom := THUMB.minROM
7983 leency 294
    END;
295
 
296
    IF UTILS.bit_depth < TARGETS.BitDepth THEN
7693 akron1 297
        ERRORS.Error(206)
6613 leency 298
    END;
299
 
7597 akron1 300
    STRINGS.append(lib_path, "lib");
301
    STRINGS.append(lib_path, UTILS.slash);
7983 leency 302
    STRINGS.append(lib_path, TARGETS.LibDir);
7597 akron1 303
    STRINGS.append(lib_path, UTILS.slash);
6613 leency 304
 
7696 akron1 305
    keys(options, outname);
9177 akron1 306
    TEXTDRV.setTabSize(options.tab);
7696 akron1 307
    IF outname = "" THEN
308
        outname := path;
309
        STRINGS.append(outname, modname);
7983 leency 310
        STRINGS.append(outname, TARGETS.FileExt)
7696 akron1 311
    ELSE
312
        IF PATHS.isRelative(outname) THEN
313
            PATHS.RelPath(app_path, outname, temp);
314
            outname := temp
315
        END
316
    END;
317
 
7983 leency 318
    PARS.init(options);
6613 leency 319
 
8859 leency 320
    CASE TARGETS.OS OF
321
    |TARGETS.osNONE:
322
    |TARGETS.osWIN32,
323
     TARGETS.osWIN64:   SCAN.NewDef(DEF_WINDOWS)
324
    |TARGETS.osLINUX32,
325
     TARGETS.osLINUX64: SCAN.NewDef(DEF_LINUX)
326
    |TARGETS.osKOS:     SCAN.NewDef(DEF_KOLIBRIOS)
327
    END;
328
 
329
    CASE TARGETS.CPU OF
330
    |TARGETS.cpuX86:    SCAN.NewDef(DEF_CPU_X86)
331
    |TARGETS.cpuAMD64:  SCAN.NewDef(DEF_CPU_X8664)
332
    |TARGETS.cpuMSP430:
333
    |TARGETS.cpuTHUMB:
334
    |TARGETS.cpuRVM32I:
335
    |TARGETS.cpuRVM64I:
336
    END;
337
 
7693 akron1 338
    ST.compile(path, lib_path, modname, outname, target, options);
339
 
7597 akron1 340
    time := UTILS.GetTickCount() - UTILS.time;
8859 leency 341
    C.Dashes;
7696 akron1 342
    C.Int(PARS.lines); C.String(" lines, ");
7597 akron1 343
    C.Int(time DIV 100); C.String("."); C.Int2(time MOD 100); C.String(" sec, ");
344
    C.Int(WRITER.counter); C.StringLn(" bytes");
6613 leency 345
 
7597 akron1 346
    UTILS.Exit(0)
347
END main;
348
 
349
 
6613 leency 350
BEGIN
7597 akron1 351
    main
7983 leency 352
END Compiler.