Subversion Repositories Kolibri OS

Rev

Rev 7983 | Go to most recent revision | 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
 
7983 leency 4
    Copyright (c) 2018-2020, 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,
8097 maxcodehac 11
       ERRORS, STRINGS, WRITER, MSP430, THUMB, TARGETS, SCAN;
6613 leency 12
 
13
 
7696 akron1 14
PROCEDURE keys (VAR options: PROG.OPTIONS; VAR out: PARS.PATH);
6613 leency 15
VAR
7597 akron1 16
    param: PARS.PATH;
17
    i, j:  INTEGER;
8097 maxcodehac 18
    _end:  BOOLEAN;
7597 akron1 19
    value: INTEGER;
20
    minor,
21
    major: INTEGER;
7693 akron1 22
    checking: SET;
6613 leency 23
 
24
BEGIN
7696 akron1 25
    out := "";
7693 akron1 26
    checking := options.checking;
8097 maxcodehac 27
    _end := FALSE;
7696 akron1 28
    i := 3;
7597 akron1 29
    REPEAT
30
        UTILS.GetArg(i, param);
6613 leency 31
 
7597 akron1 32
        IF param = "-stk" THEN
33
            INC(i);
34
            UTILS.GetArg(i, param);
35
            IF STRINGS.StrToInt(param, value) & (1 <= value) & (value <= 32) THEN
7693 akron1 36
                options.stack := value
7597 akron1 37
            END;
38
            IF param[0] = "-" THEN
39
                DEC(i)
40
            END
6613 leency 41
 
7696 akron1 42
        ELSIF param = "-out" THEN
7597 akron1 43
            INC(i);
44
            UTILS.GetArg(i, param);
45
            IF param[0] = "-" THEN
46
                DEC(i)
7696 akron1 47
            ELSE
48
                out := param
7597 akron1 49
            END
6613 leency 50
 
7693 akron1 51
        ELSIF param = "-ram" THEN
52
            INC(i);
53
            UTILS.GetArg(i, param);
54
            IF STRINGS.StrToInt(param, value) THEN
55
                options.ram := value
56
            END;
57
            IF param[0] = "-" THEN
58
                DEC(i)
59
            END
60
 
61
        ELSIF param = "-rom" THEN
62
            INC(i);
63
            UTILS.GetArg(i, param);
64
            IF STRINGS.StrToInt(param, value) THEN
65
                options.rom := value
66
            END;
67
            IF param[0] = "-" THEN
68
                DEC(i)
69
            END
70
 
7597 akron1 71
        ELSIF param = "-nochk" THEN
72
            INC(i);
73
            UTILS.GetArg(i, param);
6613 leency 74
 
7597 akron1 75
            IF param[0] = "-" THEN
76
                DEC(i)
77
            ELSE
78
                j := 0;
79
                WHILE param[j] # 0X DO
6613 leency 80
 
7597 akron1 81
                    IF    param[j] = "p" THEN
82
                        EXCL(checking, ST.chkPTR)
83
                    ELSIF param[j] = "t" THEN
84
                        EXCL(checking, ST.chkGUARD)
85
                    ELSIF param[j] = "i" THEN
86
                        EXCL(checking, ST.chkIDX)
87
                    ELSIF param[j] = "b" THEN
88
                        EXCL(checking, ST.chkBYTE)
89
                    ELSIF param[j] = "c" THEN
90
                        EXCL(checking, ST.chkCHR)
91
                    ELSIF param[j] = "w" THEN
92
                        EXCL(checking, ST.chkWCHR)
93
                    ELSIF param[j] = "r" THEN
94
                        EXCL(checking, ST.chkCHR);
95
                        EXCL(checking, ST.chkWCHR);
96
                        EXCL(checking, ST.chkBYTE)
97
                    ELSIF param[j] = "a" THEN
98
                        checking := {}
99
                    END;
6613 leency 100
 
7597 akron1 101
                    INC(j)
7693 akron1 102
                END;
103
 
7597 akron1 104
            END
6613 leency 105
 
7597 akron1 106
        ELSIF param = "-ver" THEN
107
            INC(i);
108
            UTILS.GetArg(i, param);
109
            IF STRINGS.StrToVer(param, major, minor) THEN
7693 akron1 110
                options.version := major * 65536 + minor
7597 akron1 111
            END;
112
            IF param[0] = "-" THEN
113
                DEC(i)
114
            END
6613 leency 115
 
8097 maxcodehac 116
        ELSIF param = "-lower" THEN
117
            options.lower := TRUE
