1{
2 lib,
3 stdenv,
4 fetchFromGitHub,
5
6 # nativeBuildInputs
7 docbook_xml_dtd_45,
8 docbook_xsl,
9 installShellFiles,
10 libxslt,
11 pkg-config,
12 python3,
13 which,
14
15 # buildInputs
16 pcre,
17
18 versionCheckHook,
19 gitUpdater,
20}:
21
22stdenv.mkDerivation (finalAttrs: {
23 pname = "cppcheck";
24 version = "2.17.1";
25
26 outputs = [
27 "out"
28 "man"
29 ];
30
31 src = fetchFromGitHub {
32 owner = "danmar";
33 repo = "cppcheck";
34 tag = finalAttrs.version;
35 hash = "sha256-jsLhVKNr/4RWw2SVNkycm/xbcy1BKIf983oTnaJKV6U=";
36 };
37
38 nativeBuildInputs = [
39 docbook_xml_dtd_45
40 docbook_xsl
41 installShellFiles
42 libxslt
43 pkg-config
44 python3
45 which
46 ];
47
48 buildInputs = [
49 pcre
50 (python3.withPackages (ps: [ ps.pygments ]))
51 ];
52
53 makeFlags = [
54 "PREFIX=$(out)"
55 "MATCHCOMPILER=yes"
56 "FILESDIR=$(out)/share/cppcheck"
57 "HAVE_RULES=yes"
58 ];
59
60 enableParallelBuilding = true;
61 strictDeps = true;
62
63 # test/testcondition.cpp:4949(TestCondition::alwaysTrueContainer): Assertion failed.
64 doCheck = !(stdenv.hostPlatform.isLinux && stdenv.hostPlatform.isAarch64);
65 doInstallCheck = true;
66
67 postPatch = ''
68 substituteInPlace Makefile \
69 --replace-fail 'PCRE_CONFIG = $(shell which pcre-config)' 'PCRE_CONFIG = $(PKG_CONFIG) libpcre'
70 ''
71 # Expected:
72 # Internal Error. MathLib::toDoubleNumber: conversion failed: 1invalid
73 #
74 # Actual:
75 # Internal Error. MathLib::toDoubleNumber: input was not completely consumed: 1invalid
76 + lib.optionalString stdenv.hostPlatform.isDarwin ''
77 substituteInPlace test/testmathlib.cpp \
78 --replace-fail \
79 'ASSERT_THROW_INTERNAL_EQUALS(MathLib::toDoubleNumber("1invalid"), INTERNAL, "Internal Error. MathLib::toDoubleNumber: conversion failed: 1invalid");' \
80 "" \
81 --replace-fail \
82 'ASSERT_THROW_INTERNAL_EQUALS(MathLib::toDoubleNumber("1.1invalid"), INTERNAL, "Internal Error. MathLib::toDoubleNumber: conversion failed: 1.1invalid");' \
83 ""
84 '';
85
86 postBuild = ''
87 make DB2MAN=${docbook_xsl}/xml/xsl/docbook/manpages/docbook.xsl man
88 '';
89
90 postInstall = ''
91 installManPage cppcheck.1
92 '';
93
94 nativeInstallCheckInputs = [
95 versionCheckHook
96 ];
97 versionCheckProgramArg = "--version";
98 installCheckPhase = ''
99 runHook preInstallCheck
100
101 echo 'int main() {}' > ./installcheck.cpp
102 $out/bin/cppcheck ./installcheck.cpp > /dev/null
103
104 runHook postInstallCheck
105 '';
106
107 passthru = {
108 updateScript = gitUpdater { };
109 };
110
111 meta = {
112 description = "Static analysis tool for C/C++ code";
113 longDescription = ''
114 Check C/C++ code for memory leaks, mismatching allocation-deallocation,
115 buffer overruns and more.
116 '';
117 homepage = "http://cppcheck.sourceforge.net";
118 license = lib.licenses.gpl3Plus;
119 maintainers = with lib.maintainers; [ joachifm ];
120 platforms = lib.platforms.unix;
121 };
122})