biome: 1.9.2 -> 1.9.3
[NixPkgs.git] / pkgs / by-name / ja / jam / package.nix
blob9fbe6f4c7724405f53cf3e525f6e87588bde417e
2   lib,
3   bison,
4   buildPackages,
5   fetchurl,
6   installShellFiles,
7   pkgsBuildTarget,
8   stdenv,
9   testers,
12 stdenv.mkDerivation (finalAttrs: {
13   pname = "jam";
14   version = "2.6.1";
16   src = fetchurl {
17     url = "https://swarm.workshop.perforce.com/downloads/guest/perforce_software/jam/jam-${finalAttrs.version}.tar";
18     hash = "sha256-rOayJ8GpmFk0/RPJwK5Pf/RBccbe2Lg7s9p15u/cs6c=";
19   };
21   outputs = [
22     "out"
23     "doc"
24   ];
26   depsBuildBuild = [ buildPackages.stdenv.cc ];
28   nativeBuildInputs = [
29     bison
30     installShellFiles
31   ];
33   makeFlags = [
34     "CC=${buildPackages.stdenv.cc.targetPrefix}cc"
35   ];
37   env = {
38     LOCATE_TARGET = "bin.unix";
39     # Jam uses c89 conventions
40     NIX_CFLAGS_COMPILE = "-std=c89";
41   };
43   enableParallelBuilding = true;
45   strictDeps = true;
47   # Jambase expects ar to have flags.
48   preConfigure = ''
49     export AR="$AR rc"
50   '';
52   postPatch =
53     ''
54       substituteInPlace jam.h --replace-fail 'ifdef linux' 'ifdef __linux__'
55     ''
56     +
57       # When cross-compiling, we need to set the preprocessor macros
58       # OSMAJOR/OSMINOR/OSPLAT to the values from the target platform, not the host
59       # platform. This looks a little ridiculous because the vast majority of build
60       # tools don't embed target-specific information into their binary, but in this
61       # case we behave more like a compiler than a make(1)-alike.
62       lib.optionalString (stdenv.hostPlatform != stdenv.targetPlatform) ''
63          cat >>jam.h <<EOF
64          #undef OSMAJOR
65          #undef OSMINOR
66          #undef OSPLAT
67          $(
68            ${pkgsBuildTarget.targetPackages.stdenv.cc}/bin/${pkgsBuildTarget.targetPackages.stdenv.cc.targetPrefix}cc -E -dM jam.h | grep -E '^#define (OSMAJOR|OSMINOR|OSPLAT) '
69           )
70         EOF
71       '';
73   buildPhase = ''
74     runHook preBuild
75     make $makeFlags jam0
76     ./jam0 -j$NIX_BUILD_CORES -sCC=${buildPackages.stdenv.cc.targetPrefix}cc jambase.c
77     ./jam0 -j$NIX_BUILD_CORES
78     runHook postBuild
79   '';
81   installPhase = ''
82     runHook preInstall
84     installBin bin.unix/jam
85     install -Dm644 -t ''${!outputDoc}/share/doc/jam-${finalAttrs.version}/ *.html
87     runHook postInstall
88   '';
90   passthru = {
91     tests.version = testers.testVersion {
92       package = finalAttrs.finalPackage;
93       command = "jam -v";
94     };
95     tests.os = testers.runCommand {
96       name = "${finalAttrs.finalPackage.name}-os";
97       nativeBuildInputs = [ finalAttrs.finalPackage ];
98       script = ''
99         echo 'echo $(OS) ;' > Jamfile
100         os=$(jam -d0)
101         [[ $os != UNKNOWN* ]] && touch $out
102       '';
103     };
104   };
106   meta = {
107     homepage = "https://swarm.workshop.perforce.com/projects/perforce_software-jam";
108     description = "Just Another Make";
109     longDescription = ''
110       Jam is a program construction tool, like make(1).
112       Jam recursively builds target files from source files, using dependency
113       information and updating actions expressed in the Jambase file, which is
114       written in jam's own interpreted language. The default Jambase is compiled
115       into jam and provides a boilerplate for common use, relying on a
116       user-provide file "Jamfile" to enumerate actual targets and sources.
117     '';
118     license = lib.licenses.free;
119     mainProgram = "jam";
120     maintainers = with lib.maintainers; [
121       impl
122       orivej
123       AndersonTorres
124     ];
125     platforms = lib.platforms.unix;
126   };