diff --git a/.github/workflows/msys2-cross-compile.yml b/.github/workflows/msys2-cross-compile.yml new file mode 100644 index 0000000..770ea3b --- /dev/null +++ b/.github/workflows/msys2-cross-compile.yml @@ -0,0 +1,20 @@ +name: MSYS2 +on: [push, pull_request] + +jobs: + msys2-mingw64: + runs-on: windows-latest + defaults: + run: + shell: msys2 {0} + steps: + - uses: actions/checkout@v3 + - uses: msys2/setup-msys2@v2 + with: + msystem: MINGW64 + update: true + install: mingw-w64-x86_64-gcc mingw-w64-x86_64-glib2 bison flex mingw-w64-x86_64-llvm cmake git make + - name: CI-Build + run: | + echo 'Running in MSYS2!' + ./ci-build.sh \ No newline at end of file diff --git a/README.md b/README.md index faca249..daaaf32 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,31 @@ -# Gemstone -Gemstone is a programming language compiler written in C with lex and yacc. +
+ + gemstone logo + +
+
+ +## Gemstone + +Gemstone is a programming language compiler (short: GSC) written in C based on flex and GNU bison. +It uses LLVM to produce optimized native binaries for many platforms and uses its own builtin build system for more complex project management. ## Dependencies (build) ### Windows 11 -For setup instruction see issue #30 - -Requires: -- Microsoft Build Tools 2022 (includes: CMake, MSVC) -- WinFlexBison [find it here](https://github.com/lexxmark/winflexbison) (needs to be in PATH) +#### MSYS2 +Install MSYS2 under Windows 11. Open the MingGW64 environment. +Install the following packages: +``` +pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-glib2 bison flex mingw-w64-x86_64-llvm cmake git make +``` +Clone the repository and build the gemstone compiler: +``` +cmake . && make release +``` ### GNU/Linux Requires: @@ -20,6 +34,8 @@ Requires: - Make - bison - flex +- LLVM +- Glib 2.0 ## Writing Tests diff --git a/ci-build.sh b/ci-build.sh new file mode 100755 index 0000000..8b09b06 --- /dev/null +++ b/ci-build.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +cmake . +make release diff --git a/src/ast/ast.c b/src/ast/ast.c index 1381331..a9c1af6 100644 --- a/src/ast/ast.c +++ b/src/ast/ast.c @@ -215,6 +215,7 @@ void AST_delete_node(struct AST_Node_t *node) { DEBUG("Deleting AST node: %p", node); if (node->parent != NULL) { + [[maybe_unused]] const struct AST_Node_t* child = AST_detach_child(node->parent, node); assert(child == node); } diff --git a/src/io/files.c b/src/io/files.c index 9ca0a93..ecb2662 100644 --- a/src/io/files.c +++ b/src/io/files.c @@ -14,9 +14,15 @@ #define MAX_PATH_BYTES PATH_MAX +#define min(a, b) ((a) > (b) ? (b) : (a)) + #elif defined(_WIN32) || defined(WIN32) #include +// for _fullpath +#include +// for _mkdir +#include #define MAX_PATH_BYTES _MAX_PATH @@ -66,10 +72,6 @@ void delete_files(ModuleFileStack *stack) { // seeking the current line in print_diagnostic() #define SEEK_BUF_BYTES 256 -static inline unsigned long int min(unsigned long int a, unsigned long int b) { - return a > b ? b : a; -} - // behaves like fgets except that it has defined behavior when n == 1 static void custom_fgets(char *buffer, size_t n, FILE *stream) { if (n == 1) { @@ -123,15 +125,15 @@ void print_diagnostic(ModuleFile *file, TokenLocation *location, Message kind, c mem_free((void *) absolute_path); - const size_t lines = location->line_end - location->line_start + 1; + const unsigned long int lines = location->line_end - location->line_start + 1; - for (size_t l = 0; l < lines; l++) { + for (unsigned long int l = 0; l < lines; l++) { printf(" %4ld | ", location->line_start + l); - size_t chars = 0; + unsigned long int chars = 0; // print line before token group start - size_t limit = min(location->col_start, SEEK_BUF_BYTES); + unsigned long int limit = min(location->col_start, SEEK_BUF_BYTES); while (limit > 1) { custom_fgets(buffer, (int) limit, file->handle); chars += printf("%s", buffer); @@ -169,13 +171,13 @@ void print_diagnostic(ModuleFile *file, TokenLocation *location, Message kind, c } printf(" | "); - for (size_t i = 1; i < location->col_start; i++) { + for (unsigned long int i = 1; i < location->col_start; i++) { printf(" "); } printf("%s", accent_color); printf("^"); - for (size_t i = 0; i < location->col_end - location->col_start; i++) { + for (unsigned long int i = 0; i < location->col_end - location->col_start; i++) { printf("~"); } @@ -321,7 +323,7 @@ const char *get_absolute_path(const char *path) { #elif defined(_WIN32) || defined(WIN32) // use Windows CRT specific function char absolute_path[MAX_PATH_BYTES]; - _fullpath(path, absolute_path, _MAX_PATH); + _fullpath((char*) path, absolute_path, _MAX_PATH); #endif return mem_strdup(MemoryNamespaceIo, absolute_path); diff --git a/src/io/files.h b/src/io/files.h index 61c7ebb..c05f587 100644 --- a/src/io/files.h +++ b/src/io/files.h @@ -15,9 +15,9 @@ #endif typedef struct FileDiagnosticStatistics_t { - size_t error_count; - size_t warning_count; - size_t info_count; + unsigned long int error_count; + unsigned long int warning_count; + unsigned long int info_count; } FileDiagnosticStatistics; typedef struct ModuleFile_t { diff --git a/src/sys/col.c b/src/sys/col.c index 76260ec..afd78ba 100644 --- a/src/sys/col.c +++ b/src/sys/col.c @@ -71,8 +71,7 @@ int stdout_supports_ansi_esc() { HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); if (!GetConsoleMode(hConsole, &mode)) { - ERROR("failed to get console mode"); - return ANSI_ENABLED; + return ASNI_DISABLED; } if ((mode & ENABLE_VIRTUAL_TERMINAL_INPUT) |