-*- mode: org -*- #+TITLE: configuration nix #+DESCRIPTION: makefile for spine #+FILETAGS: :spine:build:tools: #+AUTHOR: Ralph Amissah #+EMAIL: [[mailto:ralph.amissah@gmail.com][ralph.amissah@gmail.com]] #+COPYRIGHT: Copyright (C) 2015 - 2023 Ralph Amissah #+LANGUAGE: en #+STARTUP: show4levels hideblocks hidestars noindent entitiespretty #+PROPERTY: header-args :exports code #+PROPERTY: header-args+ :noweb yes #+PROPERTY: header-args+ :results no #+PROPERTY: header-args+ :cache no #+PROPERTY: header-args+ :padline no #+PROPERTY: header-args+ :mkdirp yes #+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t * nix :nix: #+NAME: nixpkgs_local #+BEGIN_SRC sh /srv/nix/nixpkgs #+END_SRC ** NOTES *** nix-shell - default.nix #+BEGIN_SRC sh nix-shell nix-build #+END_SRC - project.nix #+BEGIN_SRC sh nix-shell nix-build project.nix #+END_SRC *** nix-shell --pure - default.nix #+HEADER: :noweb yes #+BEGIN_SRC sh nix-shell --pure nix-build -I nixpkgs=<> nix-build -I .envrc #+END_SRC #+BEGIN_SRC sh nix build -f default.nix --print-build-logs nix build -f derivation.nix --print-build-logs nix shell -f default.nix --print-build-logs # nix build -f project.nix # nix build -f spine.nix nix develop --build -f derivation.nix -I .envrc --print-build-logs #+END_SRC *** derivation .drv #+BEGIN_SRC sh nix show-derivation /nix/store/q7n14bm8j5vzm62qaraczdb4bpyf59vv-spine-0.11.1.drv #+END_SRC ** spine - default.nix - shell.nix *** envrc :envrc: **** .envrc - https://github.com/nix-community/nix-direnv - source_url "https://raw.githubusercontent.com/nix-community/nix-direnv/${NixDirEnvVersion}/direnvrc" "sha256-0000000000000000000000000000000000000000000=" #+HEADER: :tangle ../.envrc #+BEGIN_SRC sh use flake . #use flake .#default NIX_ENFORCE_PURITY=1 # - https://github.com/nix-community/nix-direnv NixDirEnvVersion="2.2.1" if ! has nix_direnv_version || ! nix_direnv_version ${NixDirEnvVersion}; then # source_url "https://raw.githubusercontent.com/nix-community/nix-direnv/${NixDirEnvVersion}/direnvrc" "sha256-0000000000000000000000000000000000000000000=" source_url "https://raw.githubusercontent.com/nix-community/nix-direnv/${NixDirEnvVersion}/direnvrc" "sha256-zelF0vLbEl5uaqrfIzbgNzJWGmLzCmYAkInj/LNxvKs=" fi watch_file flake.lock watch_file flake.nix watch_file makefile if [ -f .envrc-local ]; then source_env_if_exists .envrc-local || source .envrc-local fi #+END_SRC **** .envrc-local CHECK MODIFY - bespoke modify appropriately and generate if needed #+HEADER: :tangle ../.envrc-local_ #+HEADER: :noweb yes #+BEGIN_SRC sh #export NIX_PATH=/nix/var/nix/profiles/per-user/root/channels/nixos #export NIX_PATH=/srv/nix/nixpkgs #export NIX_PATH=nixpkgs=/srv/nix/nixpkgs export DFLAGS="-O2 -inline -boundscheck=on -color=on" export SpineVER=$(git describe --long --tags | sed 's/^[ a-z_-]\+\([0-9.]\+\)/\1/;s/\([^-]*-g\)/r\1/;s/-/./g') export SpinePROJ=~/grotto/repo/git.repo/projects/doc-reform/code/software/spine-search export SpineDOC=~/grotto/repo/git.repo/projects/project-spine/doc-reform-markup/spine-markup-samples export SpineOUT=/srv/www/spine export SpineDBpath=/var/www/sqlite #export SpineDBpath=/srv/www/spine/sqlite export SpineCGIbin=/var/www/cgi/cgi-bin export SpineCGIform='spine_search' export SpineSQLdb='spine.search.db' #+END_SRC *** makefile #+HEADER: :tangle ../makefile_ #+BEGIN_SRC make buildPhase: HOME=$${PWD}; \ for DC_ in dmd ldmd2 gdmd; do \ echo "- check for D compiler $${DC_}"; \ DC=$$(type -P $${DC_} || echo ""); \ if [ ! "$${DC}" == "" ]; then \ break; \ fi; \ done; \ echo "D compiler = $${DC}"; \ if [ "$${DC}" == "" ]; then \ echo "Error: could not find D compiler"; \ exit 1; \ fi; \ echo "$${DC_} used as D compiler to build $${pname}"; \ export DFLAGS="-O2 -inline"; \ dub build --compiler=$${DC} --build=release --combined --skip-registry=all; checkPhase: runHook preCheck; \ HOME=$${PWD}; \ dub test --combined --skip-registry=all; \ runHook postCheck installPhase: runHook preInstall; \ mkdir -p $${out}/bin; \ install -m755 ./bin/spine $${out}/bin/spine; \ runHook postInstall #cp -r bin/spine $out/bin/. postInstall: echo "$${out}/share/cgi-bin"; \ echo `ls -la $${out}/bin/spine` #+END_SRC *** flake :flake: **** flake.nix #+HEADER: :tangle ../flake.nix #+HEADER: :noweb yes #+BEGIN_SRC nix { description = "a sisu like document parser search form"; inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; # "github:nixos/nixpkgs"; "github:NixOS/nixpkgs/nixpkgs-unstable"; "nixpkgs/nixos-unstable"; "nixpkgs/nixos-21.11"; inputs.flake-utils.url = "github:numtide/flake-utils"; outputs = { self, nixpkgs, flake-utils } @inputs: let pname = "spine_search"; version = "<>"; shell = ./shell.nix; # ./default.nix; devEnv = ./.envrc; # ./shell.nix; # ./default.nix; supportedSystems = [ "x86_64-linux" ]; # [ "x86_64-linux" "x86_64-darwin" "aarch64-linux" "aarch64-darwin" ]; forAllSystems = nixpkgs.lib.genAttrs supportedSystems; nixpkgsFor = forAllSystems (system: import nixpkgs { inherit system; }); # nixpkgs instantiated for supported system types. checkPhase = '' runHook preCheck dub test --combined --skip-registry=all runHook postCheck ''; installPhase = '' runHook preInstall mkdir -p $out/share/cgi-bin install -m755 -D ./cgi-bin/spine_search $out/share/cgi-bin/spine_search runHook postInstall ''; postInstall = '' echo `ls -la $out/share/cgi-bin/spine_search` ''; in { packages = forAllSystems (system: let pkgs = nixpkgsFor.${system}; in with pkgs; { default = stdenv.mkDerivation { inherit pname; inherit version; executable = true; src = self; inherit shell; inherit devEnv; buildInputs = [ sqlite ]; nativeBuildInputs = [ dub ldc gnumake ]; # [ dub dmd ]; [ dub ldc ]; [ dub gdc ]; buildPhase = '' runHook preBuild for DC_ in dmd ldmd2 ldc2 gdc gdmd; do echo "- check for D compiler $DC_" DC=$(type -P $DC_ || echo "") if [ ! "$DC" == "" ]; then break; fi done if [ "$DC" == "" ]; then exit "Error: could not find D compiler"; fi echo "$DC_ used as D compiler to build $pname" dub build --compiler=$DC --build=$DC_ --combined --skip-registry=all runHook postBuild ''; inherit checkPhase; inherit installPhase; inherit postInstall; }; spine-search-dmd = stdenv.mkDerivation { inherit pname; inherit version; meta.mainProgram = "spine_search-dmd"; executable = true; src = self; inherit shell; inherit devEnv; buildInputs = [ sqlite ]; nativeBuildInputs = [ dub dmd gnumake ]; buildPhase = '' runHook preBuild dub build --compiler=$(type -P dmd) --build=dmd --combined --skip-registry=all runHook postBuild ''; inherit checkPhase; inherit installPhase; inherit postInstall; }; spine-search-ldc = stdenv.mkDerivation { inherit pname; inherit version; meta.mainProgram = "spine_search-ldc"; executable = true; src = self; inherit shell; inherit devEnv; buildInputs = [ sqlite ]; nativeBuildInputs = [ dub ldc gnumake ]; buildPhase = '' runHook preBuild dub build --compiler=$(type -P ldc2) --build=ldc2 --combined --skip-registry=all runHook postBuild ''; inherit checkPhase; inherit installPhase; inherit postInstall; }; #spine-search-gdc = stdenv.mkDerivation { # inherit pname; # inherit version; # meta.mainProgram = "spine_search-gdc"; # executable = true; # src = self; # inherit shell; # inherit devEnv; # buildInputs = [ sqlite ]; # nativeBuildInputs = [ dub gdc gnumake ]; # buildPhase = '' # runHook preBuild # dub build --compiler=$(type -P gdc) --build=gdc --combined --skip-registry=all # runHook postBuild # ''; # inherit checkPhase; # inherit installPhase; # inherit postInstall; #}; #vendorSha256 = "sha256-0Q00000000000000000000000000000000000000000="; }); devShells = forAllSystems (system: let pkgs = nixpkgsFor.${system}; shellHook = '' export DFLAGS="-O2 -inline -boundscheck=on -color=on" export Date=`date "+%Y%m%d"` export SpineVER=$(git describe --long --tags | sed 's/^[ a-z_-]\+\([0-9.]\+\)/\1/;s/\([^-]*-g\)/r\1/;s/-/./g') ### set local values in .envrc-local (or modify here if you must) # export SpinePROJ=~/grotto/repo/git.repo/projects/doc-reform/code/software/spine # export SpineDOC=~/grotto/repo/git.repo/projects/project-spine/doc-reform-markup/spine-markup-samples # export SpineOUT=/srv/www/spine export SpineDBpath=/var/www/sqlite # export SpineDBpath=/srv/www/spine/sqlite export SpineSRC=$SpinePROJ/src export SpineBIN=$SpinePROJ/result/bin export SpinePOD=$SpineDOC/markup/pod export SpineSearchActionLocal='http://localhost/spine_search' # export SpineSearchActionRemote='https://sisudoc.org/spine_search' export SpineCGIform='spine_search' export SpineSQLdb='spine.search.db' export PROG_VER_GIT="`git describe --long --tags | sed -e 's/^[ a-z_-]\+\([0-9.]\+\)/\1/;s/\([^-]*-g\)/r\1/;s/-/./g'`" export spineNixHelp="cat ./.env/nix-commands" export spineHtml="spine --very-verbose --html --html-link-search --html-link-curate --curate --sqlite-update --sqlite-db-filename=\"spine.search.db\" --cgi-sqlite-search-filename=\"spine_search\" --sqlite-db-path=\"\$SpineDBpath\" --output=\"\$SpineOUT\" $SpinePOD/*" export spineSqliteCreateDB="spine --very-verbose --sqlite-db-recreate --sqlite-db-path=\"$SpineDBpath\" --sqlite-db-filename=\"spine.search.db\"" export spineSqlite="spine --very-verbose --sqlite-discrete --sqlite-db-path=\"$SpineDBpath\" --sqlite-db-filename=\"spine.search.db\" --output=\"\$SpineOUT\" $SpinePOD/*" #export spineSqlite="spine --very-verbose --sqlite-update --sqlite-db-path=\"$SpineDBpath\" --sqlite-db-filename=\"spine.search.db\" --output=\"\$SpineOUT\" $SpinePOD/*" ''; in with pkgs; { devShell = mkShell { name = "spine base dev shell"; inherit shell; inherit devEnv; #buildInputs = [ sqlite ]; #nativeBuildInputs = [ dub dmd ldc gdc gnumake ]; packages = [ sqlite dub dmd ldc gnumake ]; inherit shellHook; }; devShell-sqlite = mkShell { name = "spine dev shell for latex & pdf output"; inherit shell; inherit devEnv; packages = [ dub dmd ldc gnumake sqlite ]; inherit shellHook; }; default = import ./shell.nix { inherit pkgs; }; }); }; } #+END_SRC *** flake :flake: **** notes? - flake.nix /srv/nix/nixpkgs ./shell.nix - shell.nix ./pkgs/shell-pkgs.nix - pkgs/shell-pkgs.nix - default.nix ./nix/dub.selections.nix # - dub.selections.nix - nix develop - nix flake update - nix shell -f default.nix --print-build-logs - nix shell -c default.nix - nix build `nix-instantiate` - nix build -f default.nix --print-build-logs - nix shell -f default.nix --print-build-logs - nix develop --build -f derivation.nix -I .envrc --print-build-logs - nix develop --profile .#default --print-build-logs --command spine -v - nix search --json 2>/dev/null |jq - nix flake show - nix show-derivation # nix-instantiate | nix-build #nix flake update #nix flake check #nix flake show #nix develop #nix build .#default --print-build-logs #+BEGIN_SRC nix src = fetchTarball { url = "file:///[path]/$(pname)-$(version).tar.gz"; sha256 = "sha256:0000000000000000000000000000000000000000000000000000"; }; #+END_SRC **** flake parts ***** flake metadata #+NAME: flake_metadata #+HEADER: :noweb yes #+BEGIN_SRC nix pname = "spine_search"; version = "<>"; description = "a sisu like document parser search form"; #+END_SRC ***** flake inputs ****** flake inputs static #+NAME: flake_inputs_nix #+HEADER: :noweb yes #+BEGIN_SRC nix nixpkgs.url = "github:nixos/nixpkgs"; flake-utils.url = "github:numtide/flake-utils"; #+END_SRC ***** flake outputs ****** flake outputs static #+NAME: flake_outputs #+HEADER: :noweb yes #+BEGIN_SRC nix self, nixpkgs, flake-utils #+END_SRC ***** flake devshells #+NAME: flake_devshells #+HEADER: :noweb yes #+BEGIN_SRC nix devShells = forAllSystems (system: let pkgs = nixpkgsFor.${system}; in { default = pkgs.mkShell { buildInputs = with pkgs; [ git dub dmd ldc sqlite ]; }; }); #+END_SRC ***** flake phases #+NAME: flake_phases #+HEADER: :noweb yes #+BEGIN_SRC nix buildPhase = '' runHook preBuild HOME="$PWD" for DC_ in dmd ldmd2 ldc2 gdc gdmd; do echo "- check for D compiler $DC_" DC=$(type -P $DC_ || echo "") if [ ! "$DC" == "" ]; then break; fi done if [ "$DC" == "" ]; then exit "Error: could not find D compiler"; fi echo "$DC_ used as D compiler to build $pname" dub build --compiler=$DC --build=$DC_ --combined --skip-registry=all runHook postBuild ''; <> #+END_SRC #+NAME: flake_phases_other_than_buildPhase #+HEADER: :noweb yes #+BEGIN_SRC nix checkPhase = '' runHook preCheck dub test --combined --skip-registry=all runHook postCheck ''; installPhase = '' runHook preInstall mkdir -p $out/share/cgi-bin install -m755 -D ./cgi-bin/spine_search $out/share/cgi-bin/spine_search runHook postInstall ''; postInstall = '' echo `ls -la $out/share/cgi-bin/spine_search` echo " nix build or nix develop? (suggestions): - nix build nix build .#default --print-build-logs nix flake update; nix build .#default --print-build-logs nix build --print-build-logs - nix run nix run .#default --print-build-logs nix run default.nix --print-build-logs - nix shell nix shell .#default --print-build-logs --command spine -v - nix develop nix develop --profile .#default --print-build-logs --command spine -v nix develop ; eval \"$buildPhase\" nix develop --build -f derivation.nix -I .envrc --print-build-logs - nix profile install . --print-build-logs nix-instantiate | nix show-derivation | jq " ''; #+END_SRC *** shell.nix :shell: **** tangle #+HEADER: :tangle ../shell.nix #+HEADER: :tangle-mode (identity #o755) #+HEADER: :shebang "#!/usr/bin/env -S nix-shell --pure\n#!nix-shell -i bash" #+HEADER: :noweb yes #+BEGIN_SRC nix { pkgs ? import {} }: with pkgs; mkShell { buildInputs = [ # ❯❯❯ nix_related #nix direnv #cachix nixVersions.unstable #nixFlakes nix-prefetch-git validatePkgConfig nix-output-monitor nix-tree jq git gnumake ps # ❯❯❯ d_build_related # ❯❯ package manager dub # ❯❯ compiler ldc rund # ❯❯ linker #lld #mold # ❯❯ builder #ninja #meson # ❯❯❯ sqlite search related sqlite # ❯❯❯ tools #aria #wget #curl ]; shellHook = '' nix flake update nix flake check nix flake show echo ' shell.nix echo ❯❯ ❯❯ nix flake update && nix flake check --show-trace && nix flake show && nix develop ".#devShell" -c zsh ❯❯ nix develop ❯❯ nix develop -c zsh ❯❯ nix build ❯❯ nix build ".#default" --print-build-logs ❯❯ nix build ".#spine-search-dmd" --print-build-logs |& nom ❯❯ nix build ".#spine-search-ldc" --print-build-logs |& nom ❯❯ dub build --compiler=ldmd --build=release --combined --skip-registry=all ' ''; } #+END_SRC echo "ldc `${pkgs.ldc}/bin/ldc2 -v`" **** Notes #+BEGIN_SRC text #% Notes # - shell.nix -I .envrc # - shell.nix -I .envrc --pure # [ nix-shell ] # - nix-shell -I nixpkgs=/srv/nix/nixpkgs --pure # - nix-shell -p "with import /srv/nix/nixpkgs {}; ldc" --pure # - nix-shell -p "with import /srv/nix/nixpkgs {}; [dub ldc]" --pure # - nix-shell -p nixVersions.unstable #nixFlakes # - nix-shell -p nixFlakes --pure # - nix-shell -p nixFlakes --pure -p "with import /srv/nix/nixpkgs {}; [nix dub ldc git ps]" # - nix-shell shell.nix direnv: export +IN_NIX_SHELL # - nix-shell shell.nix # [ nix-build ] # - nix-build -I nixpkgs=/srv/nix/nixpkgs # --pure # - nix-build -I .envrc --pure # - nix-build default.nix -I .envrc && result/bin/spine -v # [ nix-instantiate ] # - nix-instantiate | nix show-derivation | jq # - nix-instantiate -I .envrc | nix show-derivation -f derivation.nix -I .envrc | jq # - nix-instantiate | nix show-derivation --recursive | jq # - nix-instantiate -I .envrc | nix show-derivation -f derivation.nix --recursive -I .envrc | jq # - nix-instantiate | nix-build # - nix-instantiate -I .envrc | nix-build -I .envrc # [ nix shell ] # - nix shell -c default.nix # - nix shell -f default.nix --print-build-logs # [ nix build ] # - nix build -I .envrc --print-build-logs # - nix build -f default.nix --print-build-logs # - nix build -f derivation.nix --print-build-logs # - nix build `nix-instantiate` # - nix build `nix-instantiate -I .envrc` # - nix build -f default.nix && ./result/bin/spine -v && noti -t "spine build" -m "see ./result/bin/spine" # - nix build .#default # [ nix run ] # - nix run default.nix --print-build-logs # - nix run -I .envrc default.nix --print-build-logs # - nix run .#default # - nix-shell -I .envrc --pure # - nix develop --build -f derivation.nix -I .envrc --print-build-logs # - nix-shell -p nixFlakes --pure -p "with import /srv/nix/nixpkgs {}; [nix dub ldc git ps]" # - nix-build # - nix build `nix-instantiate -I .envrc` # - nix develop --build -f default.nix -I .envrc # - nix-shell -I .envrc --pure # - nix-build default.nix -I .envrc && result/bin/spine -v # - nix shell -f default.nix --print-build-logs # - nix-instantiate -I .envrc | nix-build -I .envrc #+END_SRC #+BEGIN_SRC text #% Notes - nix-shell - shell.nix --pure - shell.nix --pure -I .envrc - nix-shell --pure -I nixpkgs=<> - nix-shell --pure -p "with import <> {}; ldc" - nix-shell --pure -p "with import /srv/nix/nixpkgs {}; [dub ldc]" - shell.nix direnv: export +IN_NIX_SHELL - nix-shell -p nixFlakes - nix-shell -p nixFlakes --pure - nix-shell -p nixFlakes --pure -p "with import /srv/nix/nixpkgs {}; [dub ldc]" - shell.nix -I .envrc - nix-shell -I nixpkgs= - nix-shell -I nixpkgs= --pure - shell.nix - nix-shell shell.nix --pure - nix shell -c default.nix - nix run default.nix --print-build-logs - nix run -I .envrc default.nix --print-build-logs - nix develop - nix-build -I nixpkgs= - nix-build -I .envrc - nix build -f default.nix --print-build-logs - nix build -f derivation.nix --print-build-logs - nix build -I .envrc --print-build-logs - nix shell -f default.nix --print-build-logs - nix develop --build -f derivation.nix -I .envrc --print-build-logs - buildPhase - nix build -f default.nix && noti - nix build -f default.nix && ./result/bin/spine -v && noti -t "spine build" -m "see ./result/bin/spine" - nix develop --build -f derivation.nix -I .envrc --print-build-logs ./result/bin/spine #+END_SRC *** default.nix :default: - default.nix -I nixpkgs= e.g. default.nix -I nixpkgs=/srv/nix/nixpkgs - nix-build -I nixpkgs= e.g. nix-build -I nixpkgs=<> #+HEADER: :noweb yes #+BEGIN_SRC sh nix-build -I nixpkgs=<> nix-build -I .envrc-local nix-build -I .envrc default.nix -I .envrc default.nix nix build -f default.nix --print-build-logs nix build -f derivation.nix --print-build-logs nix shell -f default.nix --print-build-logs nix develop --build -f derivation.nix -I .envrc --print-build-logs # nix build -f project.nix # nix build -f spine.nix #+END_SRC #+HEADER: :tangle ../default.nix #+HEADER: :tangle-mode (identity #o755) #+HEADER: :shebang "#!/usr/bin/env -S nix-build" #+BEGIN_SRC nix { pkgs ? import {} }: pkgs.callPackage ./devenv.nix {} #+END_SRC #+HEADER: :tangle-mode (identity #o755) #+HEADER: :shebang "#!/usr/bin/env -S nix-build" #+BEGIN_SRC nix { pkgs ? import {} }: pkgs.callPackage ./derivation.nix {} #+END_SRC *** devenv.nix :default:devenv: #+HEADER: :tangle ../devenv.nix #+HEADER: :tangle-mode (identity #o644) #+BEGIN_SRC nix { pkgs ? import { }, name ? "user-env" }: with pkgs; buildEnv { inherit name; extraOutputsToInstall = [ "out" "man" "lib" ]; # to get all needed symlinks paths = [ # ❯❯❯ nix_related #nix # if not on NixOS, this is needed direnv #cachix nixVersions.unstable #nixFlakes nix-prefetch-git validatePkgConfig nix-output-monitor nix-tree jq git gnumake ps # ❯❯❯ d_build_related # ❯❯ package manager dub # ❯❯ compiler dmd ldc # ❯❯❯ sqlite search related sqlite # this will create a script that will rebuild and upgrade your setup; using shell script syntax (writeScriptBin "nix-rebuild" '' #!${stdenv.shell} cd || exit 1 nix flake update nix profile upgrade '.*' '') # puts in your root the nixpkgs version (writeTextFile { name = "nixpkgs-version"; destination = "/nixpkgs-version"; text = lib.version; }) ]; } #+END_SRC *** derivation.nix :default: #+HEADER: :tangle ../derivation.nix #+HEADER: :tangle-mode (identity #o644) #+HEADER: :noweb yes #+BEGIN_SRC nix { pkgs ? import {}, stdenv ? pkgs.stdenv, lib ? pkgs.lib, ldc ? null, dcompiler ? pkgs.ldc, dub ? pkgs.dub }: assert dcompiler != null; with ( with lib; let filterDub = name: type: let baseName = baseNameOf (toString name); in ! ( # filter function to remove the .dub package folder from src type == "directory" && baseName == ".dub" ); targetOf = package: "${package.targetPath or "."}/${package.targetName or package.name}"; # remove reference to build tools and library sources disallowedReferences = deps: [ dcompiler dub ]; removeExpr = refs: ''remove-references-to ${lib.concatMapStrings (ref: " -t ${ref}") refs}''; in { mkDubDerivation = lib.makeOverridable ({ src, nativeBuildInputs ? [], dubJSON ? src + "/dub.json", passthru ? {}, package ? lib.importJSON dubJSON, ... } @ attrs: stdenv.mkDerivation (attrs // { pname = package.name; nativeBuildInputs = [ dcompiler dub pkgs.removeReferencesTo ] ++ nativeBuildInputs; disallowedReferences = disallowedReferences deps; passthru = passthru // { inherit dub dcompiler pkgs; }; src = lib.cleanSourceWith { filter = filterDub; src = lib.cleanSource src; }; preFixup = '' find $out/share/cgi-bin -type f -exec ${removeExpr (disallowedReferences deps)} '{}' + || true ''; buildPhase = '' runHook preBuild HOME="$PWD" DFLAGS="-O2 -inline" for DC_ in dmd ldmd2 gdmd; do echo "- check for D compiler $DC_" DC=$(type -P $DC_ || echo "") if [ ! "$DC" == "" ]; then break fi done if [ "$DC" == "" ]; then exit "Error: could not find D compiler" fi echo "$DC_ used as D compiler to build $pname" dub build --compiler=$DC --build=release --combined --skip-registry=all runHook postBuild ''; checkPhase = '' runHook preCheck HOME="$PWD" dub test --combined --skip-registry=all runHook postCheck ''; installPhase = '' runHook preInstall mkdir -p $out/share/cgi-bin cp -r "${targetOf package}" $out/share/cgi-bin install -m755 -D $out/share/cgi-bin/spine_search spine_search runHook postInstall ''; postInstall = '' echo "HERE ${targetOf package} $out/share/cgi-bin" echo `ls -la $out/share/cgi-bin/spine_search` ''; meta = lib.optionalAttrs (package ? description) { description = package.description; } // attrs.meta or {}; } // lib.optionalAttrs (!(attrs ? version)) { name = package.name; # use name from dub.json, unless pname and version are specified })); } ); mkDubDerivation rec { name = "spine-search-${version}"; #version = "<>"; src = ./.; buildInputs = [ pkgs.sqlite ( with pkgs; [ nixVersions.unstable #nixFlakes ## package manager dub ## compiler ldc rund ## linker #lld #mold ## builder #ninja sqlite ] ) ]; meta = with pkgs.lib; { pname = "spine-search"; version = "<>"; homepage = "https://sisudoc.org"; description = "cgi sqlite search form for document object search"; longDescription = '' a sisu like parser & document generator ''; homepage = "https://sisudoc.org"; license = licenses.agpl3Plus; platforms = platforms.linux; maintainers = [ "RalphAmissah" ]; }; } #+END_SRC - unused - installPhase #+BEGIN_SRC txt installPhase = '' mkdir -p $out/bin cp spine $out/bin chmod +x $out/bin/spine ''; #+END_SRC *** project meta #+NAME: nix_project_meta #+HEADER: :noweb yes #+BEGIN_SRC nix meta = with pkgs.lib; { pname = "spine"; version = "<>"; description = "a sisu like document parser"; longDescription = '' A sisu like parser and document generator ''; homepage = "https://sisudoc.org"; license = licenses.agpl3Plus; platforms = platforms.linux; maintainers = [ "RalphAmissah" ]; }; #+END_SRC *** dub.selections.json #+HEADER: :NO-tangle ../dub.selections.json #+BEGIN_SRC nix { "fileVersion": 1, "versions": { "d2sqlite3": "0.19.1", "dyaml": "0.8.3", "imageformats": "7.0.2", "tinyendian": "0.2.0" } } #+END_SRC *** dub.selections.nix #+HEADER: :NO-tangle ../nix/dub.selections.nix #+BEGIN_SRC nix # This file was generated by https://github.com/lionello/dub2nix v0.2.3 [ { fetch = { type = "git"; url = "https://github.com/dlang-community/d2sqlite3.git"; rev = "v0.19.1"; sha256 = "0rnsgla6xyr8r34knf7v6dwhacra96q1b5rhxcz9246inwhvrk5k"; fetchSubmodules = false; date = "2020-07-21T12:32:51+02:00"; deepClone = false; leaveDotGit = false; path = "/nix/store/hsi8xvl15w6fwlqvs042m1z5i88yc72i-d2sqlite3"; }; } { fetch = { type = "git"; url = "https://github.com/kiith-sa/tinyendian.git"; rev = "v0.2.0"; sha256 = "086gf5aga52wr5rj2paq54daj8lafn980x77b706vvvqaz2mlis8"; fetchSubmodules = false; date = "2018-06-10T11:04:28+02:00"; deepClone = false; leaveDotGit = false; path = "/nix/store/9c7fsmi5am84j6dq2mp3va306x3ay291-tinyendian"; }; } { fetch = { type = "git"; url = "https://github.com/kiith-sa/D-YAML.git"; rev = "v0.8.3"; sha256 = "13wy304xjbwkpgg7ilql1lkxkm83s87jm59ffnrg26slp7cx149q"; fetchSubmodules = false; date = "2020-09-19T23:46:57+02:00"; deepClone = false; leaveDotGit = false; path = "/nix/store/3i8i56lkmw2xq3lxr5h66v909waq2mqg-D-YAML"; }; } { fetch = { type = "git"; url = "https://github.com/lgvz/imageformats.git"; rev = "v7.0.2"; sha256 = "1mfbsmi4fs1xny4zqs6jyr04d5f4h03r9f6jadvkdqj5kd1k0ws7"; fetchSubmodules = false; date = "2019-10-10T07:54:45+03:00"; deepClone = false; leaveDotGit = false; path = "/nix/store/wn554pn21nzmpvw2hs7hvv9v9y0sgarg-imageformats"; }; } ] #+END_SRC *** dub2nix & shared pkgs SHARED **** dub2nix with pkgs shared #+NAME: nix_with_pkgs #+HEADER: :noweb yes #+BEGIN_SRC nix with pkgs; [ <> ] #+END_SRC **** with pkgs list #+NAME: nix_shell_with_pkgs_list #+BEGIN_SRC nix nixVersions.unstable #nixFlakes rund dub ldc sqlite nix-prefetch-git validatePkgConfig nix-output-monitor nix-tree jq git #+END_SRC ** variables *** spine version SET VERSION :version:set:project: #+NAME: spine_version_set #+BEGIN_SRC sh 0.12.0 #+END_SRC *** set names SET #+NAME: spine_search_db #+BEGIN_SRC sh spine.search.db #+END_SRC #+NAME: spine_search_cgi #+BEGIN_SRC sh spine_search #+END_SRC *** nixpkgs_path SETUP **** nixpkgs select path SELECT #+NAME: nixpkgs_path #+HEADER: :noweb yes #+BEGIN_SRC nix <> #+END_SRC **** nixpkgs path options - #+NAME: nixpkgs_path_default #+HEADER: :noweb yes #+BEGIN_SRC nix #+END_SRC #+NAME: nix_path_directory #+HEADER: :noweb yes #+BEGIN_SRC nix nixpkgs=<> #+END_SRC #+NAME: project_path_local_project #+HEADER: :noweb yes #+BEGIN_SRC nix ~/grotto/repo/git.repo/projects/project-spine/doc-reform #+END_SRC #+NAME: project_path_local_src #+HEADER: :noweb yes #+BEGIN_SRC nix <>/src #+END_SRC #+NAME: project_path_local_bin #+HEADER: :noweb yes #+BEGIN_SRC nix <>/result/bin #+END_SRC #+NAME: project_path_cgi_bin #+BEGIN_SRC nix /var/www/cgi/cgi-bin #+END_SRC #+NAME: project_path_local_doc #+BEGIN_SRC nix ~/grotto/repo/git.repo/projects/project-spine/doc-reform-markup/spine-markup-samples #+END_SRC #+NAME: project_path_local_out #+BEGIN_SRC nix /srv/www/spine/$SpineVER #+END_SRC #+NAME: project_path_local_out_ #+HEADER: :noweb yes #+BEGIN_SRC nix /tmp/spine/$SpineVER/www #+END_SRC #+NAME: project_path_local_out_static #+HEADER: :noweb yes #+BEGIN_SRC nix /srv/www/spine #+END_SRC #+NAME: project_path_local_out_static_ #+BEGIN_SRC nix /var/www #+END_SRC #+NAME: project_path_sqlite #+BEGIN_SRC nix /var/www/sqlite #+END_SRC #+NAME: nixpkgs_url #+BEGIN_SRC nix github:nixos/nixpkgs #+END_SRC #+HEADER: :noweb yes #+BEGIN_SRC nix <> #+END_SRC - local path SET WARN #+NAME: nixpkgs_path_local #+BEGIN_SRC nix /srv/nix/nixpkgs #+END_SRC **** project path options - local path SET WARN #+NAME: nix_path_channel #+BEGIN_SRC nix /nix/var/nix/profiles/per-user/root/channels/nixos #+END_SRC ** texlive xetex xelatex shell.nix *** shell.nix :shell: #+BEGIN_SRC nix #!/usr/bin/env -S nix-shell --pure { pkgs ? import {} }: pkgs.mkShell { buildInputs = with pkgs; [ nixVersions.unstable #nixFlakes nix-prefetch-git validatePkgConfig nix-output-monitor nix-tree jq git fontconfig source-sans-pro source-serif-pro source-code-pro #(texlive.combine { # inherit (texlive) scheme-tetex xetex fontspec footmisc multirow titlesec listings anysize float graphics helvetic times courier; #}) texlive.combined.scheme-full dejavu_fonts dejavu_fontsEnv liberation_ttf evince zathura apvlv ]; #FONTCONFIG_FILE = makeFontsConf { fontDirectories = [ # liberation_ttf #]; shellHook = '' if [[ -f ".envrc" ]]; then source .envrc fi #for texfile in *.tex; do xelatex -interaction=nonstopmode $texfile; done #for texfile in *.tex; do xelatex -interaction=batchmode $texfile; done ''; } #+END_SRC *** notes #+BEGIN_SRC sh nix-shell --run 'which xetex' echo 'for texfile in *.tex; do echo "* --> " ~ $texfile && xelatex -interaction=batchmode $texfile; rm *.aux *.log *.toc *.out; done' $SpineBIN/spine --latex --serial --output="$SpineOUT" $SpinePOD/* && for texfile in $SpineOUT/latex/*.tex; do xelatex -interaction=nonstopmode $texfile; done 2>&1 | tee _err.xelatex_.org; ls $SpineOUT/latex/*.{tex,pdf} /run/current-system/sw/share/X11/fonts/ kpsewhich pdftexconfig.tex /nix/store/2r4qa8rbll085nmpx56jg1rbmbir1zkp-texlive-combined-2021/share/texmf/tex/generic/tex-ini-files/pdftexconfig.tex /nix/store/2r4qa8rbll085nmpx56jg1rbmbir1zkp-texlive-combined-2021/share/texmf/fonts/opentype/public/ find: texclive-fonts.conf fc-cache && mkfontscale && mkfontdir fc-match LiberationSans cd /nix/var/nix/profiles/system/sw/share/X11/fonts fc-query LiberationSans-Regular.ttf | grep '^\s\+family:' | cut -d'"' -f2 Liberation Sans fc-query LiberationMono-Regular.ttf | grep '^\s\+family:' | cut -d'"' -f2 Liberation Mono fc-query DejaVuSans.ttf | grep '^\s\+family:' | cut -d'"' -f2 $XDG_DATA_HOME/fonts ~/.local/share/fonts #+END_SRC