Subversion Repositories Kolibri OS

Rev

Rev 7696 | 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,
11
       ERRORS, STRINGS, WRITER, MSP430, THUMB, TARGETS;
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;
18
    end:   BOOLEAN;
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;
7597 akron1 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
 
7597 akron1 116
        ELSIF param = "-pic" THEN
7693 akron1 117
            options.pic := TRUE
6613 leency 118
 
7597 akron1 119
        ELSIF param = "" THEN
120
            end := TRUE
6613 leency 121
 
7107 akron1 122
        ELSE
7693 akron1 123
            ERRORS.BadParam(param)
7107 akron1 124
        END;
6613 leency 125
 
7597 akron1 126
        INC(i)
7693 akron1 127
    UNTIL end;
6613 leency 128
 
7693 akron1 129
    options.checking := checking
7597 akron1 130
END keys;
6613 leency 131
 
132
 
7983 leency 133
PROCEDURE OutTargetItem (target: INTEGER; text: ARRAY OF CHAR);
134
VAR
135
    width: INTEGER;
136
 
137
BEGIN
138
    width := 15;
139
    width := width - LENGTH(TARGETS.Targets[target].ComLinePar) - 4;
140
    C.String("  '"); C.String(TARGETS.Targets[target].ComLinePar); C.String("'");
141
    WHILE width > 0 DO
142
        C.String(20X);
143
        DEC(width)
144
    END;
145
    C.StringLn(text)
146
END OutTargetItem;
147
 
148
 
7597 akron1 149
PROCEDURE main;
150
VAR
151
    path:       PARS.PATH;
152
    inname:     PARS.PATH;
153
    ext:        PARS.PATH;
154
    app_path:   PARS.PATH;
155
    lib_path:   PARS.PATH;
156
    modname:    PARS.PATH;
157
    outname:    PARS.PATH;
158
    param:      PARS.PATH;
159
    temp:       PARS.PATH;
160
    target:     INTEGER;
161
    time:       INTEGER;
7693 akron1 162
    options:    PROG.OPTIONS;
6613 leency 163
 
164
BEGIN
7693 akron1 165
    options.stack := 2;
166
    options.version := 65536;
167
    options.pic := FALSE;
168
    options.checking := ST.chkALL;
6613 leency 169
 
7597 akron1 170
    PATHS.GetCurrentDirectory(app_path);
171
    lib_path := app_path;
6613 leency 172
 
7597 akron1 173
    UTILS.GetArg(1, inname);
6613 leency 174
 
7693 akron1 175
    C.Ln;
7983 leency 176
    C.String("Akron Oberon Compiler v"); C.Int(UTILS.vMajor); C.String("."); C.Int2(UTILS.vMinor);
7693 akron1 177
        C.String(" ("); C.Int(UTILS.bit_depth); C.StringLn("-bit)");
7983 leency 178
    C.StringLn("Copyright (c) 2018-2020, Anton Krotov");
7693 akron1 179
 
7597 akron1 180
    IF inname = "" THEN
7693 akron1 181
        C.Ln;
