summary refs log tree commit diff
path: root/pkgs/development/libraries/ncurses/default.nix
blob: bea4754a1f5391269cb2f48d74a8e1d8f84a5b25 (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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
{ stdenv, fetchurl

# Optional Dependencies
, gpm ? null

# Extra Options
, abiVersion ? "5"
, unicode ? true
}:

let
  mkFlag = trueStr: falseStr: cond: name: val:
    if cond == null then null else
      "--${if cond != false then trueStr else falseStr}${name}${if val != null && cond != false then "=${val}" else ""}";
  mkEnable = mkFlag "enable-" "disable-";
  mkWith = mkFlag "with-" "without-";
  mkOther = mkFlag "" "" true;

  shouldUsePkg = pkg_: let
    pkg = (builtins.tryEval pkg_).value;
  in if stdenv.lib.any (x: x == stdenv.system) (pkg.meta.platforms or [])
    then pkg
    else null;

  buildShared = !stdenv.isDarwin;

  optGpm = shouldUsePkg gpm;
in
stdenv.mkDerivation rec {
  name = "ncurses-5.9";

  src = fetchurl {
    url = "mirror://gnu/ncurses/${name}.tar.gz";
    sha256 = "0fsn7xis81za62afan0vvm38bvgzg5wfmv1m86flqcj0nj7jjilh";
  };

  patches = [ ./clang.patch ];

  buildInputs = [ optGpm ];

  configureFlags = [
    (mkWith   true        "abi-version" abiVersion)
    (mkWith   true        "cxx"         null)
    (mkWith   true        "cxx-binding" null)
    (mkWith   false       "ada"         null)
    (mkWith   true        "manpages"    null)
    (mkWith   true        "progs"       null)
    (mkWith   doCheck     "tests"       null)
    (mkWith   true        "curses-h"    null)
    (mkEnable true        "pc-files"    null)
    (mkWith   buildShared "shared"      null)
    (mkWith   true        "normal"      null)
    (mkWith   false       "debug"       null)
    (mkWith   false       "termlib"     null)
    (mkWith   false       "ticlib"      null)
    (mkWith   optGpm      "gpm"         null)
    (mkEnable true        "overwrite"   null)
    (mkEnable true        "database"    null)
    (mkWith   true        "xterm-new"   null)
    (mkEnable true        "symlinks"    null)
    (mkEnable unicode     "widec"       null)
    (mkEnable true        "ext-colors"  null)
    (mkEnable true        "ext-mouse"   null)
  ] ++ stdenv.lib.optionals stdenv.isCygwin [
    "--enable-sp-funcs"
    "--enable-term-driver"
    "--enable-const"
    "--enable-ext-colors"
    "--enable-ext-mouse"
    "--enable-reentrant"
    "--enable-colorfgbg"
    "--enable-tcap-names"
  ];

  # PKG_CONFIG_LIBDIR is where the *.pc files will be installed. If this
  # directory doesn't exist, the configure script will disable installation of
  # *.pc files. The configure script usually (on LSB distros) pick $(path of
  # pkg-config)/../lib/pkgconfig. On NixOS that path doesn't exist and is not
  # the place we want to put *.pc files from other packages anyway. So we must
  # tell it explicitly where to install with PKG_CONFIG_LIBDIR.
  preConfigure = ''
    export PKG_CONFIG_LIBDIR="$out/lib/pkgconfig"
    mkdir -p "$PKG_CONFIG_LIBDIR"
  '' + stdenv.lib.optionalString stdenv.isCygwin ''
    sed -i -e 's,LIB_SUFFIX="t,LIB_SUFFIX=",' configure
  '';

  selfNativeBuildInput = true;

  enableParallelBuilding = true;

  doCheck = false;

  # When building a wide-character (Unicode) build, create backward
  # compatibility links from the the "normal" libraries to the
  # wide-character libraries (e.g. libncurses.so to libncursesw.so).
  postInstall = if unicode then (''
    # Create a non-abi versioned config
    cfg=$(basename $out/bin/ncurses*-config)
    ln -svf $cfg $out/bin/ncursesw-config
    ln -svf $cfg $out/bin/ncurses-config

    # Allow for end users who #include <ncurses?w/*.h>
    ln -svf . $out/include/ncursesw
    ln -svf . $out/include/ncurses

    # Create non-unicode compatability
    libs="$(find $out/lib -name \*w.a | sed 's,.*lib\(.*\)w.a.*,\1,g')"
    for lib in $libs; do
      if [ -e "$out/lib/lib''${lib}w.so" ]; then
        ln -svf lib''${lib}w.so $out/lib/lib$lib.so
        ln -svf lib''${lib}w.so.${abiVersion} $out/lib/lib$lib.so.${abiVersion}
      fi
      ln -svf lib''${lib}w.a $out/lib/lib$lib.a
      ln -svf ''${lib}w.pc $out/lib/pkgconfig/$lib.pc
    done

    # Create curses compatability
    ln -svf libncursesw.so $out/lib/libcursesw.so
    ln -svf libncursesw.so $out/lib/libcurses.so
  '' + stdenv.lib.optionalString stdenv.isCygwin ''
    for lib in $libs; do
      if test -e $out/lib/lib''${lib}w.dll.a; then
          ln -svf lib''${lib}w.dll.a $out/lib/lib$lib.dll.a
      fi
    done
  '') else ''
    # Create a non-abi versioned config
    cfg=$(basename $out/bin/ncurses*-config)
    ln -svf $cfg $out/bin/ncurses-config

    # Allow for end users who #include <ncurses/*.h>
    ln -svf . $out/include/ncurses

    # Create curses compatability
    ln -svf libncurses.so $out/lib/libcurses.so
  '';

  meta = with stdenv.lib; {
    description = "Free software emulation of curses in SVR4 and more";

    longDescription = ''
      The Ncurses (new curses) library is a free software emulation of
      curses in System V Release 4.0, and more.  It uses Terminfo
      format, supports pads and color and multiple highlights and
      forms characters and function-key mapping, and has all the other
      SYSV-curses enhancements over BSD Curses.

      The ncurses code was developed under GNU/Linux.  It has been in
      use for some time with OpenBSD as the system curses library, and
      on FreeBSD and NetBSD as an external package.  It should port
      easily to any ANSI/POSIX-conforming UNIX.  It has even been
      ported to OS/2 Warp!
    '';

    homepage = http://www.gnu.org/software/ncurses/;

    license = licenses.mit;
    platforms = platforms.all;
    maintainers = with maintainers; [ wkennington ];
  };

  passthru.ldflags = if unicode then "-lncursesw" else "-lncurses";
}