118
 
7597 akron1 119
        ELSIF param = "-pic" THEN
7693 akron1 120
            options.pic := TRUE
6613 leency 121
 
8097 maxcodehac 122
        ELSIF param = "-def" THEN
123
            INC(i);
124
            UTILS.GetArg(i, param);
125
            SCAN.NewDef(param)
126
 
7597 akron1 127
        ELSIF param = "" THEN
8097 maxcodehac 128
            _end := TRUE
6613 leency 129
 
7107 akron1 130
        ELSE
7693 akron1 131
            ERRORS.BadParam(param)
7107 akron1 132
        END;
6613 leency 133
 
7597 akron1 134
        INC(i)
8097 maxcodehac 135
    UNTIL _end;
6613 leency 136
 
7693 akron1 137
    options.checking := checking
7597 akron1 138
END keys;
6613 leency 139
 
140
 
7983 leency 141
PROCEDURE OutTargetItem (target: INTEGER; text: ARRAY OF CHAR);
142
VAR
143
    width: INTEGER;
144
 
145
BEGIN
146
    width := 15;
147
    width := width - LENGTH(TARGETS.Targets[target].ComLinePar) - 4;
148
    C.String("  '"); C.String(TARGETS.Targets[target].ComLinePar); C.String("'");
149
    WHILE width > 0 DO
150
        C.String(20X);
151
        DEC(width)
152
    END;
153
    C.StringLn(text)
154
END OutTargetItem;
155
 
156
 
7597 akron1 157
PROCEDURE main;
158
VAR
159
    path:       PARS.PATH;
160
    inname:     PARS.PATH;
161
    ext:        PARS.PATH;
162
    app_path:   PARS.PATH;
163
    lib_path:   PARS.PATH;
164
    modname:    PARS.PATH;
165
    outname:    PARS.PATH;
166
    param:      PARS.PATH;
167
    temp:       PARS.PATH;
168
    target:     INTEGER;
169
    time:       INTEGER;
7693 akron1 170
    options:    PROG.OPTIONS;
6613 leency 171
 
172
BEGIN
7693 akron1 173
    options.stack := 2;
174
    options.version := 65536;
175
    options.pic := FALSE;
8097 maxcodehac 176
    options.lower := FALSE;
7693 akron1 177
    options.checking := ST.chkALL;
6613 leency 178
 
7597 akron1 179
    PATHS.GetCurrentDirectory(app_path);
180
    lib_path := app_path;
6613 leency 181
 
7597 akron1 182
    UTILS.GetArg(1, inname);
6613 leency 183
 
7693 akron1 184
    C.Ln;
7983 leency 185
    C.String("Akron Oberon Compiler v"); C.Int(UTILS.vMajor); C.String("."); C.Int2(UTILS.vMinor);
7693 akron1 186
        C.String(" ("); C.Int(UTILS.bit_depth); C.StringLn("-bit)");
7983 leency 187
    C.StringLn("Copyright (c) 2018-2020, Anton Krotov");
7693 akron1 188
 
7597 akron1 189
    IF inname = "" THEN
7693 akron1 190
        C.Ln;
