summary refs log tree commit diff
path: root/pkgs/development/tools/build-managers/meson/default.nix
blob: 52220c4d0b995a47f79a06653bc85ef725ba9b40 (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
165
166
167
168
169
170
171
172
173
{ lib
, stdenv
, fetchFromGitHub
, fetchpatch
, installShellFiles
, rust
, ninja
, pkg-config
, python3
, zlib
, coreutils
, substituteAll
, Foundation
, OpenGL
, AppKit
, Cocoa
, libxcrypt
}:

python3.pkgs.buildPythonApplication rec {
  pname = "meson";
  version = "1.2.0";

  src = fetchFromGitHub {
    owner = "mesonbuild";
    repo = "meson";
    rev = "refs/tags/${version}";
    hash = "sha256-bJAmkE+sL9DqKpcjZdBf4/z9lz+m/o0Z87hlAwbVbTY=";
  };

  patches = [
    # Meson is currently inspecting fewer variables than autoconf does, which
    # makes it harder for us to use setup hooks, etc.  Taken from
    # https://github.com/mesonbuild/meson/pull/6827
    ./more-env-vars.patch

    # Unlike libtool, vanilla Meson does not pass any information
    # about the path library will be installed to to g-ir-scanner,
    # breaking the GIR when path other than ${!outputLib}/lib is used.
    # We patch Meson to add a --fallback-library-path argument with
    # library install_dir to g-ir-scanner.
    ./gir-fallback-path.patch

    # In common distributions, RPATH is only needed for internal libraries so
    # meson removes everything else. With Nix, the locations of libraries
    # are not as predictable, therefore we need to keep them in the RPATH.
    # At the moment we are keeping the paths starting with /nix/store.
    # https://github.com/NixOS/nixpkgs/issues/31222#issuecomment-365811634
    (substituteAll {
      src = ./fix-rpath.patch;
      inherit (builtins) storeDir;
    })

    # When Meson removes build_rpath from DT_RUNPATH entry, it just writes
    # the shorter NUL-terminated new rpath over the old one to reduce
    # the risk of potentially breaking the ELF files.
    # But this can cause much bigger problem for Nix as it can produce
    # cut-in-half-by-\0 store path references.
    # Let’s just clear the whole rpath and hope for the best.
    ./clear-old-rpath.patch

    # Patch out default boost search paths to avoid impure builds on
    # unsandboxed non-NixOS builds, see:
    # https://github.com/NixOS/nixpkgs/issues/86131#issuecomment-711051774
    ./boost-Do-not-add-system-paths-on-nix.patch

    # Nixpkgs cctools does not have bitcode support.
    ./disable-bitcode.patch

    # Fix passing multiple --define-variable arguments to pkg-config.
    # https://github.com/mesonbuild/meson/pull/10670
    (fetchpatch {
      url = "https://github.com/mesonbuild/meson/commit/d5252c5d4cf1c1931fef0c1c98dd66c000891d21.patch";
      sha256 = "GiUNVul1N5Fl8mfqM7vA/r1FdKqImiDYLXMVDt77gvw=";
      excludes = [
        "docs/yaml/objects/dep.yaml"
      ];
    })
  ];

  cpuFamily = with stdenv.targetPlatform;
    /**/ if isAarch32 then "arm"
    else if isx86_32  then "x86"
    else uname.processor;

  crossFile = if stdenv.hostPlatform == stdenv.targetPlatform then null else
    builtins.toFile "cross-file.conf" ''
      [properties]
      needs_exe_wrapper = ${lib.boolToString (!stdenv.hostPlatform.canExecute stdenv.targetPlatform)}

      [host_machine]
      system = '${stdenv.targetPlatform.parsed.kernel.name}'
      cpu_family = '${cpuFamily}'
      cpu = '${stdenv.targetPlatform.parsed.cpu.name}'
      endian = ${if stdenv.targetPlatform.isLittleEndian then "'little'" else "'big'"}

      [binaries]
      llvm-config = 'llvm-config-native'
      rust = ['rustc', '--target=${rust.toRustTargetSpec stdenv.targetPlatform}']
    '';

  setupHook = substituteAll {
    src = ./setup-hook.sh;
    crossFlags = lib.optionalString (crossFile != null) "--cross-file=${crossFile}";
  };

  nativeCheckInputs = [ ninja pkg-config ];
  checkInputs = [ zlib ]
    ++ lib.optionals stdenv.isDarwin [ Foundation OpenGL AppKit Cocoa ];
  checkPhase = ''
    runHook preCheck

    patchShebangs 'test cases'
    substituteInPlace 'test cases/native/8 external program shebang parsing/script.int.in' \
      --replace /usr/bin/env ${coreutils}/bin/env
    # requires git, creating cyclic dependency
    rm -r 'test cases/common/66 vcstag'
    # requires glib, creating cyclic dependency
    rm -r 'test cases/linuxlike/6 subdir include order'
    rm -r 'test cases/linuxlike/9 compiler checks with dependencies'
    # requires static zlib, see #66461
    rm -r 'test cases/linuxlike/14 static dynamic linkage'
    # Nixpkgs cctools does not have bitcode support.
    rm -r 'test cases/osx/7 bitcode'
    HOME="$TMPDIR" python ./run_project_tests.py

    runHook postCheck
  '';

  postFixup = ''
    pushd $out/bin
    # undo shell wrapper as meson tools are called with python
    for i in *; do
      mv ".$i-wrapped" "$i"
    done
    popd

    # Do not propagate Python
    rm $out/nix-support/propagated-build-inputs

    substituteInPlace "$out/share/bash-completion/completions/meson" \
      --replace "python3 -c " "${python3.interpreter} -c "
  '';

  buildInputs = lib.optionals (python3.pythonOlder "3.9") [
    libxcrypt
  ];

  nativeBuildInputs = [ installShellFiles ];

  postInstall = ''
    installShellCompletion --zsh data/shell-completions/zsh/_meson
    installShellCompletion --bash data/shell-completions/bash/meson
  '';

  meta = with lib; {
    homepage = "https://mesonbuild.com";
    description = "An open source, fast and friendly build system made in Python";
    longDescription = ''
      Meson is an open source build system meant to be both extremely fast, and,
      even more importantly, as user friendly as possible.

      The main design point of Meson is that every moment a developer spends
      writing or debugging build definitions is a second wasted. So is every
      second spent waiting for the build system to actually start compiling
      code.
    '';
    license = licenses.asl20;
    maintainers = with maintainers; [ mbe AndersonTorres ];
    inherit (python3.meta) platforms;
  };
}
# TODO: a more Nixpkgs-tailoired test suite