Unverified Commit 1cc86306 authored by Merlin's avatar Merlin 💧
Browse files

Compilation overhaul to provide everything statically linked

parent 0766dadc
Pipeline #10939 failed
......@@ -32,16 +32,14 @@ nix-build:
stage: build
script:
- nix-build -A cool-static -A cool
- cp -L result/bin/cool cool-static
- ./nix/cool-bundle.sh
- cp -L result/ cool-static/
- ./ci/make-nix-tarball.sh "./result-2"
artifacts:
paths:
- cool-static
- cool-nix.tar.gz
- ./*.exe
- install-nix-tarball.sh
name: "${CI_PROJECT_NAME}-nix-built-linux-binaries"
name: "${CI_PROJECT_NAME}-static-linux-binaries"
tags:
- nix
......@@ -58,28 +56,23 @@ build:
artifacts:
paths:
- dynamic/*.exe
- static/*.exe
- ./VERSION
- ./*.sh
- ./cool2tatl/*
- ./src/*
- ./INSTALL.adoc
name: "${CI_PROJECT_NAME}-linux-binaries"
name: "${CI_PROJECT_NAME}-dynamic-linux-binaries"
script:
- ./ci/ocaml-setup.sh
- mkdir dynamic
- mkdir static
- mkdir tests
- shopt -s globstar
- time dune build @exes
- dune build @test-exes
- cp -L _build/**/*.exe dynamic/
- dune clean
- dune build src/coalg/coalg.exe --profile=static
- dune build src/testsuite/cool-testsuite.exe --profile=static
- dune build src/coalgcompare/coalgcompare.exe --profile=static
- dune build src/owl/cool-owl.exe --profile=static
- dune build @exes
- dune install --prefix ./dynamic --libdir $OCAMLFIND_DESTDIR
- sh version_gen.sh
- cp -L _build/**/*.exe static/
- mkdir tests
- dune build @test-exes
- dune install @test-exes --prefix ./tests --libdir $OCAMLFIND_DESTDIR
cross:
stage: cross
......
......@@ -56,7 +56,7 @@ Runtime dependencies:
- minisat (at least minisat 2)
- m4
- zlib
- ncurses (for the debugger)
- ncurses (for the debugger and the repl-example)
On Debian, Ubuntu or other `apt` based Linux distrubutions you can use [the setup script](./ci/apt-setup.sh) and [the OCaml setup script](./ci/ocaml-setup.sh) to install the required dependencies.
......
let
sources = import ./nix/sources.nix { };
# withStatic = p: p.overrideAttrs (o: { dontDisableStatic = true; });
nixpkgs = import sources.nixpkgs {
# overlays = [
# (self: super: {
# readline = withStatic super.readline;
# })
# ];
};
profiledDune = { pname, profile ? null, enableParallelBuilding ? true, ... }@args: nixpkgs.ocamlPackages.buildDunePackage (args // {
buildPhase = ''
runHook preBuild
dune build ${if isNull profile then "" else "--profile=${profile}"} ''${enableParallelBuilding:+-j $NIX_BUILD_CORES}
runHook postBuild
'';
postInstall = ''
shopt -s globstar
cp -L _build/**/*.exe $out/bin/
'';
});
withStatic = p: p.overrideAttrs (o: { dontDisableStatic = true; });
withoutTests = p: p.overrideAttrs (o: { doCheck = false; });
nixpkgs = import sources.nixpkgs { };
versions = import ./nix/version.nix;
in
rec {
cool = nixpkgs.ocamlPackages.callPackage ./nix/cool.nix { inherit versions; buildDunePackage = profiledDune; minisat = nixpkgs.pkgs.minisat; };
cool-static = (cool.override (o: { profile = "static"; glibc = nixpkgs.glibc.static; })).overrideAttrs (o: { doCheck = false; }); # FIXME statically compiling the tests fails with a weird circular dependency on zlib which I don't really understand
cool-docker = nixpkgs.callPackage ./nix/cool-docker.nix { inherit versions cool; };
cool-metrics = nixpkgs.callPackage ./nix/cool-metrics.nix { inherit cool; };
cool-devenv = cool.overrideAttrs (o: {buildInputs = o.buildInputs ++ [nixpkgs.ocamlPackages.ocaml-lsp];});
with nixpkgs; rec {
cool = ocamlPackages.callPackage ./nix/cool.nix {
inherit versions;
minisat = pkgs.minisat;
};
cool-static = let
nc = ncurses5.override { enableStatic = true; };
in
withoutTests (cool.override (o: {
profile = "static";
glibc = glibc.static;
ncurses5 = nc;
readline = withStatic (readline.override { ncurses = nc; }) ;
#buildDunePackage = pkgsMusl.ocamlPackages.buildDunePackage;
})); # FIXME statically compiling the tests fails with a weird circular dependency on zlib which I don't really understand
cool-docker = callPackage ./nix/cool-docker.nix { inherit versions cool; };
cool-metrics = callPackage ./nix/cool-metrics.nix { inherit cool; };
cool-devenv = mkShell {
inputFrom = [ cool ];
buildInputs = with ocamlPackages; [ ocaml-lsp ];
};
}
......@@ -5,13 +5,6 @@
(flags (:standard -w -A)))
(static
(ocamlopt_flags (:standard -ccopt -static))))
(alias
(name exes)
(deps
src/coalg/coalg.exe
src/coalgcompare/coalgcompare.exe
src/debugger/debugger.exe
src/repl-example/repl-example.exe))
(alias
(name test-exes)
......
#!/usr/bin/env nix-shell
#! nix-shell -i bash -p nix-bundle
for T in "coalg" "cool-owl" "cool_unit_tests" "repl-example" "coalgcompare" "cool-testsuite" "debugger"
do
nix-bundle '(import ./default.nix).cool' "/bin/$T.exe" > "$T.exe"
done
{ lib, buildDunePackage, ounit, ocamlgraph, fetchgit, glibc, readline, zlib, ncurses5, minisat, profile ? null, versions }:
buildDunePackage ({
inherit profile;
pname = "cool";
src = ../.;
buildInputs = [ readline zlib.dev ncurses5 minisat ounit ocamlgraph glibc ];
doCheck = true;
buildPhase = ''
runHook preBuild
dune build ${if isNull profile then "" else "--profile=${profile}"} ''${enableParallelBuilding:+-j $NIX_BUILD_CORES}
runHook postBuild
'';
installPhase = ''
runHook preInstall
mkdir -p $out/bin
dune install --prefix $out --libdir $OCAMLFIND_DESTDIR
runHook postInstall
'';
meta = {
homepage = https://www8.cs.fau.de/research/cool-the-coalgebraic-ontology-logic-reasoner/;
......
......@@ -6,25 +6,33 @@ let
# The fetchers. fetch_<type> fetches specs of type <type>.
#
fetch_file = pkgs: spec:
if spec.builtin or true then
builtins_fetchurl { inherit (spec) url sha256; }
else
pkgs.fetchurl { inherit (spec) url sha256; };
fetch_file = pkgs: name: spec:
let
name' = sanitizeName name + "-src";
in
if spec.builtin or true then
builtins_fetchurl { inherit (spec) url sha256; name = name'; }
else
pkgs.fetchurl { inherit (spec) url sha256; name = name'; };
fetch_tarball = pkgs: name: spec:
let
ok = str: ! builtins.isNull (builtins.match "[a-zA-Z0-9+-._?=]" str);
# sanitize the name, though nix will still fail if name starts with period
name' = stringAsChars (x: if ! ok x then "-" else x) "${name}-src";
name' = sanitizeName name + "-src";
in
if spec.builtin or true then
builtins_fetchTarball { name = name'; inherit (spec) url sha256; }
else
pkgs.fetchzip { name = name'; inherit (spec) url sha256; };
fetch_git = spec:
builtins.fetchGit { url = spec.repo; inherit (spec) rev ref; };
fetch_git = name: spec:
let
ref =
if spec ? ref then spec.ref else
if spec ? branch then "refs/heads/${spec.branch}" else
if spec ? tag then "refs/tags/${spec.tag}" else
abort "In git source '${name}': Please specify `ref`, `tag` or `branch`!";
in
builtins.fetchGit { url = spec.repo; inherit (spec) rev; inherit ref; };
fetch_local = spec: spec.path;
......@@ -40,11 +48,21 @@ let
# Various helpers
#
# https://github.com/NixOS/nixpkgs/pull/83241/files#diff-c6f540a4f3bfa4b0e8b6bafd4cd54e8bR695
sanitizeName = name:
(
concatMapStrings (s: if builtins.isList s then "-" else s)
(
builtins.split "[^[:alnum:]+._?=-]+"
((x: builtins.elemAt (builtins.match "\\.*(.*)" x) 0) name)
)
);
# The set of packages used when specs are fetched using non-builtins.
mkPkgs = sources:
mkPkgs = sources: system:
let
sourcesNixpkgs =
import (builtins_fetchTarball { inherit (sources.nixpkgs) url sha256; }) {};
import (builtins_fetchTarball { inherit (sources.nixpkgs) url sha256; }) { inherit system; };
hasNixpkgsPath = builtins.any (x: x.prefix == "nixpkgs") builtins.nixPath;
hasThisAsNixpkgsPath = <nixpkgs> == ./.;
in
......@@ -64,9 +82,9 @@ let
if ! builtins.hasAttr "type" spec then
abort "ERROR: niv spec ${name} does not have a 'type' attribute"
else if spec.type == "file" then fetch_file pkgs spec
else if spec.type == "file" then fetch_file pkgs name spec
else if spec.type == "tarball" then fetch_tarball pkgs name spec
else if spec.type == "git" then fetch_git spec
else if spec.type == "git" then fetch_git name spec
else if spec.type == "local" then fetch_local spec
else if spec.type == "builtin-tarball" then fetch_builtin-tarball name
else if spec.type == "builtin-url" then fetch_builtin-url name
......@@ -80,7 +98,10 @@ let
saneName = stringAsChars (c: if isNull (builtins.match "[a-zA-Z0-9]" c) then "_" else c) name;
ersatz = builtins.getEnv "NIV_OVERRIDE_${saneName}";
in
if ersatz == "" then drv else ersatz;
if ersatz == "" then drv else
# this turns the string into an actual Nix path (for both absolute and
# relative paths)
if builtins.substring 0 1 ersatz == "/" then /. + ersatz else /. + builtins.getEnv "PWD" + "/${ersatz}";
# Ports of functions for older nix versions
......@@ -98,25 +119,29 @@ let
# https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/strings.nix#L269
stringAsChars = f: s: concatStrings (map f (stringToCharacters s));
concatMapStrings = f: list: concatStrings (map f list);
concatStrings = builtins.concatStringsSep "";
# https://github.com/NixOS/nixpkgs/blob/8a9f58a375c401b96da862d969f66429def1d118/lib/attrsets.nix#L331
optionalAttrs = cond: as: if cond then as else {};
# fetchTarball version that is compatible between all the versions of Nix
builtins_fetchTarball = { url, name, sha256 }@attrs:
builtins_fetchTarball = { url, name ? null, sha256 }@attrs:
let
inherit (builtins) lessThan nixVersion fetchTarball;
in
if lessThan nixVersion "1.12" then
fetchTarball { inherit name url; }
fetchTarball ({ inherit url; } // (optionalAttrs (!isNull name) { inherit name; }))
else
fetchTarball attrs;
# fetchurl version that is compatible between all the versions of Nix
builtins_fetchurl = { url, sha256 }@attrs:
builtins_fetchurl = { url, name ? null, sha256 }@attrs:
let
inherit (builtins) lessThan nixVersion fetchurl;
in
if lessThan nixVersion "1.12" then
fetchurl { inherit url; }
fetchurl ({ inherit url; } // (optionalAttrs (!isNull name) { inherit name; }))
else
fetchurl attrs;
......@@ -135,7 +160,8 @@ let
mkConfig =
{ sourcesFile ? if builtins.pathExists ./sources.json then ./sources.json else null
, sources ? if isNull sourcesFile then {} else builtins.fromJSON (builtins.readFile sourcesFile)
, pkgs ? mkPkgs sources
, system ? builtins.currentSystem
, pkgs ? mkPkgs sources system
}: rec {
# The sources, i.e. the attribute set of spec name to spec
inherit sources;
......
(executable
(public_name cool)
(public_name coalg)
(name coalg)
(modes native)
(libraries cool))
(executable
(public_name coalgcompare)
(name coalgcompare)
(modes native)
(libraries cool))
(executable
(public_name debugger)
(name debugger)
(modes native)
(libraries cool interfacencurses))
......@@ -5,5 +5,5 @@
(name interfacencurses)
(cxx_names Curses_stub Readline_stub)
(cxx_flags :standard -std=c++98 -fpermissive) ;; FIXME the permissive flag fixes compilation with newer versions of ocaml which would require a const_cast in the current stub
(c_library_flags :standard -lstdc++ -lm -lncurses -lreadline)
(c_library_flags :standard -lstdc++ -lm -lncurses -lreadline -ltinfo)
(libraries str))
(executable
(public_name cool-owl)
(name cool-owl)
(modes native)
(libraries cool))
(executable
(public_name repl-example)
(name repl-example)
(modes native)
(libraries interfacencurses unix))
open Curses
open Readline
(*
let main1 () =
let (Some message) = Readline.readline() in
let main_window = initscr () in
let small_window = newwin 10 5 20 10 in
mvwaddstr main_window 10 2 message;
mvwaddstr small_window 4 3 "world";
refresh();
Unix.sleep 3;
endwin()
*)
let main2 () =
let redraw() =
let str, cursor = readline_state () in
print_endline str;
print_endline (String.make cursor ' ' ^ "^")
in
register_redraw redraw ;
Readline.readline()
let main3 () =
NCUI.screen_open();
NCUI.set_root_widget (NCUI.label "HALLOOOO");
Unix.sleep 3;
NCUI.screen_close()
let main4 () =
let main () =
let session = {
Repl.prompt = "> ";
Repl.bindings = Repl.addHelpBinding [
......@@ -44,6 +15,6 @@ let main4 () =
in
Repl.start session
let _ = main4 ()
let _ = main ()
(* vim: set et sw=2 sts=2 ts=8 : *)
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment