| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-28 14:41:53 -08:00
										 |  |  | ifeq ($(DOCKER),1) | 
					
						
							| 
									
										
										
										
											2018-12-02 23:15:43 -08:00
										 |  |  | $(warning DOCKER=1 is experimential and may not work as advertised) | 
					
						
							| 
									
										
										
										
											2019-06-17 11:04:38 -07:00
										 |  |  | LLVM_DIR = $(LOCAL_PATH)../dependencies/llvm-docker/ | 
					
						
							| 
									
										
										
										
											2018-12-02 23:03:51 -08:00
										 |  |  | LLVM_SYSTEM_INC_DIRS := /usr/local/lib/clang/8.0.0/include | 
					
						
							| 
									
										
										
										
											2018-11-28 14:41:53 -08:00
										 |  |  | else | 
					
						
							| 
									
										
										
										
											2019-06-17 11:04:38 -07:00
										 |  |  | LLVM_DIR = $(LOCAL_PATH)../dependencies/llvm-native/ | 
					
						
							| 
									
										
										
										
											2018-12-02 23:03:51 -08:00
										 |  |  | LLVM_SYSTEM_INC_DIRS := $(LLVM_DIR)/lib/clang/8.0.0/include | 
					
						
							| 
									
										
										
										
											2018-11-28 14:41:53 -08:00
										 |  |  | endif | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											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)) \
 | 
					
						
							| 
									
										
										
										
											2018-11-26 10:35:24 -08:00
										 |  |  |   $(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 \
 | 
					
						
							| 
									
										
										
										
											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 \
 | 
					
						
							| 
									
										
										
										
											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 \
 | 
					
						
							| 
									
										
										
										
											2018-12-04 22:03:32 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-29 19:56:15 -07:00
										 |  |  | OBJ_DUMP_FLAGS := \
 | 
					
						
							|  |  |  |   -color \
 | 
					
						
							|  |  |  |   -source \
 | 
					
						
							|  |  |  |   -disassemble \
 | 
					
						
							| 
									
										
										
										
											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)' | 
					
						
							| 
									
										
										
										
											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' | 
					
						
							| 
									
										
										
										
											2018-10-29 15:40:12 -07:00
										 |  |  | 	@echo '  - make dump_<program name> - Dumps the contents of the program to stdout' | 
					
						
							|  |  |  | 	@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:' | 
					
						
							| 
									
										
										
										
											2019-01-24 12:15:37 -08:00
										 |  |  | 	@echo '  - Assuming a programed 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) | 
					
						
							| 
									
										
										
										
											2019-01-14 23:41:07 -08:00
										 |  |  | 	$(_@)$(CC) $(BPF_C_FLAGS) -o $1 -c $2 -MD -MF $(1:.o=.d) | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							|  |  |  | $1: $2  | 
					
						
							|  |  |  | 	@echo "[cxx] $1 ($2)" | 
					
						
							|  |  |  | 	$(_@)mkdir -p $(dir $1) | 
					
						
							| 
									
										
										
										
											2019-01-14 23:41:07 -08:00
										 |  |  | 	$(_@)$(CXX) $(BPF_CXX_FLAGS) -o $1 -c $2 -MD -MF $(1:.o=.d) | 
					
						
							| 
									
										
										
										
											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) | 
					
						
							| 
									
										
										
										
											2019-01-14 20:12:06 -08:00
										 |  |  | 	$(_@)$(LLD) $(BPF_LLD_FLAGS) -o $1 $2 | 
					
						
							| 
									
										
										
										
											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) | 
					
						
							|  |  |  | 	$(_@)$(CC) $(TEST_C_FLAGS) -o $1 $2 -MD -MF $(1:.o=.d) | 
					
						
							|  |  |  | 	$(_@)$(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) | 
					
						
							|  |  |  | 	$(_@)$(CXX) $(TEST_CXX_FLAGS) -o $1 $2 -MD -MF $(1:.o=.d) | 
					
						
							|  |  |  | 	$(_@)$(MACOS_ADJUST_TEST_DYLIB) $1 | 
					
						
							|  |  |  | endef | 
					
						
							| 
									
										
										
										
											2018-11-01 09:26:06 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-24 12:15:37 -08:00
										 |  |  | define TEST_EXEC_RULE | 
					
						
							|  |  |  | $1: $2 | 
					
						
							|  |  |  | 	$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)), \
 | 
					
						
							|  |  |  |     $(eval $(call C_RULE,$(subst $(SRC_DIR),$(OUT_DIR),$(_:%.c=%.o)),$_))) \
 | 
					
						
							|  |  |  |   $(foreach _,$(filter %.cc,$($(PROGRAM)_SRCS)), \
 | 
					
						
							|  |  |  |     $(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)), \
 | 
					
						
							|  |  |  |       $(eval $(call TEST_C_RULE,$(subst $(SRC_DIR),$(OUT_DIR),$(_:%.c=%)),$_))) \
 | 
					
						
							|  |  |  |     $(foreach _,$(filter %.cc, $($(TEST)_SRCS)), \
 | 
					
						
							|  |  |  |       $(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
										 |  |  | 
 | 
					
						
							|  |  |  | clean: | 
					
						
							|  |  |  | 	rm -rf $(OUT_DIR) |