Subversion Repositories Kolibri OS

Rev

Rev 7696 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. (*
  2.     BSD 2-Clause License
  3.  
  4.     Copyright (c) 2018-2020, Anton Krotov
  5.     All rights reserved.
  6. *)
  7.  
  8. MODULE Compiler;
  9.  
  10. IMPORT ST := STATEMENTS, PARS, UTILS, PATHS, PROG, C := CONSOLE,
  11.        ERRORS, STRINGS, WRITER, MSP430, THUMB, TARGETS;
  12.  
  13.  
  14. PROCEDURE keys (VAR options: PROG.OPTIONS; VAR out: PARS.PATH);
  15. VAR
  16.     param: PARS.PATH;
  17.     i, j:  INTEGER;
  18.     end:   BOOLEAN;
  19.     value: INTEGER;
  20.     minor,
  21.     major: INTEGER;
  22.     checking: SET;
  23.  
  24. BEGIN
  25.     out := "";
  26.     checking := options.checking;
  27.     end := FALSE;
  28.     i := 3;
  29.     REPEAT
  30.         UTILS.GetArg(i, param);
  31.  
  32.         IF param = "-stk" THEN
  33.             INC(i);
  34.             UTILS.GetArg(i, param);
  35.             IF STRINGS.StrToInt(param, value) & (1 <= value) & (value <= 32) THEN
  36.                 options.stack := value
  37.             END;
  38.             IF param[0] = "-" THEN
  39.                 DEC(i)
  40.             END
  41.  
  42.         ELSIF param = "-out" THEN
  43.             INC(i);
  44.             UTILS.GetArg(i, param);
  45.             IF param[0] = "-" THEN
  46.                 DEC(i)
  47.             ELSE
  48.                 out := param
  49.             END
  50.  
  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.  
  71.         ELSIF param = "-nochk" THEN
  72.             INC(i);
  73.             UTILS.GetArg(i, param);
  74.  
  75.             IF param[0] = "-" THEN
  76.                 DEC(i)
  77.             ELSE
  78.                 j := 0;
  79.                 WHILE param[j] # 0X DO
  80.  
  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;
  100.  
  101.                     INC(j)
  102.                 END;
  103.  
  104.             END
  105.  
  106.         ELSIF param = "-ver" THEN
  107.             INC(i);
  108.             UTILS.GetArg(i, param);
  109.             IF STRINGS.StrToVer(param, major, minor) THEN
  110.                 options.version := major * 65536 + minor
  111.             END;
  112.             IF param[0] = "-" THEN
  113.                 DEC(i)
  114.             END
  115.  
  116.         ELSIF param = "-pic" THEN
  117.             options.pic := TRUE
  118.  
  119.         ELSIF param = "" THEN
  120.             end := TRUE
  121.  
  122.         ELSE
  123.             ERRORS.BadParam(param)
  124.         END;
  125.  
  126.         INC(i)
  127.     UNTIL end;
  128.  
  129.     options.checking := checking
  130. END keys;
  131.  
  132.  
  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.  
  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;
  162.     options:    PROG.OPTIONS;
  163.  
  164. BEGIN
  165.     options.stack := 2;
  166.     options.version := 65536;
  167.     options.pic := FALSE;
  168.     options.checking := ST.chkALL;
  169.  
  170.     PATHS.GetCurrentDirectory(app_path);
  171.     lib_path := app_path;
  172.  
  173.     UTILS.GetArg(1, inname);
  174.  
  175.     C.Ln;
  176.     C.String("Akron Oberon Compiler v"); C.Int(UTILS.vMajor); C.String("."); C.Int2(UTILS.vMinor);
  177.         C.String(" ("); C.Int(UTILS.bit_depth); C.StringLn("-bit)");
  178.     C.StringLn("Copyright (c) 2018-2020, Anton Krotov");
  179.  
  180.     IF inname = "" THEN
  181.         C.Ln;
  182.         C.StringLn("Usage: Compiler <main module> <target> [optional settings]"); C.Ln;
  183.         C.StringLn("target =");
  184.         IF UTILS.bit_depth = 64 THEN
  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")
  190.         END;
  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;
  201.         C.StringLn("optional settings:"); C.Ln;
  202.         C.StringLn("  -out <file name>      output"); C.Ln;
  203.         C.StringLn("  -stk <size>           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 <major.minor>    set version of program (KolibriOS DLL)"); C.Ln;
  207.         C.StringLn("  -ram <size>           set size of RAM in bytes (MSP430) or Kbytes (STM32)"); C.Ln;
  208.         C.StringLn("  -rom <size>           set size of ROM in bytes (MSP430) or Kbytes (STM32)"); C.Ln;
  209.         UTILS.Exit(0)
  210.     END;
  211.  
  212.     C.StringLn("--------------------------------------------");
  213.     PATHS.split(inname, path, modname, ext);
  214.  
  215.     IF ext # UTILS.FILE_EXT THEN
  216.         ERRORS.Error(207)
  217.     END;
  218.  
  219.     IF PATHS.isRelative(path) THEN
  220.         PATHS.RelPath(app_path, path, temp);
  221.         path := temp
  222.     END;
  223.  
  224.     UTILS.GetArg(2, param);
  225.     IF param = "" THEN
  226.         ERRORS.Error(205)
  227.     END;
  228.  
  229.     IF TARGETS.Select(param) THEN
  230.         target := TARGETS.target
  231.     ELSE
  232.         ERRORS.Error(206)
  233.     END;
  234.  
  235.     IF target = TARGETS.MSP430 THEN
  236.         options.ram := MSP430.minRAM;
  237.         options.rom := MSP430.minROM
  238.     END;
  239.  
  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
  246.         ERRORS.Error(206)
  247.     END;
  248.  
  249.     STRINGS.append(lib_path, "lib");
  250.     STRINGS.append(lib_path, UTILS.slash);
  251.     STRINGS.append(lib_path, TARGETS.LibDir);
  252.     STRINGS.append(lib_path, UTILS.slash);
  253.  
  254.     keys(options, outname);
  255.     IF outname = "" THEN
  256.         outname := path;
  257.         STRINGS.append(outname, modname);
  258.         STRINGS.append(outname, TARGETS.FileExt)
  259.     ELSE
  260.         IF PATHS.isRelative(outname) THEN
  261.             PATHS.RelPath(app_path, outname, temp);
  262.             outname := temp
  263.         END
  264.     END;
  265.  
  266.     PARS.init(options);
  267.  
  268.     ST.compile(path, lib_path, modname, outname, target, options);
  269.  
  270.     time := UTILS.GetTickCount() - UTILS.time;
  271.     C.StringLn("--------------------------------------------");
  272.     C.Int(PARS.lines); C.String(" lines, ");
  273.     C.Int(time DIV 100); C.String("."); C.Int2(time MOD 100); C.String(" sec, ");
  274.     C.Int(WRITER.counter); C.StringLn(" bytes");
  275.  
  276.     UTILS.Exit(0)
  277. END main;
  278.  
  279.  
  280. BEGIN
  281.     main
  282. END Compiler.