7696 akron1 182
        C.StringLn("Usage: Compiler 
[optional settings]"); C.Ln;
7983 leency 183
        C.StringLn("target =");
7597 akron1 184
        IF UTILS.bit_depth = 64 THEN
7983 leency 185
            OutTargetItem(TARGETS.Win64C, "Windows64 Console");
186
            OutTargetItem(TARGETS.Win64GUI, "Windows64 GUI");
187
            OutTargetItem(TARGETS.Win64DLL, "Windows64 DLL");
188
            OutTargetItem(TARGETS.Linux64, "Linux64 Exec");
189
            OutTargetItem(TARGETS.Linux64SO, "Linux64 SO")
7107 akron1 190
        END;
7983 leency 191
        OutTargetItem(TARGETS.Win32C, "Windows32 Console");
192
        OutTargetItem(TARGETS.Win32GUI, "Windows32 GUI");
193
        OutTargetItem(TARGETS.Win32DLL, "Windows32 DLL");
194
        OutTargetItem(TARGETS.Linux32, "Linux32 Exec");
195
        OutTargetItem(TARGETS.Linux32SO, "Linux32 SO");
196
        OutTargetItem(TARGETS.KolibriOS, "KolibriOS Exec");
197
        OutTargetItem(TARGETS.KolibriOSDLL, "KolibriOS DLL");
198
        OutTargetItem(TARGETS.MSP430, "MSP430x{1,2}xx microcontrollers");
199
        OutTargetItem(TARGETS.STM32CM3, "STM32 Cortex-M3 microcontrollers");
200
        C.Ln;
7597 akron1 201
        C.StringLn("optional settings:"); C.Ln;
7983 leency 202
        C.StringLn("  -out       output"); C.Ln;
203
        C.StringLn("  -stk            set size of stack in Mbytes (Windows, Linux, KolibriOS)"); C.Ln;
204
        C.StringLn("  -nochk <'ptibcwra'>   disable runtime checking (pointers, types, indexes,");
205
        C.StringLn("                        BYTE, CHR, WCHR)"); C.Ln;
206
        C.StringLn("  -ver     set version of program (KolibriOS DLL)"); C.Ln;
207
        C.StringLn("  -ram            set size of RAM in bytes (MSP430) or Kbytes (STM32)"); C.Ln;
208
        C.StringLn("  -rom            set size of ROM in bytes (MSP430) or Kbytes (STM32)"); C.Ln;
7597 akron1 209
        UTILS.Exit(0)
6613 leency 210
    END;
211
 
7983 leency 212
    C.StringLn("--------------------------------------------");
7597 akron1 213
    PATHS.split(inname, path, modname, ext);
6613 leency 214
 
7983 leency 215
    IF ext # UTILS.FILE_EXT THEN
7693 akron1 216
        ERRORS.Error(207)
6613 leency 217
    END;
7693 akron1 218
 
7597 akron1 219
    IF PATHS.isRelative(path) THEN
220
        PATHS.RelPath(app_path, path, temp);
221
        path := temp
6613 leency 222
    END;
223
 
7696 akron1 224
    UTILS.GetArg(2, param);
7597 akron1 225
    IF param = "" THEN
7693 akron1 226
        ERRORS.Error(205)
6613 leency 227
    END;
228
 
7983 leency 229
    IF TARGETS.Select(param) THEN
230
        target := TARGETS.target
231
    ELSE
7693 akron1 232
        ERRORS.Error(206)
6613 leency 233
    END;
234
 
7983 leency 235
    IF target = TARGETS.MSP430 THEN
7693 akron1 236
        options.ram := MSP430.minRAM;
237
        options.rom := MSP430.minROM
238
    END;
6613 leency 239
 
7983 leency 240
    IF target = TARGETS.STM32CM3 THEN
241
        options.ram := THUMB.STM32_minRAM;
242
        options.rom := THUMB.STM32_minROM
243
    END;
244
 
245
    IF UTILS.bit_depth < TARGETS.BitDepth THEN
7693 akron1 246
        ERRORS.Error(206)
6613 leency 247
    END;
248
 
7597 akron1 249
    STRINGS.append(lib_path, "lib");
250
    STRINGS.append(lib_path, UTILS.slash);
7983 leency 251
    STRINGS.append(lib_path, TARGETS.LibDir);
7597 akron1 252
    STRINGS.append(lib_path, UTILS.slash);
6613 leency 253
 
7696 akron1 254
    keys(options, outname);
255
    IF outname = "" THEN
256
        outname := path;
257
        STRINGS.append(outname, modname);
7983 leency 258
        STRINGS.append(outname, TARGETS.FileExt)
7696 akron1 259
    ELSE
260
        IF PATHS.isRelative(outname) THEN
261
            PATHS.RelPath(app_path, outname, temp);
262
            outname := temp
263
        END
264
    END;
265
 
7983 leency 266
    PARS.init(options);
6613 leency 267
 
7693 akron1 268
    ST.compile(path, lib_path, modname, outname, target, options);
269
 
7597 akron1 270
    time := UTILS.GetTickCount() - UTILS.time;
7983 leency 271
    C.StringLn("--------------------------------------------");
7696 akron1 272
    C.Int(PARS.lines); C.String(" lines, ");
7597 akron1 273
    C.Int(time DIV 100); C.String("."); C.Int2(time MOD 100); C.String(" sec, ");
274
    C.Int(WRITER.counter); C.StringLn(" bytes");
6613 leency 275
 
7597 akron1 276
    UTILS.Exit(0)
277
END main;
278
 
279
 
6613 leency 280
BEGIN
7597 akron1 281
    main
7983 leency 282
END Compiler.