| 
									
										
										
										
											2018-11-26 10:35:24 -08:00
										 |  |  | LOCAL_PATH := $(dir $(lastword $(MAKEFILE_LIST))) | 
					
						
							| 
									
										
										
										
											2019-06-17 11:04:38 -07:00
										 |  |  | INSTALL_SH := $(abspath $(LOCAL_PATH)/../scripts/install.sh) | 
					
						
							| 
									
										
										
										
											2018-10-29 15:40:12 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | all: | 
					
						
							|  |  |  | .PHONY: help all clean | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ifneq ($(V),1) | 
					
						
							|  |  |  | _@ :=@ | 
					
						
							|  |  |  | endif | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-30 07:58:09 -07:00
										 |  |  | INC_DIRS ?= | 
					
						
							|  |  |  | SRC_DIR ?= ./src | 
					
						
							| 
									
										
										
										
											2019-01-24 12:15:37 -08:00
										 |  |  | TEST_PREFIX ?= test_ | 
					
						
							| 
									
										
										
										
											2018-10-30 07:58:09 -07:00
										 |  |  | OUT_DIR ?= ./out | 
					
						
							| 
									
										
										
										
											2018-12-02 20:33:24 -08:00
										 |  |  | OS := $(shell uname) | 
					
						
							| 
									
										
										
										
											2018-10-29 15:40:12 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-10 18:13:38 +01:00
										 |  |  | LLVM_DIR = $(LOCAL_PATH)../dependencies/bpf-tools/llvm | 
					
						
							| 
									
										
										
										
											2021-06-01 12:39:30 -07:00
										 |  |  | LLVM_SYSTEM_INC_DIRS := $(LLVM_DIR)/lib/clang/12.0.1/include | 
					
						
							| 
									
										
										
										
											2021-05-25 19:11:02 +02:00
										 |  |  | COMPILER_RT_DIR = $(LOCAL_PATH)../dependencies/bpf-tools/rust/lib/rustlib/bpfel-unknown-unknown/lib | 
					
						
							| 
									
										
										
										
											2021-10-26 15:51:44 -07:00
										 |  |  | STD_INC_DIRS := $(LLVM_DIR)/include | 
					
						
							|  |  |  | STD_LIB_DIRS := $(LLVM_DIR)/lib | 
					
						
							| 
									
										
										
										
											2018-11-01 09:26:06 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | ifdef LLVM_DIR | 
					
						
							|  |  |  | CC := $(LLVM_DIR)/bin/clang | 
					
						
							| 
									
										
										
										
											2018-11-11 09:54:27 -08:00
										 |  |  | CXX := $(LLVM_DIR)/bin/clang++ | 
					
						
							| 
									
										
										
										
											2018-12-04 22:03:32 -08:00
										 |  |  | LLD := $(LLVM_DIR)/bin/ld.lld | 
					
						
							| 
									
										
										
										
											2018-11-01 09:26:06 -07:00
										 |  |  | OBJ_DUMP := $(LLVM_DIR)/bin/llvm-objdump | 
					
						
							| 
									
										
										
										
											2021-05-08 20:39:48 +02:00
										 |  |  | READ_ELF := $(LLVM_DIR)/bin/llvm-readelf | 
					
						
							| 
									
										
										
										
											2018-10-29 15:40:12 -07:00
										 |  |  | endif | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-30 14:33:29 -08:00
										 |  |  | SYSTEM_INC_DIRS := \
 | 
					
						
							|  |  |  |   $(LOCAL_PATH)inc \
 | 
					
						
							| 
									
										
										
										
											2018-12-02 23:03:51 -08:00
										 |  |  |   $(LLVM_SYSTEM_INC_DIRS) \
 | 
					
						
							| 
									
										
										
										
											2018-10-31 06:59:47 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-26 10:35:24 -08:00
										 |  |  | C_FLAGS := \
 | 
					
						
							| 
									
										
										
										
											2018-10-29 19:56:15 -07:00
										 |  |  |   -Werror \
 | 
					
						
							|  |  |  |   -O2 \
 | 
					
						
							|  |  |  |   -fno-builtin \
 | 
					
						
							| 
									
										
										
										
											2018-11-11 09:54:27 -08:00
										 |  |  |   -std=c17 \
 | 
					
						
							| 
									
										
										
										
											2018-11-28 14:41:53 -08:00
										 |  |  |   $(addprefix -isystem,$(SYSTEM_INC_DIRS)) \
 | 
					
						
							| 
									
										
										
										
											2021-10-26 15:51:44 -07:00
										 |  |  |   $(addprefix -I,$(STD_INC_DIRS)) \
 | 
					
						
							|  |  |  |   $(addprefix -I,$(INC_DIRS)) \
 | 
					
						
							| 
									
										
										
										
											2018-11-11 09:54:27 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | CXX_FLAGS := \
 | 
					
						
							| 
									
										
										
										
											2018-11-26 10:35:24 -08:00
										 |  |  |   $(C_FLAGS) \
 | 
					
						
							| 
									
										
										
										
											2018-11-11 09:54:27 -08:00
										 |  |  |   -std=c++17 \
 | 
					
						
							| 
									
										
										
										
											2018-10-29 19:56:15 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-26 10:35:24 -08:00
										 |  |  | BPF_C_FLAGS := \
 | 
					
						
							|  |  |  |   $(C_FLAGS) \
 | 
					
						
							|  |  |  |   -target bpf \
 | 
					
						
							| 
									
										
										
										
											2018-12-05 07:43:26 -08:00
										 |  |  |   -fPIC \
 | 
					
						
							| 
									
										
										
										
											2021-04-13 09:20:18 +02:00
										 |  |  |   -march=bpfel+solana | 
					
						
							| 
									
										
										
										
											2018-11-26 10:35:24 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | BPF_CXX_FLAGS := \
 | 
					
						
							|  |  |  |   $(CXX_FLAGS) \
 | 
					
						
							|  |  |  |   -target bpf \
 | 
					
						
							| 
									
										
										
										
											2018-12-05 07:43:26 -08:00
										 |  |  |   -fPIC \
 | 
					
						
							| 
									
										
										
										
											2018-12-11 12:14:41 -08:00
										 |  |  |   -fomit-frame-pointer \
 | 
					
						
							|  |  |  |   -fno-exceptions \
 | 
					
						
							|  |  |  |   -fno-asynchronous-unwind-tables \
 | 
					
						
							|  |  |  |   -fno-unwind-tables \
 | 
					
						
							| 
									
										
										
										
											2021-04-13 09:20:18 +02:00
										 |  |  |   -march=bpfel+solana | 
					
						
							| 
									
										
										
										
											2018-11-26 10:35:24 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-04 22:03:32 -08:00
										 |  |  | BPF_LLD_FLAGS := \
 | 
					
						
							| 
									
										
										
										
											2018-12-05 07:43:26 -08:00
										 |  |  |   -z notext \
 | 
					
						
							|  |  |  |   -shared \
 | 
					
						
							|  |  |  |   --Bdynamic \
 | 
					
						
							|  |  |  |   $(LOCAL_PATH)bpf.ld \
 | 
					
						
							| 
									
										
										
										
											2019-01-14 20:12:06 -08:00
										 |  |  |   --entry entrypoint \
 | 
					
						
							| 
									
										
										
										
											2021-10-26 15:51:44 -07:00
										 |  |  |   -L $(STD_LIB_DIRS) \
 | 
					
						
							|  |  |  |   -lc \
 | 
					
						
							| 
									
										
										
										
											2018-12-04 22:03:32 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-29 19:56:15 -07:00
										 |  |  | OBJ_DUMP_FLAGS := \
 | 
					
						
							| 
									
										
										
										
											2021-05-08 20:39:48 +02:00
										 |  |  |   --source \
 | 
					
						
							|  |  |  |   --disassemble \
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | READ_ELF_FLAGS := \
 | 
					
						
							|  |  |  |   --all \
 | 
					
						
							| 
									
										
										
										
											2018-10-29 15:40:12 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-17 11:04:38 -07:00
										 |  |  | TESTFRAMEWORK_RPATH := $(abspath $(LOCAL_PATH)../dependencies/criterion/lib) | 
					
						
							| 
									
										
										
										
											2018-11-26 10:35:24 -08:00
										 |  |  | TESTFRAMEWORK_FLAGS := \
 | 
					
						
							| 
									
										
										
										
											2018-11-26 12:58:14 -08:00
										 |  |  |   -DSOL_TEST \
 | 
					
						
							| 
									
										
										
										
											2019-06-17 11:04:38 -07:00
										 |  |  |   -isystem $(LOCAL_PATH)../dependencies/criterion/include \
 | 
					
						
							|  |  |  |   -L $(LOCAL_PATH)../dependencies/criterion/lib \
 | 
					
						
							| 
									
										
										
										
											2018-11-26 21:00:08 -08:00
										 |  |  |   -rpath $(TESTFRAMEWORK_RPATH) \
 | 
					
						
							| 
									
										
										
										
											2018-11-26 10:35:24 -08:00
										 |  |  |   -lcriterion \
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-26 21:00:08 -08:00
										 |  |  | MACOS_ADJUST_TEST_DYLIB := \
 | 
					
						
							|  |  |  | $(if $(filter $(OS),Darwin),\ | 
					
						
							|  |  |  |  $(_@)install_name_tool -change libcriterion.3.dylib $(TESTFRAMEWORK_RPATH)/libcriterion.3.dylib, \
 | 
					
						
							|  |  |  |  : \
 | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-26 10:35:24 -08:00
										 |  |  | TEST_C_FLAGS := \
 | 
					
						
							|  |  |  |   $(C_FLAGS) \
 | 
					
						
							|  |  |  |   $(TESTFRAMEWORK_FLAGS) \
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TEST_CXX_FLAGS := \
 | 
					
						
							|  |  |  |   $(CXX_FLAGS) \
 | 
					
						
							|  |  |  |   $(TESTFRAMEWORK_FLAGS) \
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-29 15:40:12 -07:00
										 |  |  | help: | 
					
						
							| 
									
										
										
										
											2018-11-28 14:41:53 -08:00
										 |  |  | 	@echo '' | 
					
						
							| 
									
										
										
										
											2018-10-29 15:40:12 -07:00
										 |  |  | 	@echo 'BPF Program makefile' | 
					
						
							|  |  |  | 	@echo '' | 
					
						
							| 
									
										
										
										
											2018-11-11 09:54:27 -08:00
										 |  |  | 	@echo 'This makefile will build BPF Programs from C or C++ source files into ELFs' | 
					
						
							| 
									
										
										
										
											2018-10-29 15:40:12 -07:00
										 |  |  | 	@echo '' | 
					
						
							|  |  |  | 	@echo 'Assumptions:' | 
					
						
							| 
									
										
										
										
											2019-01-24 12:15:37 -08:00
										 |  |  | 	@echo '  - Programs are located in the source directory: $(SRC_DIR)/<program name>' | 
					
						
							|  |  |  | 	@echo '  - Programs are named by their directory name (eg. directory name:src/foo/ -> program name:foo)' | 
					
						
							|  |  |  | 	@echo '  - Tests are located in their corresponding program directory and must being with "test_"' | 
					
						
							| 
									
										
										
										
											2018-10-29 15:40:12 -07:00
										 |  |  | 	@echo '  - Output files will be placed in the directory: $(OUT_DIR)' | 
					
						
							|  |  |  | 	@echo '' | 
					
						
							|  |  |  | 	@echo 'User settings' | 
					
						
							| 
									
										
										
										
											2018-10-30 22:52:59 -07:00
										 |  |  | 	@echo '  - The following setting are overridable on the command line, default values shown:' | 
					
						
							| 
									
										
										
										
											2018-11-28 14:41:53 -08:00
										 |  |  | 	@echo '    - Show commands while building: V=1' | 
					
						
							|  |  |  | 	@echo '      V=$(V)' | 
					
						
							| 
									
										
										
										
											2018-11-01 09:26:06 -07:00
										 |  |  | 	@echo '    - List of include directories:' | 
					
						
							| 
									
										
										
										
											2018-10-29 15:40:12 -07:00
										 |  |  | 	@echo '      INC_DIRS=$(INC_DIRS)' | 
					
						
							| 
									
										
										
										
											2018-11-01 09:26:06 -07:00
										 |  |  | 	@echo '    - List of system include directories:' | 
					
						
							| 
									
										
										
										
											2018-10-31 00:02:09 -07:00
										 |  |  | 	@echo '      SYSTEM_INC_DIRS=$(SYSTEM_INC_DIRS)' | 
					
						
							| 
									
										
										
										
											2021-10-26 15:51:44 -07:00
										 |  |  | 	@echo '    - List of standard library include directories:' | 
					
						
							|  |  |  | 	@echo '      STD_INC_DIRS=$(STD_INC_DIRS)' | 
					
						
							|  |  |  | 	@echo '    - List of standard library archive directories:' | 
					
						
							|  |  |  | 	@echo '      STD_LIB_DIRS=$(STD_LIB_DIRS)' | 
					
						
							| 
									
										
										
										
											2019-01-24 12:15:37 -08:00
										 |  |  | 	@echo '    - Location of source directories:' | 
					
						
							| 
									
										
										
										
											2018-10-29 15:40:12 -07:00
										 |  |  | 	@echo '      SRC_DIR=$(SRC_DIR)' | 
					
						
							|  |  |  | 	@echo '    - Location to place output files:' | 
					
						
							|  |  |  | 	@echo '      OUT_DIR=$(OUT_DIR)' | 
					
						
							|  |  |  | 	@echo '    - Location of LLVM:' | 
					
						
							|  |  |  | 	@echo '      LLVM_DIR=$(LLVM_DIR)' | 
					
						
							|  |  |  | 	@echo '' | 
					
						
							|  |  |  | 	@echo 'Usage:' | 
					
						
							|  |  |  | 	@echo '  - make help - This help message' | 
					
						
							| 
									
										
										
										
											2019-01-24 12:15:37 -08:00
										 |  |  | 	@echo '  - make all - Build all the programs and tests, run the tests' | 
					
						
							|  |  |  | 	@echo '  - make programs - Build all the programs' | 
					
						
							|  |  |  | 	@echo '  - make tests - Build and run all tests' | 
					
						
							| 
									
										
										
										
											2021-05-08 20:39:48 +02:00
										 |  |  | 	@echo '  - make dump_<program name> - Dump the contents of the program to stdout' | 
					
						
							|  |  |  | 	@echo '  - make readelf_<program name> - Display information about the ELF binary' | 
					
						
							| 
									
										
										
										
											2018-10-29 15:40:12 -07:00
										 |  |  | 	@echo '  - make <program name> - Build a single program by name' | 
					
						
							| 
									
										
										
										
											2019-01-24 12:15:37 -08:00
										 |  |  | 	@echo '  - make <test name> - Build and run a single test by name' | 
					
						
							| 
									
										
										
										
											2018-10-29 15:40:12 -07:00
										 |  |  | 	@echo '' | 
					
						
							|  |  |  | 	@echo 'Available programs:' | 
					
						
							|  |  |  | 	$(foreach name, $(PROGRAM_NAMES), @echo '  - $(name)'$(\n)) | 
					
						
							| 
									
										
										
										
											2019-01-24 12:15:37 -08:00
										 |  |  | 	@echo '' | 
					
						
							| 
									
										
										
										
											2018-11-26 10:35:24 -08:00
										 |  |  | 	@echo 'Available tests:' | 
					
						
							|  |  |  | 	$(foreach name, $(TEST_NAMES), @echo '  - $(name)'$(\n)) | 
					
						
							| 
									
										
										
										
											2018-10-29 15:40:12 -07:00
										 |  |  | 	@echo '' | 
					
						
							|  |  |  | 	@echo 'Example:' | 
					
						
							| 
									
										
										
										
											2021-05-08 20:39:48 +02:00
										 |  |  | 	@echo '  - Assuming a program named foo (src/foo/foo.c)' | 
					
						
							| 
									
										
										
										
											2018-10-29 15:40:12 -07:00
										 |  |  | 	@echo '    - make foo' | 
					
						
							|  |  |  | 	@echo '    - make dump_foo' | 
					
						
							| 
									
										
										
										
											2018-11-28 14:41:53 -08:00
										 |  |  | 	@echo '' | 
					
						
							| 
									
										
										
										
											2018-10-29 15:40:12 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-11 15:33:21 -08:00
										 |  |  | define C_RULE | 
					
						
							|  |  |  | $1: $2 | 
					
						
							|  |  |  | 	@echo "[cc] $1 ($2)" | 
					
						
							|  |  |  | 	$(_@)mkdir -p $(dir $1) | 
					
						
							| 
									
										
										
										
											2021-06-07 18:32:23 -07:00
										 |  |  | 	$(_@)$(CC) $(BPF_C_FLAGS) -o $1 -c $2 | 
					
						
							| 
									
										
										
										
											2019-01-11 15:33:21 -08:00
										 |  |  | endef | 
					
						
							| 
									
										
										
										
											2018-12-11 15:20:40 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-11 15:33:21 -08:00
										 |  |  | define CC_RULE | 
					
						
							| 
									
										
										
										
											2021-03-10 18:13:38 +01:00
										 |  |  | $1: $2 | 
					
						
							| 
									
										
										
										
											2019-01-11 15:33:21 -08:00
										 |  |  | 	@echo "[cxx] $1 ($2)" | 
					
						
							|  |  |  | 	$(_@)mkdir -p $(dir $1) | 
					
						
							| 
									
										
										
										
											2021-06-07 18:32:23 -07:00
										 |  |  | 	$(_@)$(CXX) $(BPF_CXX_FLAGS) -o $1 -c $2 | 
					
						
							|  |  |  | endef | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | define D_RULE | 
					
						
							|  |  |  | $1: $2 $(LOCAL_PATH)/bpf.mk | 
					
						
							|  |  |  | 	@echo "[GEN] $1 ($2)" | 
					
						
							|  |  |  | 	$(_@)mkdir -p $(dir $1) | 
					
						
							|  |  |  | 	$(_@)$(CC) -M -MT '$(basename $1).o' $(BPF_C_FLAGS) $2 | sed 's,\($(basename $1)\)\.o[ :]*,\1.o $1 : ,g' > $1 | 
					
						
							|  |  |  | endef | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | define DXX_RULE | 
					
						
							|  |  |  | $1: $2 $(LOCAL_PATH)/bpf.mk | 
					
						
							|  |  |  | 	@echo "[GEN] $1 ($2)" | 
					
						
							|  |  |  | 	$(_@)mkdir -p $(dir $1) | 
					
						
							|  |  |  | 	$(_@)$(CXX) -M -MT '$(basename $1).o' $(BPF_CXX_FLAGS) $2 | sed 's,\($(basename $1)\)\.o[ :]*,\1.o $1 : ,g' > $1 | 
					
						
							| 
									
										
										
										
											2019-01-11 15:33:21 -08:00
										 |  |  | endef | 
					
						
							| 
									
										
										
										
											2018-10-29 15:40:12 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-11 15:33:21 -08:00
										 |  |  | define O_RULE | 
					
						
							|  |  |  | $1: $2 | 
					
						
							|  |  |  | 	@echo "[llc] $1 ($2)" | 
					
						
							|  |  |  | 	$(_@)mkdir -p $(dir $1) | 
					
						
							|  |  |  | 	$(_@)$(LLC) $(BPF_LLC_FLAGS) -o $1 $2 | 
					
						
							|  |  |  | endef | 
					
						
							| 
									
										
										
										
											2018-11-26 10:35:24 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-11 15:33:21 -08:00
										 |  |  | define SO_RULE | 
					
						
							|  |  |  | $1: $2 | 
					
						
							|  |  |  | 	@echo "[lld] $1 ($2)" | 
					
						
							|  |  |  | 	$(_@)mkdir -p $(dir $1) | 
					
						
							| 
									
										
										
										
											2021-05-25 19:11:02 +02:00
										 |  |  | 	$(_@)$(LLD) $(BPF_LLD_FLAGS) -o $1 $2 $(COMPILER_RT_DIR)/libcompiler_builtins-*.rlib | 
					
						
							| 
									
										
										
										
											2021-02-04 13:56:12 -08:00
										 |  |  | ifeq (,$(wildcard $(subst .so,-keypair.json,$1))) | 
					
						
							|  |  |  | 	$(_@)solana-keygen new --no-passphrase --silent -o $(subst .so,-keypair.json,$1) | 
					
						
							|  |  |  | endif | 
					
						
							|  |  |  | 	@echo To deploy this program: | 
					
						
							| 
									
										
										
										
											2021-05-10 15:38:01 -07:00
										 |  |  | 	@echo $$$$ solana program deploy $(abspath $1) | 
					
						
							| 
									
										
										
										
											2019-01-11 15:33:21 -08:00
										 |  |  | endef | 
					
						
							| 
									
										
										
										
											2018-12-04 22:03:32 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-11 15:33:21 -08:00
										 |  |  | define TEST_C_RULE | 
					
						
							|  |  |  | $1: $2 | 
					
						
							|  |  |  | 	@echo "[test cc] $1 ($2)" | 
					
						
							|  |  |  | 	$(_@)mkdir -p $(dir $1) | 
					
						
							| 
									
										
										
										
											2021-06-07 18:32:23 -07:00
										 |  |  | 	$(_@)$(CC) $(TEST_C_FLAGS) -o $1 $2 | 
					
						
							| 
									
										
										
										
											2019-01-11 15:33:21 -08:00
										 |  |  | 	$(_@)$(MACOS_ADJUST_TEST_DYLIB) $1 | 
					
						
							|  |  |  | endef | 
					
						
							| 
									
										
										
										
											2018-11-26 10:35:24 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-11 15:33:21 -08:00
										 |  |  | define TEST_CC_RULE | 
					
						
							|  |  |  | $1: $2 | 
					
						
							|  |  |  | 	@echo "[test cxx] $1 ($2)" | 
					
						
							|  |  |  | 	$(_@)mkdir -p $(dir $1) | 
					
						
							| 
									
										
										
										
											2021-06-07 18:32:23 -07:00
										 |  |  | 	$(_@)$(CXX) $(TEST_CXX_FLAGS) -o $1 $2 | 
					
						
							| 
									
										
										
										
											2019-01-11 15:33:21 -08:00
										 |  |  | 	$(_@)$(MACOS_ADJUST_TEST_DYLIB) $1 | 
					
						
							|  |  |  | endef | 
					
						
							| 
									
										
										
										
											2018-11-01 09:26:06 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-07 18:32:23 -07:00
										 |  |  | define TEST_D_RULE | 
					
						
							|  |  |  | $1: $2 $(LOCAL_PATH)/bpf.mk | 
					
						
							|  |  |  | 	@echo "[GEN] $1 ($2)" | 
					
						
							|  |  |  | 	$(_@)mkdir -p $(dir $1) | 
					
						
							|  |  |  | 	$(_@)$(CC) -M -MT '$(basename $1)' $(TEST_C_FLAGS) $2 | sed 's,\($(basename $1)\)[ :]*,\1 $1 : ,g' > $1 | 
					
						
							|  |  |  | endef | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | define TEST_DXX_RULE | 
					
						
							|  |  |  | $1: $2 $(LOCAL_PATH)/bpf.mk | 
					
						
							|  |  |  | 	@echo "[GEN] $1 ($2)" | 
					
						
							|  |  |  | 	$(_@)mkdir -p $(dir $1) | 
					
						
							|  |  |  | 	$(_@)$(CXX) -M -MT '$(basename $1)' $(TEST_CXX_FLAGS) $2 | sed 's,\($(basename $1)\)[ :]*,\1 $1 : ,g' > $1 | 
					
						
							|  |  |  | endef | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-24 12:15:37 -08:00
										 |  |  | define TEST_EXEC_RULE | 
					
						
							|  |  |  | $1: $2 | 
					
						
							| 
									
										
										
										
											2021-06-21 21:19:19 -06:00
										 |  |  | 	LD_LIBRARY_PATH=$(TESTFRAMEWORK_RPATH) \
 | 
					
						
							| 
									
										
										
										
											2019-01-24 12:15:37 -08:00
										 |  |  | 	$2$(\n) | 
					
						
							|  |  |  | endef | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-11 15:33:21 -08:00
										 |  |  | .PHONY: $(INSTALL_SH) | 
					
						
							|  |  |  | $(INSTALL_SH): | 
					
						
							|  |  |  | 	$(_@)$(INSTALL_SH) | 
					
						
							| 
									
										
										
										
											2018-10-29 15:40:12 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-11 15:33:21 -08:00
										 |  |  | PROGRAM_NAMES := $(notdir $(basename $(wildcard $(SRC_DIR)/*))) | 
					
						
							| 
									
										
										
										
											2018-10-29 15:40:12 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | define \n | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | endef | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-24 12:15:37 -08:00
										 |  |  | all: programs tests | 
					
						
							| 
									
										
										
										
											2019-01-11 15:33:21 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | $(foreach PROGRAM, $(PROGRAM_NAMES), \ | 
					
						
							|  |  |  |   $(eval -include $(wildcard $(OUT_DIR)/$(PROGRAM)/*.d)) \
 | 
					
						
							|  |  |  |   \
 | 
					
						
							| 
									
										
										
										
											2019-01-24 12:15:37 -08:00
										 |  |  |   $(eval $(PROGRAM): %: $(addprefix $(OUT_DIR)/, %.so)) \
 | 
					
						
							| 
									
										
										
										
											2019-01-11 15:33:21 -08:00
										 |  |  |   $(eval $(PROGRAM)_SRCS := \
 | 
					
						
							|  |  |  |     $(addprefix $(SRC_DIR)/$(PROGRAM)/, \
 | 
					
						
							| 
									
										
										
										
											2019-01-24 12:15:37 -08:00
										 |  |  |     $(filter-out $(TEST_PREFIX)%,$(notdir $(wildcard $(SRC_DIR)/$(PROGRAM)/*.c $(SRC_DIR)/$(PROGRAM)/*.cc))))) \
 | 
					
						
							| 
									
										
										
										
											2019-01-11 15:33:21 -08:00
										 |  |  |   $(eval $(PROGRAM)_OBJS := $(subst $(SRC_DIR), $(OUT_DIR), \
 | 
					
						
							|  |  |  |     $(patsubst %.c,%.o, \
 | 
					
						
							|  |  |  |     $(patsubst %.cc,%.o,$($(PROGRAM)_SRCS))))) \
 | 
					
						
							| 
									
										
										
										
											2019-01-24 12:15:37 -08:00
										 |  |  | 	$(eval $($(PROGRAM)_SRCS): $(INSTALL_SH)) \
 | 
					
						
							| 
									
										
										
										
											2019-01-11 15:33:21 -08:00
										 |  |  |   $(eval $(call SO_RULE,$(OUT_DIR)/$(PROGRAM).so,$($(PROGRAM)_OBJS))) \
 | 
					
						
							|  |  |  |   $(foreach _,$(filter %.c,$($(PROGRAM)_SRCS)), \
 | 
					
						
							| 
									
										
										
										
											2021-06-07 18:32:23 -07:00
										 |  |  |     $(eval $(call D_RULE,$(subst $(SRC_DIR),$(OUT_DIR),$(_:%.c=%.d)),$_)) \
 | 
					
						
							| 
									
										
										
										
											2019-01-11 15:33:21 -08:00
										 |  |  |     $(eval $(call C_RULE,$(subst $(SRC_DIR),$(OUT_DIR),$(_:%.c=%.o)),$_))) \
 | 
					
						
							|  |  |  |   $(foreach _,$(filter %.cc,$($(PROGRAM)_SRCS)), \
 | 
					
						
							| 
									
										
										
										
											2021-06-07 18:32:23 -07:00
										 |  |  |     $(eval $(call DXX_RULE,$(subst $(SRC_DIR),$(OUT_DIR),$(_:%.cc=%.d)),$_)) \
 | 
					
						
							| 
									
										
										
										
											2019-01-11 15:33:21 -08:00
										 |  |  |     $(eval $(call CC_RULE,$(subst $(SRC_DIR),$(OUT_DIR),$(_:%.cc=%.o)),$_))) \
 | 
					
						
							|  |  |  |   \
 | 
					
						
							| 
									
										
										
										
											2019-01-24 12:15:37 -08:00
										 |  |  |   $(eval TESTS := $(notdir $(basename $(wildcard $(SRC_DIR)/$(PROGRAM)/$(TEST_PREFIX)*.c)))) \
 | 
					
						
							|  |  |  |   $(eval $(TESTS) : %: $(addprefix $(OUT_DIR)/$(PROGRAM)/, %)) \
 | 
					
						
							| 
									
										
										
										
											2019-01-11 15:33:21 -08:00
										 |  |  |   $(eval TEST_NAMES := $(TEST_NAMES) $(TESTS)) \
 | 
					
						
							|  |  |  |   $(foreach TEST, $(TESTS), \
 | 
					
						
							|  |  |  |     $(eval $(TEST)_SRCS := \
 | 
					
						
							|  |  |  |       $(addprefix $(SRC_DIR)/$(PROGRAM)/, \
 | 
					
						
							| 
									
										
										
										
											2019-01-24 12:15:37 -08:00
										 |  |  |       $(notdir $(wildcard $(SRC_DIR)/$(PROGRAM)/$(TEST).c $(SRC_DIR)/$(PROGRAM)/$(TEST).cc)))) \
 | 
					
						
							|  |  |  | 		$(eval $($(TEST)_SRCS): $(INSTALL_SH)) \
 | 
					
						
							| 
									
										
										
										
											2019-01-11 15:33:21 -08:00
										 |  |  |     $(foreach _,$(filter %.c,$($(TEST)_SRCS)), \
 | 
					
						
							| 
									
										
										
										
											2021-06-07 18:32:23 -07:00
										 |  |  |       $(eval $(call TEST_D_RULE,$(subst $(SRC_DIR),$(OUT_DIR),$(_:%.c=%.d)),$_)) \
 | 
					
						
							| 
									
										
										
										
											2019-01-11 15:33:21 -08:00
										 |  |  |       $(eval $(call TEST_C_RULE,$(subst $(SRC_DIR),$(OUT_DIR),$(_:%.c=%)),$_))) \
 | 
					
						
							|  |  |  |     $(foreach _,$(filter %.cc, $($(TEST)_SRCS)), \
 | 
					
						
							| 
									
										
										
										
											2021-06-07 18:32:23 -07:00
										 |  |  |       $(eval $(call TEST_DXX_RULE,$(subst $(SRC_DIR),$(OUT_DIR),$(_:%.cc=%.d)),$_)) \
 | 
					
						
							| 
									
										
										
										
											2019-01-11 15:33:21 -08:00
										 |  |  |       $(eval $(call TEST_CC_RULE,$(subst $(SRC_DIR),$(OUT_DIR),$(_:%.cc=%)),$_))) \
 | 
					
						
							| 
									
										
										
										
											2019-01-24 12:15:37 -08:00
										 |  |  |     $(eval $(call TEST_EXEC_RULE,$(TEST),$(addprefix $(OUT_DIR)/$(PROGRAM)/, $(TEST)))) \
 | 
					
						
							| 
									
										
										
										
											2019-01-11 15:33:21 -08:00
										 |  |  |    ) \
 | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-24 12:15:37 -08:00
										 |  |  | .PHONY: $(PROGRAM_NAMES) | 
					
						
							|  |  |  | programs: $(PROGRAM_NAMES) | 
					
						
							| 
									
										
										
										
											2018-11-26 10:35:24 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-11 15:33:21 -08:00
										 |  |  | .PHONY: $(TEST_NAMES) | 
					
						
							| 
									
										
										
										
											2019-01-24 12:15:37 -08:00
										 |  |  | tests: $(TEST_NAMES) | 
					
						
							| 
									
										
										
										
											2018-10-29 15:40:12 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | dump_%: % | 
					
						
							| 
									
										
										
										
											2018-12-04 22:03:32 -08:00
										 |  |  | 	$(_@)$(OBJ_DUMP) $(OBJ_DUMP_FLAGS) $(addprefix $(OUT_DIR)/, $(addsuffix .so, $<)) | 
					
						
							| 
									
										
										
										
											2018-10-29 15:40:12 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-08 20:39:48 +02:00
										 |  |  | readelf_%: % | 
					
						
							|  |  |  | 	$(_@)$(READ_ELF) $(READ_ELF_FLAGS) $(addprefix $(OUT_DIR)/, $(addsuffix .so, $<)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-29 15:40:12 -07:00
										 |  |  | clean: | 
					
						
							|  |  |  | 	rm -rf $(OUT_DIR) |