aboutsummaryrefslogtreecommitdiff
path: root/security/afl++/Makefile
blob: 84f06b73fa17d353a34f5ad2dd29dee56fc97913 (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
# Created by: Fabian Keil <fk@fabiankeil.de>

PORTNAME=	afl
PORTVERSION=	2.63c
CATEGORIES=	security
PKGNAMESUFFIX=	++

MAINTAINER=	ports@FreeBSD.org
COMMENT=	Fast instrumented fuzzer

LICENSE=	APACHE20
LICENSE_FILE=	${WRKSRC}/docs/COPYING

ONLY_FOR_ARCHS=	aarch64 amd64 i386 powerpc64 powerpc64le
ONLY_FOR_ARCHS_REASON=	uses x86-only instrumentation or requires complete LLVM support

BUILD_DEPENDS=	ginstall:sysutils/coreutils
TEST_DEPENDS=	bash:shells/bash

USES=		gmake tar:tgz
USE_GITHUB=	yes
GH_ACCOUNT=	AFLplusplus
GH_PROJECT=	AFLplusplus

MAKEFILE=	GNUmakefile
MAKE_ARGS=	STRIP_CMD="${STRIP_CMD}"
ALL_TARGET=	all libtokencap
INSTALL_TARGET=	install-strip
TEST_TARGET=	test_build

CONFLICTS_INSTALL=	afl

BINARY_ALIAS=	install=ginstall

OPTIONS_DEFINE=		DEBUG DOCS EXAMPLES GCC LIBDISLOCATOR LLVM PYTHON
OPTIONS_DEFAULT=	GCC LIBDISLOCATOR LLVM PYTHON

# libdislocator fails to build on FreeBSD 11.x
# error: typedef redefinition with different types ('struct max_align_t' vs '__max_align_t')
OPTIONS_EXCLUDE_FreeBSD_11=	LIBDISLOCATOR

# On non-x86 architectures LLVM is mandatory
OPTIONS_SLAVE=	${ARCH:Namd64:Ni386:S/${ARCH}/LLVM/}
OPTIONS_SUB=	yes

GCC_DESC=		Build GCC plugin and afl-gcc-fast
LIBDISLOCATOR_DESC=	Abusive allocator for uncovering heap-related bugs
LLVM_DESC=		LLVM-based instrumentation
PYTHON_DESC=		Python mutators support

GCC_BUILD_DEPENDS=	gcc${GCC_DEFAULT}>0:lang/gcc${GCC_DEFAULT}
GCC_RUN_DEPENDS=	gcc${GCC_DEFAULT}>0:lang/gcc${GCC_DEFAULT}
GCC_MAKE_ARGS=		GCC=gcc${GCC_DEFAULT:S/-devel$//} \
			GXX=g++${GCC_DEFAULT:S/-devel$//}
GCC_ALL_TARGET=		gcc_plugin
GCC_TEST_TARGET=	test_gcc_plugin

LIBDISLOCATOR_ALL_TARGET=	libdislocator

LLVM_BUILD_DEPENDS=	clang${LLVM_DEFAULT}:devel/llvm${LLVM_DEFAULT}
LLVM_RUN_DEPENDS=	clang${LLVM_DEFAULT}:devel/llvm${LLVM_DEFAULT}
LLVM_MAKE_ARGS=		_AFL_REAL_LD=${LOCALBASE}/bin/ld.lld${LLVM_DEFAULT} \
			CC=clang${LLVM_DEFAULT} \
			CXX=clang++${LLVM_DEFAULT} \
			LLVM_CONFIG=llvm-config${LLVM_DEFAULT}
LLVM_ALL_TARGET=	llvm_mode
LLVM_TEST_TARGET=	test_llvm_mode
LLVM_BINARY_ALIAS=	llvm-config=llvm-config${LLVM_DEFAULT}

PYTHON_USES=		gettext-runtime python:3.7
PYTHON_MAKE_ARGS_OFF=	PYTHON_INCLUDE=/nonexistent

.include <bsd.port.options.mk>

.if ${ARCH} == "i386" || ${ARCH} == "amd64"
PLIST_SUB+=	X86=""
.else
MAKE_ARGS+=	AFL_NO_X86=1
PLIST_SUB+=	X86="@comment "
.endif

.if ${ARCH} == "i386"
# Clang i386 emits .cfi_sections which base as(1) doesn't understand
BUILD_DEPENDS+=	${LOCALBASE}/bin/as:devel/binutils
RUN_DEPENDS+=	${LOCALBASE}/bin/as:devel/binutils
.endif

post-patch:
# Disable the instrumentation tests to make sure building packages in
# jails works by default.  afl needs shmget() which usually isn't
# available in jails.
	@${REINPLACE_CMD} 's@^\(all.*\) test_build@\1@' \
		${WRKSRC}/${MAKEFILE} \
		${WRKSRC}/gcc_plugin/GNUmakefile \
		${WRKSRC}/llvm_mode/GNUmakefile
.if ${ARCH} == "i386"
	@${REINPLACE_CMD} 's@\(  as_params\[0\] = afl_as ? afl_as : \)\(.*\)@\1(u8*)"${LOCALBASE}/bin/as";@' \
		${WRKSRC}/src/afl-as.c
.endif
	@${ECHO_CMD} "include ${FILESDIR}/Makefile.extra" >> ${WRKSRC}/${MAKEFILE}

post-patch-LLVM-on:
	@${REINPLACE_CMD} \
		-e 's|"clang"|"clang${LLVM_DEFAULT}"|g' \
		-e 's|"clang\+\+"|"clang\+\+${LLVM_DEFAULT}"|g' \
		${WRKSRC}/llvm_mode/afl-clang-fast.c

post-install:
	@${MKDIR} ${STAGEDIR}${DOCSDIR}/libtokencap
	${INSTALL_MAN} ${WRKSRC}/libtokencap/README.md \
		${STAGEDIR}${DOCSDIR}/libtokencap
	@cd ${STAGEDIR}${PREFIX} && \
		${FIND} lib/afl -name 'argvfuzz*.so' -or -name 'socketfuzz*.so' \
		>> ${TMPPLIST}

post-install-EXAMPLES-on:
	@${MKDIR} ${STAGEDIR}${EXAMPLESDIR}/custom_mutators
	@cd ${WRKSRC}/examples && \
		${COPYTREE_SHARE} custom_mutators ${STAGEDIR}${EXAMPLESDIR}

post-install-GCC-on:
	@${MKDIR} ${STAGEDIR}${DOCSDIR}/gcc_plugin
	${INSTALL_MAN} ${WRKSRC}/gcc_plugin/README.* \
		${STAGEDIR}${DOCSDIR}/gcc_plugin

post-install-LIBDISLOCATOR-on:
	@${MKDIR} ${STAGEDIR}${DOCSDIR}/libdislocator
	${INSTALL_MAN} ${WRKSRC}/libdislocator/README.md \
		${STAGEDIR}${DOCSDIR}/libdislocator

post-install-LLVM-on:
	${MKDIR} ${STAGEDIR}${DOCSDIR}/llvm_mode
	${INSTALL_MAN} ${WRKSRC}/llvm_mode/README.* \
		${STAGEDIR}${DOCSDIR}/llvm_mode

post-test:
# libtokencap test might require security.bsd.unprivileged_proc_debug=1
	@cd ${WRKSRC}/test && ${SETENV} AFL_PATH=${WRKSRC} ./test.sh

.include <bsd.port.mk>