julec.hook: init

Co-authored-by: philiptaron <philip.taron@gmail.com>
This commit is contained in:
adam
2025-10-21 15:31:33 +02:00
parent f1d065ea27
commit 155bcc6866
11 changed files with 254 additions and 0 deletions

View File

@@ -89,6 +89,10 @@ trim_trailing_whitespace = unset
end_of_line = unset
insert_final_newline = unset
# see https://manual.jule.dev/project/code-style.html#indentions
[*.jule]
indent_style = tab
# Keep this hint at the bottom:
# Please don't add entries for subfolders here.
# Create <subfolder>/.editorconfig instead.

View File

@@ -20,6 +20,7 @@ ghc.section.md
gnome.section.md
haredo.section.md
installShellFiles.section.md
julec.section.md
just.section.md
libiconv.section.md
libxml2.section.md

View File

@@ -0,0 +1,77 @@
# julec.hook {#julec-hook}
[Jule](https://jule.dev) is an effective programming language designed to build efficient, fast, reliable and safe software while maintaining simplicity.
In Nixpkgs, `jule.hook` overrides the default build, check and install phases.
## Example code snippet {#julec-hook-example-code-snippet}
```nix
{
julec,
clangStdenv,
}:
clangStdenv.mkDerivation (finalAttrs: {
# ...
nativeBuildInputs = [ julec.hook ];
# Customize filenames if needed
JULE_SRC_DIR = "./src";
JULE_OUT_DIR = "./bin";
JULE_OUT_NAME = "hello-jule";
JULE_TEST_DIR = "./tests";
JULE_TEST_OUT_DIR = "./test-bin";
JULE_TEST_OUT_NAME = "hello-jule-test";
# ...
})
```
## Variables controlling julec.hook {#julec-hook-variables}
### `JULE_SRC_DIR` {#julec-hook-variable-jule-src-dir}
Specifies the source directory containing `main.jule`.
Default is `./src`.
### `JULE_OUT_DIR` {#julec-hook-variable-jule-out-dir}
Specifies the output directory for the compiled binary.
Default is `./bin`.
### `JULE_OUT_NAME` {#julec-hook-variable-jule-out-name}
Specifies the name of the compiled binary.
Default is `output`.
### `JULE_TEST_DIR` {#julec-hook-variable-jule-test-dir}
Specifies the directory containing test files.
Default is the value of [`JULE_SRC_DIR`](#julec-hook-variable-jule-src-dir).
### `JULE_TEST_OUT_DIR` {#julec-hook-variable-jule-test-out-dir}
Specifies the output directory for compiled test binaries.
Default is the value of [`JULE_OUT_DIR`](#julec-hook-variable-jule-out-dir).
### `JULE_TEST_OUT_NAME` {#julec-hook-variable-jule-test-out-name}
Specifies the name of the compiled test binary.
Default is the value of [`JULE_OUT_NAME`](#julec-hook-variable-jule-out-name) with `-test` suffix.
### `dontUseJulecBuild` {#julec-hook-variable-dontusejulecbuild}
When set to true, doesn't use the predefined `julecBuildHook`.
Default is false.
### `dontUseJulecCheck` {#julec-hook-variable-dontusejuleccheck}
When set to true, doesn't use the predefined `julecCheckHook`.
Default is false.
### `dontUseJulecInstall` {#julec-hook-variable-dontusejulecinstall}
When set to true, doesn't use the predefined `julecInstallHook`.
Default is false.

View File

@@ -124,6 +124,42 @@
"inkscape-plugins": [
"index.html#inkscape-plugins"
],
"julec-hook": [
"index.html#julec-hook"
],
"julec-hook-example-code-snippet": [
"index.html#julec-hook-example-code-snippet"
],
"julec-hook-variable-dontusejulecbuild": [
"index.html#julec-hook-variable-dontusejulecbuild"
],
"julec-hook-variable-dontusejuleccheck": [
"index.html#julec-hook-variable-dontusejuleccheck"
],
"julec-hook-variable-dontusejulecinstall": [
"index.html#julec-hook-variable-dontusejulecinstall"
],
"julec-hook-variable-jule-out-dir": [
"index.html#julec-hook-variable-jule-out-dir"
],
"julec-hook-variable-jule-out-name": [
"index.html#julec-hook-variable-jule-out-name"
],
"julec-hook-variable-jule-src-dir": [
"index.html#julec-hook-variable-jule-src-dir"
],
"julec-hook-variable-jule-test-dir": [
"index.html#julec-hook-variable-jule-test-dir"
],
"julec-hook-variable-jule-test-out-dir": [
"index.html#julec-hook-variable-jule-test-out-dir"
],
"julec-hook-variable-jule-test-out-name": [
"index.html#julec-hook-variable-jule-test-out-name"
],
"julec-hook-variables": [
"index.html#julec-hook-variables"
],
"major-ghc-deprecation": [
"index.html#major-ghc-deprecation"
],

View File

@@ -0,0 +1,15 @@
{
julec,
clang,
makeSetupHook,
}:
makeSetupHook {
name = "julec-hook";
propagatedBuildInputs = [ julec ];
meta = {
inherit (julec.meta) maintainers;
};
} ./hook.sh

View File

@@ -0,0 +1,80 @@
# shellcheck shell=bash disable=SC2154,SC2034
julecSetEnv() {
if [ -z "$JULE_SRC_DIR" ]; then
export JULE_SRC_DIR='./src'
fi
if [ -z "$JULE_OUT_DIR" ]; then
export JULE_OUT_DIR='./bin'
fi
if [ -z "$JULE_OUT_NAME" ]; then
export JULE_OUT_NAME='output'
fi
if [ -z "$JULE_TEST_DIR" ]; then
export JULE_TEST_DIR="$JULE_SRC_DIR"
fi
if [ -z "$JULE_TEST_OUT_DIR" ]; then
export JULE_TEST_OUT_DIR="$JULE_OUT_DIR"
fi
if [ -z "$JULE_TEST_OUT_NAME" ]; then
export JULE_TEST_OUT_NAME="$JULE_OUT_NAME-test"
fi
}
julecBuildHook() {
echo "Executing julecBuildHook"
runHook preBuild
julecSetEnv
mkdir -p "$JULE_OUT_DIR"
julec --opt L2 -p -o "$JULE_OUT_DIR/$JULE_OUT_NAME" "$JULE_SRC_DIR"
runHook postBuild
echo "Finished julecBuildHook"
}
julecCheckHook() {
echo "Executing julecCheckHook"
runHook preCheck
echo "Building tests..."
julecSetEnv
mkdir -p "$JULE_TEST_OUT_DIR"
julec test -o "$JULE_TEST_OUT_DIR/$JULE_TEST_OUT_NAME" "$JULE_TEST_DIR"
echo "Running tests..."
"$JULE_TEST_OUT_DIR/$JULE_TEST_OUT_NAME"
runHook postCheck
echo "Finished julecCheckHook"
}
julecInstallHook() {
echo "Executing julecInstallHook"
runHook preInstall
julecSetEnv
mkdir -p "$out/bin"
cp -r "$JULE_OUT_DIR/$JULE_OUT_NAME" "$out/bin/"
runHook postInstall
echo "Finished julecInstallHook"
}
if [ -z "${dontUseJulecBuild-}" ] && [ -z "${buildPhase-}" ]; then
buildPhase=julecBuildHook
fi
if [ -z "${dontUseJulecCheck-}" ] && [ -z "${checkPhase-}" ]; then
checkPhase=julecCheckHook
fi
if [ -z "${dontUseJulecInstall-}" ] && [ -z "${installPhase-}" ]; then
installPhase=julecInstallHook
fi

View File

@@ -1,6 +1,7 @@
{
lib,
clangStdenv,
callPackage,
fetchFromGitHub,
}:
@@ -93,6 +94,12 @@ clangStdenv.mkDerivation (finalAttrs: {
runHook postInstall
'';
passthru = {
# see doc/hooks/julec.section.md
hook = callPackage ./hook.nix { julec = finalAttrs.finalPackage; };
tests.hello-jule = callPackage ./test { julec = finalAttrs.finalPackage; };
};
meta = {
description = "Jule Programming Language Compiler";
longDescription = ''

View File

@@ -0,0 +1,19 @@
{
julec,
clangStdenv,
}:
clangStdenv.mkDerivation (finalAttrs: {
pname = "hello-jule";
inherit (julec) version;
src = ./hello-jule;
nativeBuildInputs = [ julec.hook ];
doCheck = true;
meta = {
inherit (julec.meta) platforms;
};
})

View File

@@ -0,0 +1,8 @@
use "std/testing"
#test
fn testPi(t: &testing::T) {
if getPi() != 3.14 {
t.Errorf("PI not precise enough")
}
}

View File

@@ -0,0 +1,7 @@
fn main() {
println("Hello, Jule!");
}
fn getPi(): f64 {
ret 3.14;
}