From 191ef02ab1e99ce37e011c35629be02f649be4b4 Mon Sep 17 00:00:00 2001 From: Carlyle Date: Tue, 31 Dec 2024 13:44:56 -0800 Subject: added the Edit global config command --- .gitignore | 3 ++- editors/vscode/package.json | 5 +++++ editors/vscode/src/extension.ts | 50 +++++++++++++++++++++++++---------------- editors/vscode/src/toolchain.ts | 2 +- 4 files changed, 39 insertions(+), 21 deletions(-) diff --git a/.gitignore b/.gitignore index 94b197c..1c6bedb 100644 --- a/.gitignore +++ b/.gitignore @@ -15,4 +15,5 @@ /odinfmt tests/tests ols.json -.vscode/ \ No newline at end of file +.vscode/ +deno.lock diff --git a/editors/vscode/package.json b/editors/vscode/package.json index 82bdbc7..6ecfd98 100644 --- a/editors/vscode/package.json +++ b/editors/vscode/package.json @@ -36,6 +36,11 @@ "title": "Restart Odin Language Server", "category": "Odin Language Server" }, + { + "command": "ols.editGlobalOls", + "title": "Edit global ols.json file", + "category": "Odin Language Server" + }, { "command": "ols.createOls", "title": "Create ols.json file in project", diff --git a/editors/vscode/src/extension.ts b/editors/vscode/src/extension.ts index e3a8f4f..3a6d7b9 100644 --- a/editors/vscode/src/extension.ts +++ b/editors/vscode/src/extension.ts @@ -5,7 +5,7 @@ import * as vscode from 'vscode'; import * as path from "path"; import * as os from "os"; -import { promises as fs, PathLike, constants, writeFileSync } from "fs"; +import { promises as fs, constants, writeFileSync} from "fs"; var AdmZip = require('adm-zip'); @@ -20,13 +20,20 @@ import { RunnableCodeLensProvider } from "./run"; import { PersistentState } from './persistent_state'; import { Config } from './config'; import { fetchRelease, download } from './net'; -import { getPathForExecutable, isOdinInstalled } from './toolchain'; +import { isOdinInstalled } from './toolchain'; import { Ctx } from './ctx'; import { runDebugTest, runTest } from './commands'; import { watchOlsConfigFile } from './watch'; const onDidChange: vscode.EventEmitter = new vscode.EventEmitter(); +const defaultConfig = { + $schema: "https://raw.githubusercontent.com/DanielGavin/ols/master/misc/ols.schema.json", + enable_document_symbols: true, + enable_hover: true, + enable_snippets: true +}; + let ctx: Ctx; export async function activate(context: vscode.ExtensionContext) { @@ -151,6 +158,10 @@ export async function activate(context: vscode.ExtensionContext) { createOlsConfig(ctx); }); + vscode.commands.registerCommand("ols.editGlobalOls", async () => { + editGlobalOlsConfig(serverPath); + }); + client.start(); parseOlsFile(config, olsFile); @@ -219,27 +230,28 @@ async function removeOldServers(config: Config, state: PersistentState): Promise } } -export function createOlsConfig(ctx: Ctx) { - const odinPath = getPathForExecutable("odin"); - - const corePath = path.resolve(path.join(path.dirname(odinPath), "core")); - - const config = { - $schema: "https://raw.githubusercontent.com/DanielGavin/ols/master/misc/ols.schema.json", - enable_document_symbols: true, - enable_hover: true, - enable_snippets: true - }; - +export function createOlsConfig(_ctx: Ctx) { const olsPath = vscode.workspace.workspaceFolders![0].uri.fsPath; - - const edit = new vscode.WorkspaceEdit(); - - const content = JSON.stringify(config, null, 4); - + const content = JSON.stringify(defaultConfig, null, 4); writeFileSync(path.join(olsPath, "ols.json"), content); } +export async function editGlobalOlsConfig(serverPath: string) { + const configPath = path.join(path.dirname(serverPath), "ols.json"); + + vscode.workspace.openTextDocument(configPath).then( + (document) => { vscode.window.showTextDocument(document) }, + () => { + const content = JSON.stringify(defaultConfig, null, 4); + writeFileSync(configPath, content); + vscode.workspace.openTextDocument(configPath).then( + (document) => { vscode.window.showTextDocument(document) } + ); + } + ); + +} + export async function parseOlsFile(config: Config, file: string) { /* We have to parse the collections that they have specificed through the json(This will be changed when odin gets it's own builder files) diff --git a/editors/vscode/src/toolchain.ts b/editors/vscode/src/toolchain.ts index 21957ed..3a559de 100644 --- a/editors/vscode/src/toolchain.ts +++ b/editors/vscode/src/toolchain.ts @@ -45,7 +45,7 @@ function lookupInPath(exec: string): string | undefined { return pathToOdin; } } catch (realpathError) { - console.error("realpathError:", realpathError) + console.debug("couldn't find odin at", candidates[i], "on account of", realpathError) } } -- cgit v1.2.3 From de318f621ce24dc57f05af35c015826e3937dace Mon Sep 17 00:00:00 2001 From: sh!zeeg Date: Wed, 1 Jan 2025 21:07:46 +0300 Subject: Add ols version --- build.sh | 3 +++ src/main.odin | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/build.sh b/build.sh index f887e8d..093e124 100755 --- a/build.sh +++ b/build.sh @@ -46,5 +46,8 @@ then exit 0 fi +version="$(git describe --tags --abbrev=7)" +version="${version%-*}:${version##*-}" +sed -i "s|VERSION :: .*|VERSION :: \"${version}\"|g" src/main.odin odin build src/ -show-timings -collection:src=src -out:ols -microarch:native -no-bounds-check -o:speed $@ diff --git a/src/main.odin b/src/main.odin index 6e91583..26cf701 100644 --- a/src/main.odin +++ b/src/main.odin @@ -19,6 +19,7 @@ import "core:sys/windows" import "src:common" import "src:server" +VERSION :: "dev-2024-11-9:g584f01b" os_read :: proc(handle: rawptr, data: []byte) -> (int, int) { ptr := cast(^os.Handle)handle @@ -101,6 +102,10 @@ end :: proc() { } main :: proc() { + if len(os.args) > 1 && os.args[1] == "version" { + fmt.println("ols version", VERSION) + os.exit(0) + } reader := server.make_reader(os_read, cast(rawptr)&os.stdin) writer := server.make_writer(os_write, cast(rawptr)&os.stdout) -- cgit v1.2.3 From b7c1af114ba0f3449db0f48614974a244ec9b30e Mon Sep 17 00:00:00 2001 From: MaximilianEmel <19846453+MaximilianEmel@users.noreply.github.com> Date: Fri, 3 Jan 2025 12:55:50 -0500 Subject: fixed typo in schema --- misc/ols.schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/ols.schema.json b/misc/ols.schema.json index 8093dc9..1ce278c 100644 --- a/misc/ols.schema.json +++ b/misc/ols.schema.json @@ -106,7 +106,7 @@ }, "exclude_path": { "type": "array", - "description": "List of paths that will be exldued from workspace symbol searches.", + "description": "List of paths that will be excluded from workspace symbol searches.", "items": { "type": "string" } -- cgit v1.2.3 From c45b8c9382611a2fad6ef4f90c94e07798883aeb Mon Sep 17 00:00:00 2001 From: Carlyle Date: Fri, 3 Jan 2025 17:44:03 -0800 Subject: made 'create ols.json' and 'edit global ols.json' behave more consistently with each other --- editors/vscode/package.json | 11 +++---- editors/vscode/src/extension.ts | 66 ++++++++++++++++++++++++----------------- 2 files changed, 43 insertions(+), 34 deletions(-) diff --git a/editors/vscode/package.json b/editors/vscode/package.json index 6ecfd98..f431984 100644 --- a/editors/vscode/package.json +++ b/editors/vscode/package.json @@ -14,9 +14,6 @@ "categories": [ "Programming Languages" ], - "activationEvents": [ - "onLanguage:odin" - ], "icon": "images/emblem.png", "main": "./out/extension.js", "contributes": { @@ -37,13 +34,13 @@ "category": "Odin Language Server" }, { - "command": "ols.editGlobalOls", - "title": "Edit global ols.json file", + "command": "ols.editProjectConfig", + "title": "Edit per-project config file (ols.json), creating it if necessary", "category": "Odin Language Server" }, { - "command": "ols.createOls", - "title": "Create ols.json file in project", + "command": "ols.editUserConfig", + "title": "Edit per-user config file (ols.json), creating it if necessary", "category": "Odin Language Server" } ], diff --git a/editors/vscode/src/extension.ts b/editors/vscode/src/extension.ts index 3a6d7b9..8e675b2 100644 --- a/editors/vscode/src/extension.ts +++ b/editors/vscode/src/extension.ts @@ -27,12 +27,16 @@ import { watchOlsConfigFile } from './watch'; const onDidChange: vscode.EventEmitter = new vscode.EventEmitter(); -const defaultConfig = { - $schema: "https://raw.githubusercontent.com/DanielGavin/ols/master/misc/ols.schema.json", - enable_document_symbols: true, - enable_hover: true, - enable_snippets: true -}; +const defaultConfig = JSON.stringify( + { + $schema: "https://raw.githubusercontent.com/DanielGavin/ols/master/misc/ols.schema.json", + enable_document_symbols: true, + enable_hover: true, + enable_snippets: true + }, + null, + 4, +); let ctx: Ctx; @@ -126,14 +130,13 @@ export async function activate(context: vscode.ExtensionContext) { ); if (userResponse === "Yes") { - createOlsConfig(ctx); + createOrEditProjectConfig(); } else if (userResponse === "Don't ask again") { config.updateAskCreateOLS(false); return; } } - parseOlsFile(config, olsFile); }); @@ -154,12 +157,12 @@ export async function activate(context: vscode.ExtensionContext) { client.start(); }); - vscode.commands.registerCommand("ols.createOls", async() => { - createOlsConfig(ctx); + vscode.commands.registerCommand("ols.editProjectConfig", async() => { + createOrEditProjectConfig(); }); - vscode.commands.registerCommand("ols.editGlobalOls", async () => { - editGlobalOlsConfig(serverPath); + vscode.commands.registerCommand("ols.editUserConfig", async () => { + createOrEditUserConfig(serverPath); }); client.start(); @@ -230,21 +233,25 @@ async function removeOldServers(config: Config, state: PersistentState): Promise } } -export function createOlsConfig(_ctx: Ctx) { - const olsPath = vscode.workspace.workspaceFolders![0].uri.fsPath; - const content = JSON.stringify(defaultConfig, null, 4); - writeFileSync(path.join(olsPath, "ols.json"), content); +export function createOrEditProjectConfig() { + const projectConfigPath = vscode.workspace.workspaceFolders![0].uri.fsPath; + openFileAndCreateIfNotExists("ols.json", projectConfigPath, defaultConfig); } -export async function editGlobalOlsConfig(serverPath: string) { - const configPath = path.join(path.dirname(serverPath), "ols.json"); - - vscode.workspace.openTextDocument(configPath).then( +export function createOrEditUserConfig(serverPath: string) { + const userConfigPath = path.dirname(serverPath); + openFileAndCreateIfNotExists("ols.json", userConfigPath, defaultConfig); +} + +function openFileAndCreateIfNotExists(file: string, folder: string, defaultContents: string) { + const filePath = path.join(folder, file); + console.log(filePath); + + vscode.workspace.openTextDocument(filePath).then( (document) => { vscode.window.showTextDocument(document) }, () => { - const content = JSON.stringify(defaultConfig, null, 4); - writeFileSync(configPath, content); - vscode.workspace.openTextDocument(configPath).then( + writeFileSync(filePath, defaultContents); + vscode.workspace.openTextDocument(filePath).then( (document) => { vscode.window.showTextDocument(document) } ); } @@ -256,10 +263,15 @@ export async function parseOlsFile(config: Config, file: string) { /* We have to parse the collections that they have specificed through the json(This will be changed when odin gets it's own builder files) */ - fs.readFile(file).then((data) => { - const conf = JSON.parse(data.toString()); - config.collections = conf.collections; - }); + fs.readFile(file).then( + (data) => { + const conf = JSON.parse(data.toString()); + config.collections = conf.collections; + }, + (error) => { + console.info("no ols.json found in workspace"); + }, + ); } function serverPath(config: Config): string | null { -- cgit v1.2.3 From 9c43bf48981c5079db80d0372176ecf49b3b87a4 Mon Sep 17 00:00:00 2001 From: Carlyle Date: Fri, 3 Jan 2025 18:26:50 -0800 Subject: improved the starting configuration dialog --- editors/vscode/src/extension.ts | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/editors/vscode/src/extension.ts b/editors/vscode/src/extension.ts index 8e675b2..ae776f8 100644 --- a/editors/vscode/src/extension.ts +++ b/editors/vscode/src/extension.ts @@ -113,31 +113,40 @@ export async function activate(context: vscode.ExtensionContext) { ctx.registerCommand("runDebugTest", runDebugTest); ctx.registerCommand("runTest", runTest); - const olsFile = path.join(workspaceFolder.uri.fsPath, "ols.json"); - - fs.access(olsFile, constants.F_OK).catch(async err => { - if (err) { + const projectConfigPath = path.join(workspaceFolder.uri.fsPath, "ols.json"); + const userConfigPath = path.join(path.dirname(serverPath), "ols.json"); + fs.access(projectConfigPath, constants.F_OK).catch(async (_e1) => { + fs.access(userConfigPath, constants.F_OK).catch( async (_e2) => { if (!config.askCreateOLS) { return; } const userResponse = await vscode.window.showInformationMessage( - "No ols config file in the workspace root folder. Do you wish to create one?", + "No ols config file found. Do you wish to create one?", "Yes", "No", - "Don't ask again" + "Don't ask again", ); if (userResponse === "Yes") { - createOrEditProjectConfig(); + const clarification = await vscode.window.showInformationMessage( + "should it be specific to this project or to all your odin projects?", + "This project", + "All projects", + ); + if (clarification == "This project") { + createOrEditProjectConfig(); + parseOlsFile(config, projectConfigPath); + } else { + createOrEditUserConfig(serverPath); + parseOlsFile(config, userConfigPath); + } } else if (userResponse === "Don't ask again") { config.updateAskCreateOLS(false); return; } - - } - parseOlsFile(config, olsFile); + }) }); if(!isOdinInstalled()) { @@ -167,8 +176,8 @@ export async function activate(context: vscode.ExtensionContext) { client.start(); - parseOlsFile(config, olsFile); - watchOlsConfigFile(ctx, olsFile); + parseOlsFile(config, projectConfigPath); + watchOlsConfigFile(ctx, projectConfigPath); } async function bootstrap(config: Config, state: PersistentState): Promise { -- cgit v1.2.3 From 67bae4d4758a0107e6d2c960604d67ae578b131e Mon Sep 17 00:00:00 2001 From: G'lek Tarssza Date: Tue, 7 Jan 2025 13:40:55 -0700 Subject: Adjust `sed` call in `build.sh` On macOS the `-i` parameter value is mandatory (unlike in GNU). --- build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sh b/build.sh index 093e124..cd760bb 100755 --- a/build.sh +++ b/build.sh @@ -48,6 +48,6 @@ fi version="$(git describe --tags --abbrev=7)" version="${version%-*}:${version##*-}" -sed -i "s|VERSION :: .*|VERSION :: \"${version}\"|g" src/main.odin +sed -i "" "s|VERSION :: .*|VERSION :: \"${version}\"|g" src/main.odin odin build src/ -show-timings -collection:src=src -out:ols -microarch:native -no-bounds-check -o:speed $@ -- cgit v1.2.3 From 15118476849605f00656bb6c2643c22874e29c71 Mon Sep 17 00:00:00 2001 From: G'lek Tarssza Date: Tue, 7 Jan 2025 13:51:32 -0700 Subject: Started updating files for dynamic literal changes. --- src/common/ast.odin | 1 + 1 file changed, 1 insertion(+) diff --git a/src/common/ast.odin b/src/common/ast.odin index 4a576d7..b9033b0 100644 --- a/src/common/ast.odin +++ b/src/common/ast.odin @@ -1,3 +1,4 @@ +#+feature dynamic-literals package common import "core:fmt" -- cgit v1.2.3 From 0fcada8305584a7aa2f8d5ac82ad6733580f7310 Mon Sep 17 00:00:00 2001 From: G'lek Tarssza Date: Tue, 7 Jan 2025 13:51:59 -0700 Subject: Update `build.odin` for dynamic literals. --- src/server/build.odin | 1 + 1 file changed, 1 insertion(+) diff --git a/src/server/build.odin b/src/server/build.odin index e3478ae..a681201 100644 --- a/src/server/build.odin +++ b/src/server/build.odin @@ -1,3 +1,4 @@ +#+feature dynamic-literals package server import "base:runtime" -- cgit v1.2.3 From 474e7297d8561104bff85eeaf5b999397cb1761a Mon Sep 17 00:00:00 2001 From: G'lek Tarssza Date: Tue, 7 Jan 2025 13:52:21 -0700 Subject: Update `completion.odin` for dynamic literals. --- src/server/completion.odin | 1 + 1 file changed, 1 insertion(+) diff --git a/src/server/completion.odin b/src/server/completion.odin index 75d0d64..130cc1a 100644 --- a/src/server/completion.odin +++ b/src/server/completion.odin @@ -1,3 +1,4 @@ +#+feature dynamic-literals package server import "core:fmt" -- cgit v1.2.3 From e2f9bbc95f673b326ae2eb207a7fae0273258439 Mon Sep 17 00:00:00 2001 From: G'lek Tarssza Date: Tue, 7 Jan 2025 13:52:41 -0700 Subject: Update `hover.odin` for dynamic literals. --- src/server/hover.odin | 1 + 1 file changed, 1 insertion(+) diff --git a/src/server/hover.odin b/src/server/hover.odin index 9b53a18..dcd11e6 100644 --- a/src/server/hover.odin +++ b/src/server/hover.odin @@ -1,3 +1,4 @@ +#+feature dynamic-literals package server import "core:fmt" -- cgit v1.2.3 From 0f9157d7f4c920c181e93b0157e0286fe5ac6664 Mon Sep 17 00:00:00 2001 From: G'lek Tarssza Date: Tue, 7 Jan 2025 13:53:04 -0700 Subject: Update `requests.odin` for dynamic literals. --- src/server/requests.odin | 1 + 1 file changed, 1 insertion(+) diff --git a/src/server/requests.odin b/src/server/requests.odin index d9581ee..f884b0d 100644 --- a/src/server/requests.odin +++ b/src/server/requests.odin @@ -1,3 +1,4 @@ +#+feature dynamic-literals package server import "base:intrinsics" -- cgit v1.2.3 From a5c8c89996155845e27fc224b61a6bf4719f3f1e Mon Sep 17 00:00:00 2001 From: G'lek Tarssza Date: Tue, 7 Jan 2025 13:53:31 -0700 Subject: Update `snippets.odin` for dynamic literals. --- src/server/snippets.odin | 1 + 1 file changed, 1 insertion(+) diff --git a/src/server/snippets.odin b/src/server/snippets.odin index 1ab01a1..3dbbc29 100644 --- a/src/server/snippets.odin +++ b/src/server/snippets.odin @@ -1,3 +1,4 @@ +#+feature dynamic-literals package server Snippet_Info :: struct { -- cgit v1.2.3 From 6e5e41219d5abb751c1dd03d78d58856a953b4b1 Mon Sep 17 00:00:00 2001 From: Ellis Kenyo Date: Tue, 7 Jan 2025 16:12:50 +0000 Subject: Update Emacs documentation Include some extra information, add steps for eglot and clean up the suggested code. --- README.md | 52 ++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 46 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 7958a6d..c2478cd 100644 --- a/README.md +++ b/README.md @@ -228,24 +228,64 @@ require'lspconfig'.ols.setup { ### Emacs +For Emacs, there are two packages available for LSP; lsp-mode and eglot. + +The latter is built-in, spec-compliant and favours built-in Emacs functionality and the former offers richer UI elements and automatic installation for some of the servers. + +In either case, you'll also need an associated major mode. + +Pick either of the below, the former is likely to be more stable but the latter will allow you to take advantage of tree-sitter and other packages that integrate with it. + +The `use-package` statements below assume you're using a package manager like Straight or Elpaca and as such should be taken as references rather than guaranteed copy/pasteable. If you're using `package.el` or another package manager then you'll have to look into instructions for that yourself. + ```elisp ;; Enable odin-mode and configure OLS as the language server -(use-package! odin-mode - :mode ("\\.odin\\'" . odin-mode) - :hook (odin-mode . lsp)) +(use-package odin-mode + :ensure (:host github :repo "mattt-b/odin-mode") + :mode ("\\.odin\\'" . odin-mode)) + +;; Or use the WIP tree-sitter mode +(use-package odin-ts-mode + :ensure (:host github :repo "Sampie159/odin-ts-mode") + :mode ("\\.odin\\'" . odin-ts-mode)) +``` + +And then choose either the built-in `eglot` or `lsp-mode` packages below. Both should work very similarly. + +#### lsp-mode + +```elisp +;; Pull the lsp-mode package +(use-package lsp-mode + :commands (lsp lsp-deferred)) ;; Set up OLS as the language server for Odin, ensuring lsp-mode is loaded first (with-eval-after-load 'lsp-mode (setq-default lsp-auto-guess-root t) ;; Helps find the ols.json file with Projectile or project.el - (setq lsp-language-id-configuration (cons '(odin-mode . "odin") lsp-language-id-configuration)) + (add-to-list 'lsp-language-id-configuration '(odin-mode . "odin")) + (add-to-list 'lsp-language-id-configuration '(odin-ts-mode . "odin")) (lsp-register-client (make-lsp-client :new-connection (lsp-stdio-connection "/path/to/ols/executable") ;; Adjust the path here - :major-modes '(odin-mode) + :major-modes '(odin-mode odin-ts-mode) :server-id 'ols :multi-root t))) ;; Ensures lsp-mode sends "workspaceFolders" to the server -(add-hook 'odin-mode-hook #'lsp) +;; Add a hook to autostart OLS +(add-hook 'odin-mode-hook #'lsp-deferred) +(add-hook 'odin-ts-mode-hook #'lsp-deferred) ;; If you're using the TS mode +``` + +#### eglot + +```elisp +;; Add OLS to the list of available programs +(with-eval-after-load 'eglot + (add-to-list 'eglot-server-programs '((odin-mode odin-ts-mode) . ("ols")))) + +;; Add a hook to autostart OLS +(add-hook 'odin-mode-hook #'eglot-ensure) +(add-hook 'odin-ts-mode-hook #'eglot-ensure) ;; If you're using the TS mode ``` ### Helix -- cgit v1.2.3 From 9c5e5cac4aaa54ccb58a8497ea9839c1d53bcb4e Mon Sep 17 00:00:00 2001 From: Ellis Kenyo Date: Wed, 8 Jan 2025 09:33:08 +0000 Subject: Add note about Emacs 30 --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index c2478cd..c42f79c 100644 --- a/README.md +++ b/README.md @@ -280,6 +280,7 @@ And then choose either the built-in `eglot` or `lsp-mode` packages below. Both s ```elisp ;; Add OLS to the list of available programs +;; NOTE: As of Emacs 30, this is not needed. (with-eval-after-load 'eglot (add-to-list 'eglot-server-programs '((odin-mode odin-ts-mode) . ("ols")))) -- cgit v1.2.3 From d8454bea12a9122eb42251899f42fdf109298aa4 Mon Sep 17 00:00:00 2001 From: sh!zeeg Date: Fri, 10 Jan 2025 04:42:31 +0300 Subject: Fix make `ols version` work with GNU sed and BSD/macOS sed since GNU sed and BSD sed behave differently update VERSION using a temporary file --- build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sh b/build.sh index cd760bb..7b83cf3 100755 --- a/build.sh +++ b/build.sh @@ -48,6 +48,6 @@ fi version="$(git describe --tags --abbrev=7)" version="${version%-*}:${version##*-}" -sed -i "" "s|VERSION :: .*|VERSION :: \"${version}\"|g" src/main.odin +sed "s|VERSION :: .*|VERSION :: \"${version}\"|g" src/main.odin > /tmp/main.odin.build && mv -f /tmp/main.odin.build src/main.odin odin build src/ -show-timings -collection:src=src -out:ols -microarch:native -no-bounds-check -o:speed $@ -- cgit v1.2.3