7696 akron1 191
        C.StringLn("Usage: Compiler 
[optional settings]"); C.Ln;
7983 leency 192
        C.StringLn("target =");
7597 akron1 193
        IF UTILS.bit_depth = 64 THEN
7983 leency 194
            OutTargetItem(TARGETS.Win64C, "Windows64 Console");
195
            OutTargetItem(TARGETS.Win64GUI, "Windows64 GUI");
196
            OutTargetItem(TARGETS.Win64DLL, "Windows64 DLL");
197
            OutTargetItem(TARGETS.Linux64, "Linux64 Exec");
198
            OutTargetItem(TARGETS.Linux64SO, "Linux64 SO")
7107 akron1 199
        END;
7983 leency 200
        OutTargetItem(TARGETS.Win32C, "Windows32 Console");
201
        OutTargetItem(TARGETS.Win32GUI, "Windows32 GUI");
202
        OutTargetItem(TARGETS.Win32DLL, "Windows32 DLL");
203
        OutTargetItem(TARGETS.Linux32, "Linux32 Exec");
204
        OutTargetItem(TARGETS.Linux32SO, "Linux32 SO");
205
        OutTargetItem(TARGETS.KolibriOS, "KolibriOS Exec");
206
        OutTargetItem(TARGETS.KolibriOSDLL, "KolibriOS DLL");
207
        OutTargetItem(TARGETS.MSP430, "MSP430x{1,2}xx microcontrollers");
208
        OutTargetItem(TARGETS.STM32CM3, "STM32 Cortex-M3 microcontrollers");
209
        C.Ln;
7597 akron1 210
        C.StringLn("optional settings:"); C.Ln;
7983 leency 211
        C.StringLn("  -out       output"); C.Ln;
212
        C.StringLn("  -stk            set size of stack in Mbytes (Windows, Linux, KolibriOS)"); C.Ln;
213
        C.StringLn("  -nochk <'ptibcwra'>   disable runtime checking (pointers, types, indexes,");
214
        C.StringLn("                        BYTE, CHR, WCHR)"); C.Ln;
8097 maxcodehac 215
        C.StringLn("  -lower                allow lower case for keywords"); C.Ln;
216
        C.StringLn("  -def      define conditional compilation symbol"); C.Ln;
7983 leency 217
        C.StringLn("  -ver     set version of program (KolibriOS DLL)"); C.Ln;
218
        C.StringLn("  -ram            set size of RAM in bytes (MSP430) or Kbytes (STM32)"); C.Ln;
219
        C.StringLn("  -rom            set size of ROM in bytes (MSP430) or Kbytes (STM32)"); C.Ln;
7597 akron1 220
        UTILS.Exit(0)
6613 leency 221
    END;
222
 
7983 leency 223
    C.StringLn("--------------------------------------------");
7597 akron1 224
    PATHS.split(inname, path, modname, ext);
6613 leency 225
 
7983 leency 226
    IF ext # UTILS.FILE_EXT THEN
7693 akron1 227
        ERRORS.Error(207)
6613 leency 228
    END;
7693 akron1 229
 
7597 akron1 230
    IF PATHS.isRelative(path) THEN
231
        PATHS.RelPath(app_path, path, temp);
232
        path := temp
6613 leency 233
    END;
234
 
7696 akron1 235
    UTILS.GetArg(2, param);
7597 akron1 236
    IF param = "" THEN
7693 akron1 237
        ERRORS.Error(205)
6613 leency 238
    END;
239
 
8097 maxcodehac 240
    SCAN.NewDef(param);
241
 
7983 leency 242
    IF TARGETS.Select(param) THEN
243
        target := TARGETS.target
244
    ELSE
7693 akron1 245
        ERRORS.Error(206)
6613 leency 246
    END;
247
 
7983 leency 248
    IF target = TARGETS.MSP430 THEN
7693 akron1 249
        options.ram := MSP430.minRAM;
250
        options.rom := MSP430.minROM
251
    END;
6613 leency 252
 
7983 leency 253
    IF target = TARGETS.STM32CM3 THEN
254
        options.ram := THUMB.STM32_minRAM;
255
        options.rom := THUMB.STM32_minROM
256
    END;
257
 
258
    IF UTILS.bit_depth < TARGETS.BitDepth THEN
7693 akron1 259
        ERRORS.Error(206)
6613 leency 260
    END;
261
 
7597 akron1 262
    STRINGS.append(lib_path, "lib");
263
    STRINGS.append(lib_path, UTILS.slash);
7983 leency 264
    STRINGS.append(lib_path, TARGETS.LibDir);
7597 akron1 265
    STRINGS.append(lib_path, UTILS.slash);
6613 leency 266
 
7696 akron1 267
    keys(options, outname);
268
    IF outname = "" THEN
269
        outname := path;
270
        STRINGS.append(outname, modname);
7983 leency 271
        STRINGS.append(outname, TARGETS.FileExt)
7696 akron1 272
    ELSE
273
        IF PATHS.isRelative(outname) THEN
274
            PATHS.RelPath(app_path, outname, temp);
275
            outname := temp
276
        END
277
    END;
278
 
7983 leency 279
    PARS.init(options);
6613 leency 280
 
7693 akron1 281
    ST.compile(path, lib_path, modname, outname, target, options);
282
 
7597 akron1 283
    time := UTILS.GetTickCount() - UTILS.time;
7983 leency 284
    C.StringLn("--------------------------------------------");
7696 akron1 285
    C.Int(PARS.lines); C.String(" lines, ");
7597 akron1 286
    C.Int(time DIV 100); C.String("."); C.Int2(time MOD 100); C.String(" sec, ");
287
    C.Int(WRITER.counter); C.StringLn(" bytes");
6613 leency 288
 
7597 akron1 289
    UTILS.Exit(0)
290
END main;
291
 
292
 
6613 leency 293
BEGIN
7597 akron1 294
    main
7983 leency 295
END Compiler.