nixpkgs/pkgs/development/tools/build-managers/gnumake/default.nix
Sergei Trofimovich df7b6e6acc gnumake: 4.3 -> 4.4
Notable changes (have a chance to break some projects):

    * WARNING: Backward-incompatibility!
      Previously each target in a explicit grouped target rule was considered
      individually: if the targets needed by the build were not out of date the
      recipe was not run even if other targets in the group were out of date.  Now
      if any of the grouped targets are needed by the build, then if any of the
      grouped targets are out of date the recipe is run and all targets in the
      group are considered updated.

    * WARNING: Backward-incompatibility!
      Previously only simple (one-letter) options were added to the MAKEFLAGS
      variable that was visible while parsing makefiles.  Now, all options are
      available in MAKEFLAGS.  If you want to check MAKEFLAGS for a one-letter
      option, expanding "$(firstword -$(MAKEFLAGS))" is a reliable way to return
      the set of one-letter options which can be examined via findstring, etc.

    * WARNING: Backward-incompatibility!
      Previously makefile variables marked as export were not exported to commands
      started by the $(shell ...) function.  Now, all exported variables are
      exported to $(shell ...).  If this leads to recursion during expansion, then
      for backward-compatibility the value from the original environment is used.
      To detect this change search for 'shell-export' in the .FEATURES variable.

Notable features:

    * New feature: The --shuffle command line option
      This option reorders goals and prerequisites to simulate non-determinism
      that may be seen using parallel build.  Shuffle mode allows a form of "fuzz
      testing" of parallel builds to verify that all prerequisites are correctly
      described in the makefile.

Changes: https://lists.gnu.org/archive/html/bug-make/2022-10/msg00247.html
2022-10-31 07:54:25 +00:00

76 lines
2.6 KiB
Nix

{ lib
, stdenv
, fetchurl
, guileSupport ? false, guile
# avoid guile depend on bootstrap to prevent dependency cycles
, inBootstrap ? false
, pkg-config
, gnumake
}:
let
guileEnabled = guileSupport && !inBootstrap;
in
stdenv.mkDerivation rec {
pname = "gnumake";
version = "4.4";
src = fetchurl {
url = "mirror://gnu/make/make-${version}.tar.gz";
sha256 = "sha256-WB9NToctp0s5Qch0IViYp9NYAvA3Mr3M7h1KeXkQXRg=";
};
# to update apply these patches with `git am *.patch` to https://git.savannah.gnu.org/git/make.git
patches = [
# Replaces /bin/sh with sh, see patch file for reasoning
./0001-No-impure-bin-sh.patch
# Purity: don't look for library dependencies (of the form `-lfoo') in /lib
# and /usr/lib. It's a stupid feature anyway. Likewise, when searching for
# included Makefiles, don't look in /usr/include and friends.
./0002-remove-impure-dirs.patch
];
nativeBuildInputs = lib.optionals guileEnabled [ pkg-config ];
buildInputs = lib.optionals guileEnabled [ guile ];
configureFlags = lib.optional guileEnabled "--with-guile"
# Make uses this test to decide whether it should keep track of
# subseconds. Apple made this possible with APFS and macOS 10.13.
# However, we still support macOS 10.11 and 10.12. Binaries built
# in Nixpkgs will be unable to use futimens to set mtime less than
# a second. So, tell Make to ignore nanoseconds in mtime here by
# overriding the autoconf test for the struct.
# See https://github.com/NixOS/nixpkgs/issues/51221 for discussion.
++ lib.optional stdenv.isDarwin "ac_cv_struct_st_mtim_nsec=no";
outputs = [ "out" "man" "info" ];
separateDebugInfo = true;
passthru.tests = {
# make sure that the override doesn't break bootstrapping
gnumakeWithGuile = gnumake.override { guileSupport = true; };
};
meta = with lib; {
description = "A tool to control the generation of non-source files from sources";
longDescription = ''
Make is a tool which controls the generation of executables and
other non-source files of a program from the program's source files.
Make gets its knowledge of how to build your program from a file
called the makefile, which lists each of the non-source files and
how to compute it from other files. When you write a program, you
should write a makefile for it, so that it is possible to use Make
to build and install the program.
'';
homepage = "https://www.gnu.org/software/make/";
license = licenses.gpl3Plus;
maintainers = [ maintainers.vrthra ];
mainProgram = "make";
platforms = platforms.all;
};
}