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