1# SPDX-License-Identifier: GPL-2.0 2# file format version 3FILE_VERSION = 1 4 5LIBLOCKDEP_VERSION=$(shell make --no-print-directory -sC ../../.. kernelversion) 6 7# Makefiles suck: This macro sets a default value of $(2) for the 8# variable named by $(1), unless the variable has been set by 9# environment or command line. This is necessary for CC and AR 10# because make sets default values, so the simpler ?= approach 11# won't work as expected. 12define allow-override 13 $(if $(or $(findstring environment,$(origin $(1))),\ 14 $(findstring command line,$(origin $(1)))),,\ 15 $(eval $(1) = $(2))) 16endef 17 18# Allow setting CC and AR and LD, or setting CROSS_COMPILE as a prefix. 19$(call allow-override,CC,$(CROSS_COMPILE)gcc) 20$(call allow-override,AR,$(CROSS_COMPILE)ar) 21$(call allow-override,LD,$(CROSS_COMPILE)ld) 22 23INSTALL = install 24 25# Use DESTDIR for installing into a different root directory. 26# This is useful for building a package. The program will be 27# installed in this directory as if it was the root directory. 28# Then the build tool can move it later. 29DESTDIR ?= 30DESTDIR_SQ = '$(subst ','\'',$(DESTDIR))' 31 32prefix ?= /usr/local 33libdir_relative = lib 34libdir = $(prefix)/$(libdir_relative) 35bindir_relative = bin 36bindir = $(prefix)/$(bindir_relative) 37 38export DESTDIR DESTDIR_SQ INSTALL 39 40MAKEFLAGS += --no-print-directory 41 42include ../../scripts/Makefile.include 43 44# copy a bit from Linux kbuild 45 46ifeq ("$(origin V)", "command line") 47 VERBOSE = $(V) 48endif 49ifndef VERBOSE 50 VERBOSE = 0 51endif 52 53ifeq ($(srctree),) 54srctree := $(patsubst %/,%,$(dir $(CURDIR))) 55srctree := $(patsubst %/,%,$(dir $(srctree))) 56srctree := $(patsubst %/,%,$(dir $(srctree))) 57#$(info Determined 'srctree' to be $(srctree)) 58endif 59 60# Shell quotes 61libdir_SQ = $(subst ','\'',$(libdir)) 62bindir_SQ = $(subst ','\'',$(bindir)) 63 64LIB_IN := $(OUTPUT)liblockdep-in.o 65 66BIN_FILE = lockdep 67LIB_FILE = $(OUTPUT)liblockdep.a $(OUTPUT)liblockdep.so.$(LIBLOCKDEP_VERSION) 68 69CONFIG_INCLUDES = 70CONFIG_LIBS = 71CONFIG_FLAGS = 72 73OBJ = $@ 74N = 75 76export Q VERBOSE 77 78INCLUDES = -I. -I./uinclude -I./include -I../../include $(CONFIG_INCLUDES) 79 80# Set compile option CFLAGS if not set elsewhere 81CFLAGS ?= -g -DCONFIG_LOCKDEP -DCONFIG_STACKTRACE -DCONFIG_PROVE_LOCKING -DBITS_PER_LONG=__WORDSIZE -DLIBLOCKDEP_VERSION='"$(LIBLOCKDEP_VERSION)"' -rdynamic -O0 -g 82CFLAGS += -fPIC 83CFLAGS += -Wall 84 85override CFLAGS += $(CONFIG_FLAGS) $(INCLUDES) $(PLUGIN_DIR_SQ) 86 87ifeq ($(VERBOSE),1) 88 Q = 89 print_shared_lib_compile = 90 print_install = 91else 92 Q = @ 93 print_shared_lib_compile = echo ' LD '$(OBJ); 94 print_static_lib_build = echo ' LD '$(OBJ); 95 print_install = echo ' INSTALL '$1' to $(DESTDIR_SQ)$2'; 96endif 97 98all: 99 100export srctree OUTPUT CC LD CFLAGS V 101include $(srctree)/tools/build/Makefile.include 102 103do_compile_shared_library = \ 104 ($(print_shared_lib_compile) \ 105 $(CC) $(LDFLAGS) --shared $^ -o $@ -lpthread -ldl -Wl,-soname='$(@F)';$(shell ln -sf $(@F) $(@D)/liblockdep.so)) 106 107do_build_static_lib = \ 108 ($(print_static_lib_build) \ 109 $(RM) $@; $(AR) rcs $@ $^) 110 111CMD_TARGETS = $(LIB_FILE) 112 113TARGETS = $(CMD_TARGETS) 114 115 116all: fixdep all_cmd 117 118all_cmd: $(CMD_TARGETS) 119 120$(LIB_IN): force 121 $(Q)$(MAKE) $(build)=liblockdep 122 123$(OUTPUT)liblockdep.so.$(LIBLOCKDEP_VERSION): $(LIB_IN) 124 $(Q)$(do_compile_shared_library) 125 126$(OUTPUT)liblockdep.a: $(LIB_IN) 127 $(Q)$(do_build_static_lib) 128 129tags: force 130 $(RM) tags 131 find . -name '*.[ch]' | xargs ctags --extra=+f --c-kinds=+px \ 132 --regex-c++='/_PE\(([^,)]*).*/TEP_ERRNO__\1/' 133 134TAGS: force 135 $(RM) TAGS 136 find . -name '*.[ch]' | xargs etags \ 137 --regex='/_PE(\([^,)]*\).*/TEP_ERRNO__\1/' 138 139define do_install 140 $(print_install) \ 141 if [ ! -d '$(DESTDIR_SQ)$2' ]; then \ 142 $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$2'; \ 143 fi; \ 144 $(INSTALL) $1 '$(DESTDIR_SQ)$2' 145endef 146 147install_lib: all_cmd 148 $(Q)$(call do_install,$(LIB_FILE),$(libdir_SQ)) 149 $(Q)$(call do_install,$(BIN_FILE),$(bindir_SQ)) 150 151install: install_lib 152 153clean: 154 $(RM) $(OUTPUT)*.o *~ $(TARGETS) $(OUTPUT)*.a $(OUTPUT)*liblockdep*.so* $(VERSION_FILES) $(OUTPUT).*.d $(OUTPUT).*.cmd 155 $(RM) tags TAGS 156 157PHONY += force 158force: 159 160# Declare the contents of the .PHONY variable as phony. We keep that 161# information in a variable so we can use it in if_changed and friends. 162.PHONY: $(PHONY) 163