blob: 73d95e0a1b1945170ec3390eeb4b0842426bec29 [file] [log] [blame]
robert.swiecki3bb518c2010-10-14 00:48:24 +00001# honggfuzz - Makefile
2# -----------------------------------------
3#
4# Author: Robert Swiecki <swiecki@google.com>
5#
robert.swiecki@gmail.comba85c3e2015-02-02 14:55:16 +00006# Copyright 2010-2015 by Google Inc. All Rights Reserved.
robert.swiecki3bb518c2010-10-14 00:48:24 +00007#
8# Licensed under the Apache License, Version 2.0 (the "License");
9# you may not use this file except in compliance with the License.
10# You may obtain a copy of the License at
11#
12# http://www.apache.org/licenses/LICENSE-2.0
13#
14# Unless required by applicable law or agreed to in writing, software
15# distributed under the License is distributed on an "AS IS" BASIS,
16# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17# See the License for the specific language governing permissions and
18# limitations under the License.
Aaron Carreras0903ae42016-10-14 13:25:55 -040019#
20# NOTE: xcrun is within xcode...xcode is required on OSX.
21#
robert.swiecki3bb518c2010-10-14 00:48:24 +000022
Anestis Bechtsoudis057c99f2015-09-24 14:39:57 +030023# Common for all architectures
Robert Swieckia9db9dd2016-03-09 16:29:37 +010024CC ?= gcc
25LD = $(CC)
Anestis Bechtsoudis057c99f2015-09-24 14:39:57 +030026BIN := honggfuzz
Robert Swieckic87e1c52018-01-07 01:28:30 +010027HFUZZ_CC_BIN := hfuzz_cc/hfuzz-cc
Robert Swiecki241a7412017-05-24 01:53:15 +020028HFUZZ_CC_SRCS := hfuzz_cc/hfuzz-cc.c
Robert Swiecki54fd5a42018-02-03 00:35:47 +010029COMMON_CFLAGS := -D_GNU_SOURCE -Wall -Werror -Wno-format-truncation -I.
Robert Swiecki246af3e2018-01-05 14:56:32 +010030COMMON_LDFLAGS := -lm libhfcommon/libhfcommon.a
Bernhard M. Wiedemann5dd074d2017-05-29 13:53:02 +020031COMMON_SRCS := $(sort $(wildcard *.c))
Robert Swieckifeb21152019-01-17 22:30:06 +010032CFLAGS ?= -O3 -mtune=native
Jaggera443b692016-08-29 23:01:15 +020033LDFLAGS ?=
Robert Swiecki5883f462019-01-31 11:27:48 +010034LIBS_CFLAGS ?= -fPIC -fno-stack-protector
Robert Swieckie7da4112018-01-16 22:21:08 +010035GREP_COLOR ?=
groebert@google.com1bd4c212013-06-19 11:13:56 +000036
robert.swiecki@gmail.com448d2812015-02-02 20:57:13 +000037OS ?= $(shell uname -s)
robert.swiecki@gmail.com15eca6f2015-03-04 03:31:36 +000038MARCH ?= $(shell uname -m)
Paul Grandperrin23eb3122018-02-22 22:26:16 +010039KERNEL ?= $(shell uname -r)
groebert@google.com1bd4c212013-06-19 11:13:56 +000040
Paul Grandperrin8dd69f52018-02-22 22:38:19 +010041ifeq ($(OS)$(findstring Microsoft,$(KERNEL)),Linux) # matches Linux but excludes WSL (Windows Subsystem for Linux)
Anestis Bechtsoudis057c99f2015-09-24 14:39:57 +030042 ARCH := LINUX
Robert Swieckiac310a82016-02-22 18:58:36 +010043
Robert Swieckib567b4a2017-09-28 18:28:15 +020044 ARCH_CFLAGS := -std=c11 -I/usr/local/include \
Robert Swieckiab7134a2017-05-29 17:28:11 +020045 -Wextra -Wno-override-init \
46 -funroll-loops \
Anestis Bechtsoudis057c99f2015-09-24 14:39:57 +030047 -D_FILE_OFFSET_BITS=64
Robert Swiecki30f83c62017-09-28 18:31:39 +020048 ARCH_LDFLAGS := -L/usr/local/include \
Kamil Rytarowskiea9dc6f2018-08-15 05:21:30 +020049 -pthread -lunwind-ptrace -lunwind-generic -lbfd -lopcodes -lrt -ldl
Bernhard M. Wiedemann5dd074d2017-05-29 13:53:02 +020050 ARCH_SRCS := $(sort $(wildcard linux/*.c))
Robert Swieckicd8d2ac2017-12-12 14:45:14 +010051 LIBS_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0
robert.swiecki@gmail.com3ad0bb32015-03-04 17:19:13 +000052
Anestis Bechtsoudis057c99f2015-09-24 14:39:57 +030053 ifeq ("$(wildcard /usr/include/bfd.h)","")
54 WARN_LIBRARY += binutils-devel
55 endif
56 ifeq ("$(wildcard /usr/include/libunwind-ptrace.h)","")
57 WARN_LIBRARY += libunwind-devel/libunwind8-devel
58 endif
Jagger9797ac52016-02-04 23:57:29 +010059 ifeq ("$(wildcard /usr/local/include/intel-pt.h)","/usr/local/include/intel-pt.h")
60 ARCH_CFLAGS += -D_HF_LINUX_INTEL_PT_LIB
61 ARCH_CFLAGS += -I/usr/local/include
Jagger070b2c62016-02-05 06:01:15 +010062 ARCH_LDFLAGS += -L/usr/local/lib -lipt -Wl,--rpath=/usr/local/lib
Jagger9797ac52016-02-04 23:57:29 +010063 endif
64 ifeq ("$(wildcard /usr/include/intel-pt.h)","/usr/include/intel-pt.h")
65 ARCH_CFLAGS += -D_HF_LINUX_INTEL_PT_LIB
Jagger3594cda2016-02-08 00:05:47 +010066 ARCH_LDFLAGS += -lipt
Jagger9797ac52016-02-04 23:57:29 +010067 endif
Anestis Bechtsoudis057c99f2015-09-24 14:39:57 +030068 ifdef WARN_LIBRARY
Robert Swieckie2cf25b2019-01-30 20:16:28 +010069 $(info --------------------------------------------------------)
Robert Swiecki2fbd5872019-02-03 01:10:20 +010070 $(info Libraries which are most likely missing on your OS. )
71 $(info This can result in linking/compilation errors. )
72 $(info > $(WARN_LIBRARY))
Robert Swieckie2cf25b2019-01-30 20:16:28 +010073 $(info --------------------------------------------------------)
Anestis Bechtsoudis057c99f2015-09-24 14:39:57 +030074 endif
Anestis Bechtsoudis057c99f2015-09-24 14:39:57 +030075 # OS Linux
76else ifeq ($(OS),Darwin)
77 ARCH := DARWIN
Aaron Carrerasbfd365f2016-10-16 09:22:19 -040078
Robert Swieckie7da4112018-01-16 22:21:08 +010079 # MacOS-X grep seem to use colors unconditionally
80 GREP_COLOR = --color=never
81
Aaron Carrerasbfd365f2016-10-16 09:22:19 -040082 # Figure out which crash reporter to use.
Anestis Bechtsoudis0e5c2c52015-10-08 13:30:03 -070083 CRASHWRANGLER := third_party/mac
Aaron Carreras623f4eb2016-10-15 07:52:13 -040084 OS_VERSION := $(shell sw_vers -productVersion)
Yishuai Li081c5962018-10-08 18:52:50 -040085 ifneq (,$(findstring 10.14,$(OS_VERSION)))
86 CRASH_REPORT := $(CRASHWRANGLER)/CrashReport_Sierra.o
87 else ifneq (,$(findstring 10.13,$(OS_VERSION)))
Anestis Bechtsoudis6f902a42017-11-03 07:13:54 +020088 CRASH_REPORT := $(CRASHWRANGLER)/CrashReport_Sierra.o
89 else ifneq (,$(findstring 10.12,$(OS_VERSION)))
Robert Swiecki1fe79722018-02-21 18:34:08 +010090 CRASH_REPORT := $(CRASHWRANGLER)/CrashReport_Sierra.o
Aaron Carreras623f4eb2016-10-15 07:52:13 -040091 else ifneq (,$(findstring 10.11,$(OS_VERSION)))
92 # El Capitan didn't break compatibility
93 CRASH_REPORT := $(CRASHWRANGLER)/CrashReport_Yosemite.o
94 else ifneq (,$(findstring 10.10,$(OS_VERSION)))
95 CRASH_REPORT := $(CRASHWRANGLER)/CrashReport_Yosemite.o
96 else ifneq (,$(findstring 10.9,$(OS_VERSION)))
97 CRASH_REPORT := $(CRASHWRANGLER)/CrashReport_Mavericks.o
98 else ifneq (,$(findstring 10.8,$(OS_VERSION)))
99 CRASH_REPORT := $(CRASHWRANGLER)/CrashReport_Mountain_Lion.o
100 else
101 $(error Unsupported MAC OS X version)
102 endif
103
Aaron Carrerasbfd365f2016-10-16 09:22:19 -0400104 # Figure out which XCode SDK to use.
105 OSX_SDK_VERSION := $(shell xcrun --show-sdk-version)
Robert Swiecki1fe79722018-02-21 18:34:08 +0100106 SDK_NAME_V := macosx$(OSX_SDK_VERSION)
107 SDK_V := $(shell xcrun --sdk $(SDK_NAME) --show-sdk-path 2>/dev/null)
108 SDK_NAME := macosx
Anestis Bechtsoudis057c99f2015-09-24 14:39:57 +0300109 SDK := $(shell xcrun --sdk $(SDK_NAME) --show-sdk-path 2>/dev/null)
Aaron Carrerasbfd365f2016-10-16 09:22:19 -0400110
Anestis Bechtsoudis057c99f2015-09-24 14:39:57 +0300111 CC := $(shell xcrun --sdk $(SDK_NAME) --find cc)
112 LD := $(shell xcrun --sdk $(SDK_NAME) --find cc)
Robert Swiecki10eeb0a2017-09-28 15:42:52 +0200113 ARCH_CFLAGS := -arch x86_64 -std=c99 -isysroot $(SDK) \
Robert Swieckia9db9dd2016-03-09 16:29:37 +0100114 -x objective-c -pedantic -fblocks \
Anestis Bechtsoudis057c99f2015-09-24 14:39:57 +0300115 -Wimplicit -Wunused -Wcomment -Wchar-subscripts -Wuninitialized \
116 -Wreturn-type -Wpointer-arith -Wno-gnu-case-range -Wno-gnu-designator \
Robert Swieckid1df4b52018-08-21 15:12:56 +0200117 -Wno-deprecated-declarations -Wno-unknown-pragmas -Wno-attributes \
118 -Wno-embedded-directive
Anestis Bechtsoudis057c99f2015-09-24 14:39:57 +0300119 ARCH_LDFLAGS := -F/System/Library/PrivateFrameworks -framework CoreSymbolication -framework IOKit \
Robert Swiecki1fe79722018-02-21 18:34:08 +0100120 -F$(SDK_V)/System/Library/Frameworks -F$(SDK_V)/System/Library/PrivateFrameworks \
121 -F$(SDK)/System/Library/Frameworks \
Anestis Bechtsoudis057c99f2015-09-24 14:39:57 +0300122 -framework Foundation -framework ApplicationServices -framework Symbolication \
123 -framework CoreServices -framework CrashReporterSupport -framework CoreFoundation \
124 -framework CommerceKit $(CRASH_REPORT)
Anestis Bechtsoudis9dcb66a2017-04-08 20:12:44 +0300125
Robert Swieckie7da4112018-01-16 22:21:08 +0100126 XCODE_VER := $(shell xcodebuild -version | grep $(GREP_COLOR) "^Xcode" | cut -d " " -f2)
Anestis Bechtsoudis9dcb66a2017-04-08 20:12:44 +0300127 ifeq "8.3" "$(word 1, $(sort 8.3 $(XCODE_VER)))"
128 ARCH_LDFLAGS += -F/Applications/Xcode.app/Contents/SharedFrameworks \
129 -framework CoreSymbolicationDT \
130 -Wl,-rpath,/Applications/Xcode.app/Contents/SharedFrameworks
131 endif
132
Anestis Bechtsoudis057c99f2015-09-24 14:39:57 +0300133 MIG_RET := $(shell mig -header mac/mach_exc.h -user mac/mach_excUser.c -sheader mac/mach_excServer.h \
134 -server mac/mach_excServer.c $(SDK)/usr/include/mach/mach_exc.defs &>/dev/null; echo $$?)
135 ifeq ($(MIG_RET),1)
136 $(error mig failed to generate RPC code)
137 endif
Bernhard M. Wiedemann5dd074d2017-05-29 13:53:02 +0200138 ARCH_SRCS := $(sort $(wildcard mac/*.c))
Anestis Bechtsoudis057c99f2015-09-24 14:39:57 +0300139 # OS Darwin
Kamil Rytarowski45a1cf42018-08-15 06:26:26 +0200140else ifeq ($(OS),NetBSD)
141 ARCH := NETBSD
142
143 ARCH_SRCS := $(sort $(wildcard netbsd/*.c))
Robert Swiecki3d606ec2018-08-25 12:24:24 +0200144 ARCH_CFLAGS := -std=c11 -I/usr/local/include -I/usr/pkg/include \
Kamil Rytarowski45a1cf42018-08-15 06:26:26 +0200145 -Wextra -Wno-override-init \
146 -funroll-loops -D_KERNTYPES
David Carlier293e6ed2018-10-09 21:29:17 +0100147 ARCH_LDFLAGS := -L/usr/local/lib -L/usr/pkg/lib \
Robert Swiecki3d606ec2018-08-25 12:24:24 +0200148 -pthread -lcapstone -lrt \
149 -Wl,--rpath=/usr/pkg/lib
Kamil Rytarowski45a1cf42018-08-15 06:26:26 +0200150
151 # OS NetBSD
tlogic@gmail.com479f0f92015-04-15 18:03:16 +0000152else
Anestis Bechtsoudis057c99f2015-09-24 14:39:57 +0300153 ARCH := POSIX
Robert Swieckif2e23ff2018-01-12 00:12:01 +0100154
Bernhard M. Wiedemann5dd074d2017-05-29 13:53:02 +0200155 ARCH_SRCS := $(sort $(wildcard posix/*.c))
Robert Swieckib567b4a2017-09-28 18:28:15 +0200156 ARCH_CFLAGS := -std=c11 -I/usr/local/include \
Anestis Bechtsoudis057c99f2015-09-24 14:39:57 +0300157 -Wextra -Wno-initializer-overrides -Wno-override-init \
Robert Swieckiac310a82016-02-22 18:58:36 +0100158 -Wno-unknown-warning-option -Wno-unknown-pragmas \
Robert Swiecki5b71fba2017-12-16 04:55:40 +0100159 -funroll-loops
plusun05c67202018-06-29 11:20:20 +0000160 ARCH_LDFLAGS := -pthread -L/usr/local/lib
Anestis Bechtsoudis057c99f2015-09-24 14:39:57 +0300161 # OS Posix
tlogic@gmail.com479f0f92015-04-15 18:03:16 +0000162endif
robert.swiecki@gmail.comb0cac5b2015-02-17 00:19:59 +0000163
Robert Swieckie0c31372018-01-13 04:36:00 +0100164CFLAGS_BLOCKS =
Anestis Bechtsoudisd9622292017-06-15 13:30:15 +0400165COMPILER = $(shell $(CC) -v 2>&1 | \
Robert Swieckie7da4112018-01-16 22:21:08 +0100166 grep $(GREP_COLOR) -oE '((gcc|clang) version|LLVM version.*clang)' | \
167 grep $(GREP_COLOR) -oE '(clang|gcc)' | head -n1)
Jagger98561502016-03-10 00:01:08 +0100168ifeq ($(COMPILER),clang)
Anestis Bechtsoudisd9622292017-06-15 13:30:15 +0400169 ARCH_CFLAGS += -Wno-initializer-overrides -Wno-unknown-warning-option
Robert Swiecki89d444a2018-01-11 23:45:19 +0100170 ARCH_CFLAGS += -Wno-gnu-empty-initializer -Wno-format-pedantic
171 ARCH_CFLAGS += -Wno-gnu-statement-expression
Robert Swieckie0c31372018-01-13 04:36:00 +0100172 CFLAGS_BLOCKS = -fblocks
Anestis Bechtsoudisd9622292017-06-15 13:30:15 +0400173
174 ifneq ($(OS),Darwin)
Jagger98561502016-03-10 00:01:08 +0100175 ARCH_LDFLAGS += -lBlocksRuntime
Anestis Bechtsoudisd9622292017-06-15 13:30:15 +0400176 endif
Jagger98561502016-03-10 00:01:08 +0100177endif
178
Anestis Bechtsoudis057c99f2015-09-24 14:39:57 +0300179SRCS := $(COMMON_SRCS) $(ARCH_SRCS)
180OBJS := $(SRCS:.c=.o)
Jaggera72ac9d2016-04-01 23:48:12 +0200181
Robert Swieckicf8cd902018-08-24 10:35:00 +0200182LHFUZZ_SRCS := $(sort $(wildcard libhfuzz/*.c))
Robert Swieckia1d23b52017-05-25 00:42:43 +0200183LHFUZZ_OBJS := $(LHFUZZ_SRCS:.c=.o)
Robert Swieckiec03fc52017-05-25 00:41:23 +0200184LHFUZZ_ARCH := libhfuzz/libhfuzz.a
Robert Swieckia87c8af2017-09-28 15:59:04 +0200185HFUZZ_INC ?= $(shell pwd)
Anestis Bechtsoudis057c99f2015-09-24 14:39:57 +0300186
Robert Swieckicf8cd902018-08-24 10:35:00 +0200187LCOMMON_SRCS := $(sort $(wildcard libhfcommon/*.c))
Robert Swieckiec03fc52017-05-25 00:41:23 +0200188LCOMMON_OBJS := $(LCOMMON_SRCS:.c=.o)
Robert Swiecki246af3e2018-01-05 14:56:32 +0100189LCOMMON_ARCH := libhfcommon/libhfcommon.a
Robert Swiecki241a7412017-05-24 01:53:15 +0200190
Robert Swieckicf8cd902018-08-24 10:35:00 +0200191LNETDRIVER_SRCS := $(sort $(wildcard libhfnetdriver/*.c))
Robert Swiecki90892fb2018-01-04 16:00:54 +0100192LNETDRIVER_OBJS := $(LNETDRIVER_SRCS:.c=.o)
Robert Swiecki246af3e2018-01-05 14:56:32 +0100193LNETDRIVER_ARCH := libhfnetdriver/libhfnetdriver.a
Robert Swiecki90892fb2018-01-04 16:00:54 +0100194
Anestis Bechtsoudis057c99f2015-09-24 14:39:57 +0300195# Respect external user defines
Robert Swiecki68fef5b2017-04-29 13:09:46 +0200196CFLAGS += $(COMMON_CFLAGS) $(ARCH_CFLAGS) -D_HF_ARCH_${ARCH}
Anestis Bechtsoudis057c99f2015-09-24 14:39:57 +0300197LDFLAGS += $(COMMON_LDFLAGS) $(ARCH_LDFLAGS)
robert.swiecki3bb518c2010-10-14 00:48:24 +0000198
Anestis Bechtsoudis3485c732015-09-10 17:40:04 +0300199ifeq ($(DEBUG),true)
Anestis Bechtsoudis057c99f2015-09-24 14:39:57 +0300200 CFLAGS += -g -ggdb
Robert Swieckicaf9d762016-03-10 16:13:18 +0100201 LDFLAGS += -g -ggdb
Anestis Bechtsoudis3485c732015-09-10 17:40:04 +0300202endif
203
Anestis Bechtsoudiscfc39fb2015-08-06 10:31:36 +0300204# Control Android builds
Robert Swieckidec78f12017-12-15 04:43:22 +0100205ANDROID_API ?= android-26
Anestis Bechtsoudiscfc39fb2015-08-06 10:31:36 +0300206ANDROID_DEBUG_ENABLED ?= false
Anestis Bechtsoudisa187dcf2017-12-04 10:44:02 +0200207ANDROID_CLANG ?= true
Anestis Bechtsoudiscfc39fb2015-08-06 10:31:36 +0300208ANDROID_APP_ABI ?= armeabi-v7a
Anestis Bechtsoudisf5ded932016-10-18 10:50:00 +0300209ANDROID_SKIP_CLEAN ?= false
Anestis Bechtsoudiscfc39fb2015-08-06 10:31:36 +0300210NDK_BUILD_ARGS :=
Anestis Bechtsoudisf5ded932016-10-18 10:50:00 +0300211
Anestis Bechtsoudiscfc39fb2015-08-06 10:31:36 +0300212ifeq ($(ANDROID_DEBUG_ENABLED),true)
Anestis Bechtsoudisf5ded932016-10-18 10:50:00 +0300213 NDK_BUILD_ARGS += V=1 NDK_DEBUG=1 APP_OPTIM=debug
214endif
215
216# By default ndk-build cleans all project files to ensure that no semi-completed
217# builds reach the app package. The following flag disables this check. It's mainly
218# purposed to be used with android-all rule where we want recursive invocations
219# to keep previous targets' binaries.
220ifeq ($(ANDROID_SKIP_CLEAN),true)
221 NDK_BUILD_ARGS += NDK_APP.local.cleaned_binaries=true
Anestis Bechtsoudiscfc39fb2015-08-06 10:31:36 +0300222endif
223
Anestis Bechtsoudisd1fccd52016-05-06 13:11:27 +0300224ifeq ($(ANDROID_CLANG),true)
Anestis Bechtsoudisa187dcf2017-12-04 10:44:02 +0200225 ANDROID_NDK_TOOLCHAIN_VER := clang
Anestis Bechtsoudis6a938ed2016-10-12 12:04:34 +0300226 # clang works only against APIs >= 23
227 ifeq ($(ANDROID_APP_ABI),$(filter $(ANDROID_APP_ABI),armeabi armeabi-v7a))
Anestis Bechtsoudisf0179252016-09-06 12:11:05 +0300228 ANDROID_NDK_TOOLCHAIN ?= arm-linux-androideabi-clang
Anestis Bechtsoudisb4446a82016-10-28 11:30:10 +0300229 ANDROID_ARCH_CPU := arm
Anestis Bechtsoudis6a938ed2016-10-12 12:04:34 +0300230 else ifeq ($(ANDROID_APP_ABI),$(filter $(ANDROID_APP_ABI),x86))
Jaggerd18ba372016-09-04 19:03:46 +0200231 ANDROID_NDK_TOOLCHAIN ?= x86-clang
Anestis Bechtsoudisb4446a82016-10-28 11:30:10 +0300232 ANDROID_ARCH_CPU := x86
Anestis Bechtsoudis6a938ed2016-10-12 12:04:34 +0300233 else ifeq ($(ANDROID_APP_ABI),$(filter $(ANDROID_APP_ABI),arm64-v8a))
Jaggerd18ba372016-09-04 19:03:46 +0200234 ANDROID_NDK_TOOLCHAIN ?= aarch64-linux-android-clang
Anestis Bechtsoudisb4446a82016-10-28 11:30:10 +0300235 ANDROID_ARCH_CPU := arm64
Anestis Bechtsoudis6a938ed2016-10-12 12:04:34 +0300236 else ifeq ($(ANDROID_APP_ABI),$(filter $(ANDROID_APP_ABI),x86_64))
Jaggerd18ba372016-09-04 19:03:46 +0200237 ANDROID_NDK_TOOLCHAIN ?= x86_64-clang
Anestis Bechtsoudisb4446a82016-10-28 11:30:10 +0300238 ANDROID_ARCH_CPU := x86_64
Anestis Bechtsoudisd1fccd52016-05-06 13:11:27 +0300239 else
240 $(error Unsuported / Unknown APP_API '$(ANDROID_APP_ABI)')
241 endif
242else
Anestis Bechtsoudisa187dcf2017-12-04 10:44:02 +0200243 ANDROID_NDK_TOOLCHAIN_VER := 4.9
Anestis Bechtsoudis6a938ed2016-10-12 12:04:34 +0300244 ifeq ($(ANDROID_APP_ABI),$(filter $(ANDROID_APP_ABI),armeabi armeabi-v7a))
245 ANDROID_NDK_TOOLCHAIN ?= arm-linux-androideabi-4.9
Anestis Bechtsoudisb4446a82016-10-28 11:30:10 +0300246 ANDROID_ARCH_CPU := arm
Anestis Bechtsoudis6a938ed2016-10-12 12:04:34 +0300247 else ifeq ($(ANDROID_APP_ABI),$(filter $(ANDROID_APP_ABI),x86))
248 ANDROID_NDK_TOOLCHAIN ?= x86-4.9
Anestis Bechtsoudisb4446a82016-10-28 11:30:10 +0300249 ANDROID_ARCH_CPU := x86
Anestis Bechtsoudis6a938ed2016-10-12 12:04:34 +0300250 else ifeq ($(ANDROID_APP_ABI),$(filter $(ANDROID_APP_ABI),arm64-v8a))
251 ANDROID_NDK_TOOLCHAIN ?= aarch64-linux-android-4.9
Anestis Bechtsoudisb4446a82016-10-28 11:30:10 +0300252 ANDROID_ARCH_CPU := arm64
Anestis Bechtsoudis6a938ed2016-10-12 12:04:34 +0300253 else ifeq ($(ANDROID_APP_ABI),$(filter $(ANDROID_APP_ABI),x86_64))
254 ANDROID_NDK_TOOLCHAIN ?= x86_64-4.9
Anestis Bechtsoudisb4446a82016-10-28 11:30:10 +0300255 ANDROID_ARCH_CPU := x86_64
Anestis Bechtsoudis6a938ed2016-10-12 12:04:34 +0300256 else
257 $(error Unsuported / Unknown APP_API '$(ANDROID_APP_ABI)')
258 endif
Anestis Bechtsoudisd1fccd52016-05-06 13:11:27 +0300259endif
260
Kamil Rytarowski45a1cf42018-08-15 06:26:26 +0200261SUBDIR_ROOTS := linux mac netbsd posix libhfuzz libhfcommon libhfnetdriver
Anestis Bechtsoudis057c99f2015-09-24 14:39:57 +0300262DIRS := . $(shell find $(SUBDIR_ROOTS) -type d)
263CLEAN_PATTERNS := *.o *~ core *.a *.dSYM *.la *.so *.dylib
264SUBDIR_GARBAGE := $(foreach DIR,$(DIRS),$(addprefix $(DIR)/,$(CLEAN_PATTERNS)))
265MAC_GARGBAGE := $(wildcard mac/mach_exc*)
266ANDROID_GARBAGE := obj libs
267
Anestis Bechtsoudis2b60dcd2017-06-06 10:48:06 +0400268CLEAN_TARGETS := core Makefile.bak \
Robert Swieckic87e1c52018-01-07 01:28:30 +0100269 $(OBJS) $(BIN) $(HFUZZ_CC_BIN) \
Robert Swiecki90892fb2018-01-04 16:00:54 +0100270 $(LHFUZZ_ARCH) $(LHFUZZ_OBJS) \
271 $(LCOMMON_ARCH) $(LCOMMON_OBJS) \
272 $(LNETDRIVER_ARCH) $(LNETDRIVER_OBJS) \
Anestis Bechtsoudis2b60dcd2017-06-06 10:48:06 +0400273 $(MAC_GARGBAGE) $(ANDROID_GARBAGE) $(SUBDIR_GARBAGE)
274
Robert Swieckic87e1c52018-01-07 01:28:30 +0100275all: $(BIN) $(HFUZZ_CC_BIN) $(LHFUZZ_ARCH) $(LCOMMON_ARCH) $(LNETDRIVER_ARCH)
robert.swiecki@gmail.comf7610522015-02-16 10:52:02 +0000276
robert.swiecki661d83a2015-03-12 14:27:51 +0000277%.o: %.c
Robert Swieckie0c31372018-01-13 04:36:00 +0100278 $(CC) -c $(CFLAGS) $(CFLAGS_BLOCKS) -o $@ $<
robert.swiecki@gmail.comf7610522015-02-16 10:52:02 +0000279
robert.swiecki661d83a2015-03-12 14:27:51 +0000280%.so: %.c
281 $(CC) -fPIC -shared $(CFLAGS) -o $@ $<
282
Anestis Bechtsoudis057c99f2015-09-24 14:39:57 +0300283%.dylib: %.c
284 $(CC) -fPIC -shared $(CFLAGS) -o $@ $<
robert.swiecki@gmail.comc5f5be62015-02-15 17:17:21 +0000285
Robert Swieckiec03fc52017-05-25 00:41:23 +0200286$(BIN): $(OBJS) $(LCOMMON_ARCH)
Anestis Bechtsoudis057c99f2015-09-24 14:39:57 +0300287 $(LD) -o $(BIN) $(OBJS) $(LDFLAGS)
groebert@google.com1bd4c212013-06-19 11:13:56 +0000288
Robert Swieckic87e1c52018-01-07 01:28:30 +0100289$(HFUZZ_CC_BIN): $(LCOMMON_ARCH) $(LHFUZZ_ARCH) $(LNETDRIVER_ARCH) $(HFUZZ_CC_SRCS)
Robert Swieckie0c31372018-01-13 04:36:00 +0100290 $(LD) -o $@ $(HFUZZ_CC_SRCS) $(LDFLAGS) $(CFLAGS) $(CFLAGS_BLOCKS) -D_HFUZZ_INC_PATH=$(HFUZZ_INC)
Robert Swiecki3fbf9242017-05-08 03:11:58 +0200291
Robert Swiecki90892fb2018-01-04 16:00:54 +0100292$(LCOMMON_OBJS): $(LCOMMON_SRCS)
Robert Swieckie0c31372018-01-13 04:36:00 +0100293 $(CC) -c $(CFLAGS) $(LIBS_CFLAGS) -o $@ $(@:.o=.c)
Robert Swiecki90892fb2018-01-04 16:00:54 +0100294
295$(LCOMMON_ARCH): $(LCOMMON_OBJS)
296 $(AR) rcs $(LCOMMON_ARCH) $(LCOMMON_OBJS)
297
Robert Swieckiec03fc52017-05-25 00:41:23 +0200298$(LHFUZZ_OBJS): $(LHFUZZ_SRCS)
Robert Swieckie0c31372018-01-13 04:36:00 +0100299 $(CC) -c $(CFLAGS) $(LIBS_CFLAGS) -o $@ $(@:.o=.c)
Jaggerc0dce052016-09-11 15:46:39 +0200300
Robert Swiecki787aaab2018-01-20 02:28:13 +0100301$(LHFUZZ_ARCH): $(LHFUZZ_OBJS) $(LCOMMON_OBJS)
Robert Swieckiec03fc52017-05-25 00:41:23 +0200302 $(AR) rcs $(LHFUZZ_ARCH) $(LHFUZZ_OBJS) $(LCOMMON_OBJS)
Jagger9a135bb2016-08-21 21:37:06 +0200303
Robert Swiecki90892fb2018-01-04 16:00:54 +0100304$(LNETDRIVER_OBJS): $(LNETDRIVER_SRCS)
Robert Swieckie0c31372018-01-13 04:36:00 +0100305 $(CC) -c $(CFLAGS) $(LIBS_CFLAGS) -o $@ $(@:.o=.c)
Robert Swiecki79e30532017-05-24 03:25:11 +0200306
Robert Swiecki787aaab2018-01-20 02:28:13 +0100307$(LNETDRIVER_ARCH): $(LNETDRIVER_OBJS) $(LCOMMON_OBJS)
Robert Swiecki90892fb2018-01-04 16:00:54 +0100308 $(AR) rcs $(LNETDRIVER_ARCH) $(LNETDRIVER_OBJS) $(LCOMMON_OBJS)
Robert Swiecki241a7412017-05-24 01:53:15 +0200309
Robert Swiecki1cd09ae2016-02-10 15:56:48 +0100310.PHONY: clean
robert.swiecki3bb518c2010-10-14 00:48:24 +0000311clean:
Anestis Bechtsoudis2b60dcd2017-06-06 10:48:06 +0400312 $(RM) -r $(CLEAN_TARGETS)
robert.swiecki3bb518c2010-10-14 00:48:24 +0000313
Robert Swiecki1cd09ae2016-02-10 15:56:48 +0100314.PHONY: indent
robert.swiecki3bb518c2010-10-14 00:48:24 +0000315indent:
Robert Swiecki98e23372019-01-30 11:50:18 +0100316 clang-format -style="{BasedOnStyle: Google, IndentWidth: 4, ColumnLimit: 100, AlignAfterOpenBracket: DontAlign, AllowShortFunctionsOnASingleLine: false, AlwaysBreakBeforeMultilineStrings: false}" -i -sort-includes *.c *.h */*.c */*.h
robert.swiecki@gmail.comcc050fd2015-02-02 20:00:42 +0000317
Anestis Bechtsoudis057c99f2015-09-24 14:39:57 +0300318.PHONY: depend
Robert Swiecki21733832018-02-17 17:55:54 +0100319depend: all
Jagger59c0d0e2016-09-11 15:56:47 +0200320 makedepend -Y. -Y* -- *.c */*.c
Anestis Bechtsoudis057c99f2015-09-24 14:39:57 +0300321
322.PHONY: android
Anestis Bechtsoudisc1f6faa2015-07-31 05:32:19 +0300323android:
Robert Swiecki1abedcd2017-06-08 00:21:18 +0200324 $(info ***************************************************************)
Anestis Bechtsoudis364b1822017-06-15 13:59:39 +0400325 $(info * Use Android NDK 15 or newer *)
Robert Swiecki1abedcd2017-06-08 00:21:18 +0200326 $(info ***************************************************************)
Anestis Bechtsoudisb4446a82016-10-28 11:30:10 +0300327 @ANDROID_API=$(ANDROID_API) third_party/android/scripts/compile-libunwind.sh \
328 third_party/android/libunwind $(ANDROID_ARCH_CPU)
329
330 @ANDROID_API=$(ANDROID_API) third_party/android/scripts/compile-capstone.sh \
331 third_party/android/capstone $(ANDROID_ARCH_CPU)
332
333 ifeq ($(ANDROID_CLANG),true)
334 @ANDROID_API=$(ANDROID_API) third_party/android/scripts/compile-libBlocksRuntime.sh \
335 third_party/android/libBlocksRuntime $(ANDROID_ARCH_CPU)
336 endif
337
Anestis Bechtsoudis3b5bd872015-09-13 10:58:30 +0300338 ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./android/Android.mk \
Anestis Bechtsoudisf5ded932016-10-18 10:50:00 +0300339 APP_PLATFORM=$(ANDROID_API) APP_ABI=$(ANDROID_APP_ABI) \
Anestis Bechtsoudisa187dcf2017-12-04 10:44:02 +0200340 NDK_TOOLCHAIN=$(ANDROID_NDK_TOOLCHAIN) NDK_TOOLCHAIN_VERSION=$(ANDROID_NDK_TOOLCHAIN_VER) \
341 $(NDK_BUILD_ARGS) APP_MODULES='honggfuzz hfuzz'
Anestis Bechtsoudisf5ded932016-10-18 10:50:00 +0300342
343# Loop all ABIs and pass-through flags since visibility is lost due to sub-process
344.PHONY: android-all
345android-all:
346 @echo "Cleaning workspace:"
347 $(MAKE) clean
348 @echo ""
349
350 @for abi in armeabi armeabi-v7a arm64-v8a x86 x86_64; do \
351 ANDROID_APP_ABI=$$abi ANDROID_SKIP_CLEAN=true ANDROID_CLANG=$(ANDROID_CLANG) \
352 ANDROID_API=$(ANDROID_API) ANDROID_DEBUG_ENABLED=$(ANDROID_DEBUG_ENABLED) \
353 $(MAKE) android || { \
354 echo "Recursive make failed"; exit 1; }; \
355 echo ""; \
356 done
Anestis Bechtsoudisb42f3e02015-08-17 08:57:42 +0300357
Anestis Bechtsoudis6257b612016-10-28 11:30:43 +0300358.PHONY: android-clean-deps
359android-clean-deps:
360 @for cpu in arm arm64 x86 x86_64; do \
361 make -C "third_party/android/capstone" clean; \
362 rm -rf "third_party/android/capstone/$$cpu"; \
363 make -C "third_party/android/libunwind" clean; \
364 rm -rf "third_party/android/libunwind/$$cpu"; \
365 ndk-build -C "third_party/android/libBlocksRuntime" \
366 NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=Android.mk clean; \
367 rm -rf "third_party/android/libBlocksRuntime/$$cpu"; \
368 done
369
Robert Swieckie26e5792018-07-13 14:01:07 +0200370PREFIX ?= /usr/local
371BIN_PATH =$(PREFIX)/bin
372
373install: all
374 mkdir -p -m 755 $${DESTDIR}$(BIN_PATH)
375 install -m 755 honggfuzz $${DESTDIR}$(BIN_PATH)
376 install -m 755 hfuzz_cc/hfuzz-cc $${DESTDIR}$(BIN_PATH)
377 install -m 755 hfuzz_cc/hfuzz-clang $${DESTDIR}$(BIN_PATH)
378 install -m 755 hfuzz_cc/hfuzz-clang++ $${DESTDIR}$(BIN_PATH)
379 install -m 755 hfuzz_cc/hfuzz-gcc $${DESTDIR}$(BIN_PATH)
380 install -m 755 hfuzz_cc/hfuzz-g++ $${DESTDIR}$(BIN_PATH)
381
robert.swiecki3bb518c2010-10-14 00:48:24 +0000382# DO NOT DELETE
Robert Swiecki56276192018-01-21 15:43:02 +0100383
Robert Swiecki246af3e2018-01-05 14:56:32 +0100384cmdline.o: cmdline.h honggfuzz.h libhfcommon/util.h libhfcommon/common.h
Robert Swiecki8a1fc672018-01-25 23:22:47 +0100385cmdline.o: display.h libhfcommon/files.h libhfcommon/common.h
386cmdline.o: libhfcommon/log.h
Robert Swiecki246af3e2018-01-05 14:56:32 +0100387display.o: display.h honggfuzz.h libhfcommon/util.h libhfcommon/common.h
388display.o: libhfcommon/log.h
389fuzz.o: fuzz.h honggfuzz.h libhfcommon/util.h arch.h input.h
390fuzz.o: libhfcommon/common.h libhfcommon/files.h libhfcommon/common.h
Robert Swiecki8267c772018-08-23 23:21:40 +0200391fuzz.o: libhfcommon/log.h mangle.h report.h sanitizers.h socketfuzzer.h
392fuzz.o: subproc.h
Robert Swiecki246af3e2018-01-05 14:56:32 +0100393honggfuzz.o: cmdline.h honggfuzz.h libhfcommon/util.h libhfcommon/common.h
394honggfuzz.o: display.h fuzz.h input.h libhfcommon/files.h
Robert Swiecki64d52432019-02-14 23:02:13 +0100395honggfuzz.o: libhfcommon/common.h libhfcommon/log.h socketfuzzer.h subproc.h
Robert Swiecki246af3e2018-01-05 14:56:32 +0100396input.o: input.h honggfuzz.h libhfcommon/util.h libhfcommon/common.h
Robert Swiecki0f2c30a2018-01-13 14:03:39 +0100397input.o: libhfcommon/files.h libhfcommon/common.h mangle.h subproc.h
398input.o: libhfcommon/log.h
Robert Swiecki3ab16642018-01-12 18:08:37 +0100399mangle.o: mangle.h honggfuzz.h libhfcommon/util.h input.h
Robert Swiecki0f2c30a2018-01-13 14:03:39 +0100400mangle.o: libhfcommon/common.h libhfcommon/log.h
Robert Swiecki246af3e2018-01-05 14:56:32 +0100401report.o: report.h honggfuzz.h libhfcommon/util.h libhfcommon/common.h
402report.o: libhfcommon/log.h
Robert Swiecki15801e82018-11-20 15:59:25 +0100403sanitizers.o: sanitizers.h honggfuzz.h libhfcommon/util.h cmdline.h
Robert Swiecki246af3e2018-01-05 14:56:32 +0100404sanitizers.o: libhfcommon/common.h libhfcommon/files.h libhfcommon/common.h
405sanitizers.o: libhfcommon/log.h
Robert Swieckic6e51b12019-05-22 16:02:57 +0200406socketfuzzer.o: socketfuzzer.h honggfuzz.h libhfcommon/util.h
407socketfuzzer.o: libhfcommon/common.h libhfcommon/files.h libhfcommon/common.h
408socketfuzzer.o: libhfcommon/log.h libhfcommon/ns.h
Robert Swiecki246af3e2018-01-05 14:56:32 +0100409subproc.o: subproc.h honggfuzz.h libhfcommon/util.h arch.h fuzz.h
410subproc.o: libhfcommon/common.h libhfcommon/files.h libhfcommon/common.h
411subproc.o: libhfcommon/log.h
412hfuzz_cc/hfuzz-cc.o: honggfuzz.h libhfcommon/util.h libhfcommon/common.h
413hfuzz_cc/hfuzz-cc.o: libhfcommon/files.h libhfcommon/common.h
414hfuzz_cc/hfuzz-cc.o: libhfcommon/log.h
415libhfcommon/files.o: libhfcommon/files.h libhfcommon/common.h
416libhfcommon/files.o: libhfcommon/common.h libhfcommon/log.h
417libhfcommon/files.o: libhfcommon/util.h
418libhfcommon/log.o: libhfcommon/log.h libhfcommon/common.h libhfcommon/util.h
419libhfcommon/ns.o: libhfcommon/ns.h libhfcommon/common.h libhfcommon/files.h
420libhfcommon/ns.o: libhfcommon/common.h libhfcommon/log.h
421libhfcommon/util.o: libhfcommon/util.h libhfcommon/common.h
422libhfcommon/util.o: libhfcommon/files.h libhfcommon/common.h
423libhfcommon/util.o: libhfcommon/log.h
Robert Swiecki5cc1f7b2018-01-16 20:55:43 +0100424libhfnetdriver/netdriver.o: libhfnetdriver/netdriver.h honggfuzz.h
425libhfnetdriver/netdriver.o: libhfcommon/util.h libhfcommon/common.h
Robert Swieckic44a6ef2018-01-10 23:24:46 +0100426libhfnetdriver/netdriver.o: libhfcommon/files.h libhfcommon/common.h
Robert Swieckia1c8ef72018-01-08 16:43:48 +0100427libhfnetdriver/netdriver.o: libhfcommon/log.h libhfcommon/ns.h
Robert Swiecki52040892019-02-07 23:02:32 +0100428libhfuzz/fetch.o: libhfuzz/fetch.h honggfuzz.h libhfcommon/util.h
429libhfuzz/fetch.o: libhfcommon/common.h libhfcommon/files.h
430libhfuzz/fetch.o: libhfcommon/common.h libhfcommon/log.h
Robert Swiecki246af3e2018-01-05 14:56:32 +0100431libhfuzz/instrument.o: libhfuzz/instrument.h honggfuzz.h libhfcommon/util.h
432libhfuzz/instrument.o: libhfcommon/common.h libhfcommon/log.h
Robert Swiecki28c7d9e2018-02-07 15:26:24 +0100433libhfuzz/linux.o: libhfcommon/common.h libhfcommon/files.h
434libhfuzz/linux.o: libhfcommon/common.h libhfcommon/log.h libhfcommon/ns.h
435libhfuzz/linux.o: libhfuzz/libhfuzz.h
Robert Swiecki89d444a2018-01-11 23:45:19 +0100436libhfuzz/memorycmp.o: libhfcommon/common.h libhfuzz/instrument.h
Robert Swieckic6e51b12019-05-22 16:02:57 +0200437libhfuzz/persistent.o: honggfuzz.h libhfcommon/util.h libhfcommon/common.h
438libhfuzz/persistent.o: libhfcommon/files.h libhfcommon/common.h
439libhfuzz/persistent.o: libhfcommon/log.h libhfuzz/fetch.h
440libhfuzz/persistent.o: libhfuzz/instrument.h libhfuzz/libhfuzz.h
Robert Swiecki246af3e2018-01-05 14:56:32 +0100441linux/arch.o: arch.h honggfuzz.h libhfcommon/util.h fuzz.h
442linux/arch.o: libhfcommon/common.h libhfcommon/files.h libhfcommon/common.h
443linux/arch.o: libhfcommon/log.h libhfcommon/ns.h linux/perf.h linux/trace.h
Robert Swiecki8267c772018-08-23 23:21:40 +0200444linux/arch.o: sanitizers.h subproc.h
Robert Swiecki246af3e2018-01-05 14:56:32 +0100445linux/bfd.o: linux/bfd.h linux/unwind.h honggfuzz.h libhfcommon/util.h
446linux/bfd.o: libhfcommon/common.h libhfcommon/files.h libhfcommon/common.h
447linux/bfd.o: libhfcommon/log.h
448linux/perf.o: linux/perf.h honggfuzz.h libhfcommon/util.h
449linux/perf.o: libhfcommon/common.h libhfcommon/files.h libhfcommon/common.h
450linux/perf.o: libhfcommon/log.h linux/pt.h
Robert Swieckic6e51b12019-05-22 16:02:57 +0200451linux/pt.o: linux/pt.h honggfuzz.h libhfcommon/util.h libhfcommon/common.h
452linux/pt.o: libhfcommon/log.h
Robert Swiecki246af3e2018-01-05 14:56:32 +0100453linux/trace.o: linux/trace.h honggfuzz.h libhfcommon/util.h
454linux/trace.o: libhfcommon/common.h libhfcommon/files.h libhfcommon/common.h
Robert Swiecki8267c772018-08-23 23:21:40 +0200455linux/trace.o: libhfcommon/log.h linux/bfd.h linux/unwind.h sanitizers.h
456linux/trace.o: socketfuzzer.h subproc.h
Robert Swiecki246af3e2018-01-05 14:56:32 +0100457linux/unwind.o: linux/unwind.h honggfuzz.h libhfcommon/util.h
458linux/unwind.o: libhfcommon/common.h libhfcommon/log.h
Robert Swieckidf02b9d2018-02-21 21:20:13 +0100459mac/arch.o: arch.h honggfuzz.h libhfcommon/util.h fuzz.h libhfcommon/common.h
Robert Swiecki246af3e2018-01-05 14:56:32 +0100460mac/arch.o: libhfcommon/files.h libhfcommon/common.h libhfcommon/log.h
Robert Swiecki8267c772018-08-23 23:21:40 +0200461mac/arch.o: subproc.h
Kamil Rytarowski45a1cf42018-08-15 06:26:26 +0200462netbsd/arch.o: arch.h honggfuzz.h libhfcommon/util.h fuzz.h
463netbsd/arch.o: libhfcommon/common.h libhfcommon/files.h libhfcommon/common.h
Robert Swiecki12738cd2019-01-30 16:35:53 +0100464netbsd/arch.o: libhfcommon/log.h libhfcommon/ns.h netbsd/trace.h subproc.h
Kamil Rytarowski45a1cf42018-08-15 06:26:26 +0200465netbsd/trace.o: netbsd/trace.h honggfuzz.h libhfcommon/util.h
466netbsd/trace.o: libhfcommon/common.h libhfcommon/files.h libhfcommon/common.h
Robert Swiecki12738cd2019-01-30 16:35:53 +0100467netbsd/trace.o: libhfcommon/log.h netbsd/unwind.h socketfuzzer.h subproc.h
Kamil Rytarowskibde3da82018-08-20 11:29:45 +0200468netbsd/unwind.o: netbsd/unwind.h honggfuzz.h libhfcommon/util.h
Kamil Rytarowski45a1cf42018-08-15 06:26:26 +0200469netbsd/unwind.o: libhfcommon/common.h libhfcommon/log.h
Robert Swiecki246af3e2018-01-05 14:56:32 +0100470posix/arch.o: arch.h honggfuzz.h libhfcommon/util.h fuzz.h
471posix/arch.o: libhfcommon/common.h libhfcommon/files.h libhfcommon/common.h
Robert Swiecki8267c772018-08-23 23:21:40 +0200472posix/arch.o: libhfcommon/log.h subproc.h