1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
|
CFLAGS += -std=c99 -Wall -O3
ALL_CFLAGS = -D_XOPEN_SOURCE=600 -fPIC -DFIU_ENABLE=1 \
-D_LARGEFILE64_SOURCE=1 -I. -I../../libfiu/ \
$(CFLAGS) $(CPPFLAGS) $(LDFLAGS)
ifdef DEBUG
ALL_CFLAGS += -g
endif
ifdef PROFILE
ALL_CFLAGS += -g -pg -fprofile-arcs -ftest-coverage
endif
ifdef POSIX_TRACE
ALL_CFLAGS += -DFIU_POSIX_TRACE=1
endif
# prefix for installing the binaries
PREFIX=/usr/local
# install utility, we assume it's GNU/BSD compatible
INSTALL=install
MODS = $(sort $(wildcard modules/*.mod))
GEN_C = $(addsuffix .c,$(MODS))
GEN_OBJS = $(addsuffix .o,$(MODS))
GEN_FL = $(addsuffix .fl,$(MODS))
CUSTOM_OBJS = $(patsubst %.c,%.o,$(sort $(wildcard modules/*.custom.c)))
OBJS = codegen.o $(GEN_OBJS) $(CUSTOM_OBJS)
ifneq ($(V), 1)
NICE_CC = @echo " CC $@"; $(CC)
NICE_GEN = @echo " GEN $@"; ./generate
Q = @
else
NICE_CC = $(CC)
NICE_GEN = ./generate
Q =
endif
default: all
all: fiu_posix_preload.so function_list
BF = $(ALL_CFLAGS) ~ $(PREFIX)
build-flags: .force-build-flags
@if [ x"$(BF)" != x"`cat build-flags 2>/dev/null`" ]; then \
if [ -f build-flags ]; then \
echo "build flags changed, rebuilding"; \
fi; \
echo "$(BF)" > build-flags; \
fi
$(GEN_OBJS): $(GEN_C)
$(OBJS): build-flags codegen.h
%.mod.c: %.mod
$(NICE_GEN) $< $@ $<.fl
.c.o:
$(NICE_CC) $(ALL_CFLAGS) -c $< -o $@
# We define _GNU_SOURCE to get RTLD_NEXT if available; on non-GNU
# platforms it should be harmless.
codegen.o: codegen.c build-flags build-env.h
$(NICE_CC) $(ALL_CFLAGS) -D_GNU_SOURCE -c $< -o $@
# some platforms do not have libdl, we only use it if available
build-needlibdl:
@$(LD) -ldl -o dlcheck.so 2>/dev/null \
&& echo -ldl > $@ || echo > $@
@rm -f dlcheck.so
# libc's soname depends on the platform (most use libc.so.6, but for example
# ia64 and alpha use libc.so.6.1), so find which one to use at build-time.
# Please note that the argument to ldd *must* start with "./", otherwise some
# "ldd"s won't work (for example, the one in FreeBSD 8.1).
# To find out the soname, we build a dummy shared library against the libc,
# and use ldd to extract the version. This shared library must actually use
# something from libc, otherwise a smart compiler/linker (such as one using
# --as-needed) might not link it against libc.
build-libcsoname:
@$(CC) build-libccheck.c -lc -shared -fPIC -o build-libccheck.so
@ldd ./build-libccheck.so | grep libc.so | awk '{ print $$1 }' > $@
@rm build-libccheck.so
@test "`cat $@`" != "" || \
(echo "Error finding soname, please report"; rm $@; exit 1)
build-env.h: build-env.h.in build-libcsoname
@echo " GEN $@"
$(Q) sed "s+@@LIBC_SONAME@@+`cat build-libcsoname`+g" build-env.h.in \
> build-env.h
fiu_posix_preload.so: build-flags build-env.h build-needlibdl \
$(OBJS) ../../libfiu/hash.c
$(NICE_CC) $(ALL_CFLAGS) -shared -fPIC $(OBJS) ../../libfiu/hash.c \
-L../../libfiu/ \
-lfiu `cat build-needlibdl` \
-o fiu_posix_preload.so
# A module's function list gets generated with the .c file.
%.mod.fl: %.mod.c ;
function_list: $(GEN_FL) function_list.in
@echo " function_list"
$(Q) cp function_list.in function_list
$(Q) for i in $(GEN_FL); do cat $$i >> function_list; done
install: fiu_posix_preload.so
$(INSTALL) -d $(PREFIX)/lib
$(INSTALL) -m 0755 fiu_posix_preload.so $(PREFIX)/lib
uninstall:
$(RM) $(PREFIX)/lib/fiu_posix_preload.so
clean:
rm -f $(OBJS) $(GEN_OBJS:.o=.c) $(GEN_FL)
rm -f build-flags build-env.h build-libcsoname build-needlibdl
rm -f function_list fiu_posix_preload.so
rm -f *.bb *.bbg *.da *.gcov *.gcda *.gcno gmon.out
rm -f modules/*.bb modules/*.bbg modules/*.da
rm -f modules/*.gcov modules/*.gcda modules/*.gcno modules/gmon.out
.PHONY: default install uninstall clean .force-build-flags
|