Subversion Repositories Kolibri OS

Rev

Rev 7983 | 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, SCAN;
  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 = "-lower" THEN
  117.             options.lower := TRUE
  118.  
  119.         ELSIF param = "-pic" THEN
  120.             options.pic := TRUE
  121.  
  122.         ELSIF param = "-def" THEN
  123.             INC(i);
  124.             UTILS.GetArg(i, param);
  125.             SCAN.NewDef(param)
  126.  
  127.         ELSIF param = "" THEN
  128.             _end := TRUE
  129.  
  130.         ELSE
  131.             ERRORS.BadParam(param)
  132.         END;
  133.  
  134.         INC(i)
  135.     UNTIL _end;
  136.  
  137.     options.checking := checking
  138. END keys;
  139.  
  140.  
  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.  
  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;
  170.     options:    PROG.OPTIONS;
  171.  
  172. BEGIN
  173.     options.stack := 2;
  174.     options.version := 65536;
  175.     options.pic := FALSE;
  176.     options.lower := FALSE;
  177.     options.checking := ST.chkALL;
  178.  
  179.     PATHS.GetCurrentDirectory(app_path);
  180.     lib_path := app_path;
  181.  
  182.     UTILS.GetArg(1, inname);
  183.  
  184.     C.Ln;
  185.     C.String("Akron Oberon Compiler v"); C.Int(UTILS.vMajor); C.String("."); C.Int2(UTILS.vMinor);
  186.         C.String(" ("); C.Int(UTILS.bit_depth); C.StringLn("-bit)");
  187.     C.StringLn("Copyright (c) 2018-2020, Anton Krotov");
  188.  
  189.     IF inname = "" THEN
  190.         C.Ln;
  191.         C.StringLn("Usage: Compiler <main module> <target> [optional settings]"); C.Ln;
  192.         C.StringLn("target =");
  193.         IF UTILS.bit_depth = 64 THEN
  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")
  199.         END;
  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;
  210.         C.StringLn("optional settings:"); C.Ln;
  211.         C.StringLn("  -out <file name>      output"); C.Ln;
  212.         C.StringLn("  -stk <size>           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;
  215.         C.StringLn("  -lower                allow lower case for keywords"); C.Ln;
  216.         C.StringLn("  -def <identifier>     define conditional compilation symbol"); C.Ln;
  217.         C.StringLn("  -ver <major.minor>    set version of program (KolibriOS DLL)"); C.Ln;
  218.         C.StringLn("  -ram <size>           set size of RAM in bytes (MSP430) or Kbytes (STM32)"); C.Ln;
  219.         C.StringLn("  -rom <size>           set size of ROM in bytes (MSP430) or Kbytes (STM32)"); C.Ln;
  220.         UTILS.Exit(0)
  221.     END;
  222.  
  223.     C.StringLn("--------------------------------------------");
  224.     PATHS.split(inname, path, modname, ext);
  225.  
  226.     IF ext # UTILS.FILE_EXT THEN
  227.         ERRORS.Error(207)
  228.     END;
  229.  
  230.     IF PATHS.isRelative(path) THEN
  231.         PATHS.RelPath(app_path, path, temp);
  232.         path := temp
  233.     END;
  234.  
  235.     UTILS.GetArg(2, param);
  236.     IF param = "" THEN
  237.         ERRORS.Error(205)
  238.     END;
  239.  
  240.     SCAN.NewDef(param);
  241.  
  242.     IF TARGETS.Select(param) THEN
  243.         target := TARGETS.target
  244.     ELSE
  245.         ERRORS.Error(206)
  246.     END;
  247.  
  248.     IF target = TARGETS.MSP430 THEN
  249.         options.ram := MSP430.minRAM;
  250.         options.rom := MSP430.minROM
  251.     END;
  252.  
  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
  259.         ERRORS.Error(206)
  260.     END;
  261.  
  262.     STRINGS.append(lib_path, "lib");
  263.     STRINGS.append(lib_path, UTILS.slash);
  264.     STRINGS.append(lib_path, TARGETS.LibDir);
  265.     STRINGS.append(lib_path, UTILS.slash);
  266.  
  267.     keys(options, outname);
  268.     IF outname = "" THEN
  269.         outname := path;
  270.         STRINGS.append(outname, modname);
  271.         STRINGS.append(outname, TARGETS.FileExt)
  272.     ELSE
  273.         IF PATHS.isRelative(outname) THEN
  274.             PATHS.RelPath(app_path, outname, temp);
  275.             outname := temp
  276.         END
  277.     END;
  278.  
  279.     PARS.init(options);
  280.  
  281.     ST.compile(path, lib_path, modname, outname, target, options);
  282.  
  283.     time := UTILS.GetTickCount() - UTILS.time;
  284.     C.StringLn("--------------------------------------------");
  285.     C.Int(PARS.lines); C.String(" lines, ");
  286.     C.Int(time DIV 100); C.String("."); C.Int2(time MOD 100); C.String(" sec, ");
  287.     C.Int(WRITER.counter); C.StringLn(" bytes");
  288.  
  289.     UTILS.Exit(0)
  290. END main;
  291.  
  292.  
  293. BEGIN
  294.     main
  295. END Compiler.