about summary refs log tree commit diff
path: root/pkgs/build-support/skaware/build-skaware-package.nix
blob: 51921fdfbdc7480eee5f9a03d08fa101fa4a996a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
{ stdenv, fetchurl, writeScript, file }:
let lib = stdenv.lib;
in {
  # : string
  pname
  # : string
, version
  # : string
, sha256
  # : string
, description
  # : list Platform
, platforms ? lib.platforms.all
  # : list string
, outputs ? [ "bin" "lib" "dev" "doc" "out" ]
  # TODO(Profpatsch): automatically infer most of these
  # : list string
, configureFlags
  # mostly for moving and deleting files from the build directory
  # : lines
, postInstall
  # : list Maintainer
, maintainers ? []


}:

let

  # File globs that can always be deleted
  commonNoiseFiles = [
    ".gitignore"
    "Makefile"
    "INSTALL"
    "configure"
    "patch-for-solaris"
    "src/**/*"
    "tools/**/*"
    "package/**/*"
    "config.mak"
  ];

  # File globs that should be moved to $doc
  commonMetaFiles = [
    "COPYING"
    "AUTHORS"
    "NEWS"
    "CHANGELOG"
    "README"
    "README.*"
  ];

  globWith = stdenv.lib.concatMapStringsSep "\n";
  rmNoise = globWith (f:
    ''rm -rf ${f}'') commonNoiseFiles;
  mvMeta = globWith
    (f: ''mv ${f} "$DOCDIR" 2>/dev/null || true'')
    commonMetaFiles;

  # Move & remove actions, taking the package doc directory
  commonFileActions = writeScript "common-file-actions.sh" ''
    #!${stdenv.shell}
    set -e
    DOCDIR="$1"
    shopt -s globstar extglob nullglob
    ${rmNoise}
    mkdir -p "$DOCDIR"
    ${mvMeta}
  '';


in stdenv.mkDerivation {
  name = "${pname}-${version}";

  src = fetchurl {
    url = "https://skarnet.org/software/${pname}/${pname}-${version}.tar.gz";
    inherit sha256;
  };

  inherit outputs;

  dontDisableStatic = true;
  enableParallelBuilding = true;

  configureFlags = configureFlags ++ [
    "--enable-absolute-paths"
    (if stdenv.isDarwin
      then "--disable-shared"
      else "--enable-shared")
  ]
    # On darwin, the target triplet from -dumpmachine includes version number,
    # but skarnet.org software uses the triplet to test binary compatibility.
    # Explicitly setting target ensures code can be compiled against a skalibs
    # binary built on a different version of darwin.
    # http://www.skarnet.org/cgi-bin/archive.cgi?1:mss:623:heiodchokfjdkonfhdph
    ++ (lib.optional stdenv.isDarwin
         "--build=${stdenv.hostPlatform.system}");

  # TODO(Profpatsch): ensure that there is always a $doc output!
  postInstall = ''
    echo "Cleaning & moving common files"
    mkdir -p $doc/share/doc/${pname}
    ${commonFileActions} $doc/share/doc/${pname}

    ${postInstall}
  '';

  postFixup = ''
    echo "Checking for remaining source files"
    rem=$(find -mindepth 1 -xtype f -print0 \
           | tee $TMP/remaining-files)
    if [[ "$rem" != "" ]]; then
      echo "ERROR: These files should be either moved or deleted:"
      cat $TMP/remaining-files | xargs -0 ${file}/bin/file
      exit 1
    fi
  '';

  meta = {
    homepage = "https://skarnet.org/software/${pname}/";
    inherit description platforms;
    license = stdenv.lib.licenses.isc;
    maintainers = with lib.maintainers;
      [ pmahoney Profpatsch ] ++ maintainers;
  };

}