1# 2# defines 3# 4topdir=$(shell pwd)/.. 5include ../Make.Rules 6# 7# Library version 8# 9CAPLIBNAME=$(LIBTITLE).so 10STACAPLIBNAME=$(LIBTITLE).a 11# 12PSXTITLE=libpsx 13PSXLIBNAME=$(PSXTITLE).so 14STAPSXLIBNAME=$(PSXTITLE).a 15 16CAPFILES=cap_alloc cap_proc cap_extint cap_flag cap_text cap_file 17CAPMAGICOBJ=cap_magic.o 18PSXFILES=../psx/psx 19PSXMAGICOBJ=psx_magic.o 20 21# Always build libcap sources this way: 22CFLAGS += -fPIC 23 24# The linker magic needed to build a dynamic library as independently 25# executable 26MAGIC=-Wl,-e,__so_start 27 28INCLS=libcap.h cap_names.h $(INCS) 29GPERF_OUTPUT = _caps_output.gperf 30 31CAPOBJS=$(addsuffix .o, $(CAPFILES)) 32MAJCAPLIBNAME=$(CAPLIBNAME).$(VERSION) 33MINCAPLIBNAME=$(MAJCAPLIBNAME).$(MINOR) 34 35PSXOBJS=$(addsuffix .o, $(PSXFILES)) 36MAJPSXLIBNAME=$(PSXLIBNAME).$(VERSION) 37MINPSXLIBNAME=$(MAJPSXLIBNAME).$(MINOR) 38 39all: pcs $(STACAPLIBNAME) 40ifeq ($(SHARED),yes) 41 $(MAKE) $(CAPLIBNAME) 42endif 43ifeq ($(PTHREADS),yes) 44 $(MAKE) $(STAPSXLIBNAME) 45ifeq ($(SHARED),yes) 46 $(MAKE) $(PSXLIBNAME) 47endif 48endif 49 50pcs: $(LIBTITLE).pc 51ifeq ($(PTHREADS),yes) 52 $(MAKE) $(PSXTITLE).pc 53endif 54 55ifeq ($(USE_GPERF),yes) 56USE_GPERF_OUTPUT = $(GPERF_OUTPUT) 57INCLUDE_GPERF_OUTPUT = -DINCLUDE_GPERF_OUTPUT='"$(GPERF_OUTPUT)"' 58endif 59 60$(LIBTITLE).pc: $(LIBTITLE).pc.in 61 $(BUILD_SED) -e 's,@prefix@,$(prefix),' \ 62 -e 's,@exec_prefix@,$(exec_prefix),' \ 63 -e 's,@libdir@,$(LIBDIR),' \ 64 -e 's,@includedir@,$(inc_prefix)/include,' \ 65 -e 's,@VERSION@,$(VERSION).$(MINOR),' \ 66 -e 's,@deps@,$(DEPS),' \ 67 $< >$@ 68 69$(PSXTITLE).pc: $(PSXTITLE).pc.in 70 $(BUILD_SED) -e 's,@prefix@,$(prefix),' \ 71 -e 's,@exec_prefix@,$(exec_prefix),' \ 72 -e 's,@libdir@,$(LIBDIR),' \ 73 -e 's,@includedir@,$(inc_prefix)/include,' \ 74 -e 's,@VERSION@,$(VERSION).$(MINOR),' \ 75 -e 's,@deps@,$(DEPS),' \ 76 $< >$@ 77 78_makenames: _makenames.c cap_names.list.h 79 $(BUILD_CC) $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $< -o $@ 80 81cap_names.h: _makenames 82 ./_makenames > cap_names.h 83 84$(GPERF_OUTPUT): cap_names.list.h cap_names.header Makefile 85 (cat cap_names.header ; $(BUILD_SED) -e 's/[\{\}"]//g' -e 's/,$$//' cap_names.list.h) | gperf --ignore-case --language=ANSI-C --readonly --null-strings --global-table --hash-function-name=__cap_hash_name --lookup-function-name="__cap_lookup_name" -c -t -m20 $(INDENT) > $@ 86 $(BUILD_SED) -e 's/unsigned int len/size_t len/' -i $@ 87 88# Intention is that libcap keeps up with torvalds' tree, as reflected 89# by this maintained version of the kernel header. libcap dynamically 90# trims the meaning of "all" capabilities down to that of the running 91# kernel as of 2.30. That is, all production kernels should be equal 92# to or behind libcap. 93# 94# Note "./libcap.so --summary" should explain how the built libcap.so 95# compares to the running kernel. 96UAPI_HEADER := $(topdir)/libcap/include/uapi/linux/capability.h 97cap_names.list.h: Makefile $(UAPI_HEADER) 98 @echo "=> making $@ from $(UAPI_HEADER)" 99 $(BUILD_EGREP) '^#define\s+CAP_([^\s]+)\s+[0-9]+\s*$$' include/uapi/linux/capability.h | $(BUILD_SED) -e 's/^#define\s\+/{"/' -e 's/\s*$$/},/' -e 's/\s\+/",/' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/' > $@ 100 101$(STACAPLIBNAME): $(CAPOBJS) 102 $(AR) rcs $@ $^ 103 $(RANLIB) $@ 104 105$(STAPSXLIBNAME): $(PSXOBJS) include/sys/psx_syscall.h 106 $(AR) rcs $@ $(PSXOBJS) 107 $(RANLIB) $@ 108 109ifeq ($(SHARED),yes) 110 111empty: empty.c 112 $(CC) -o $@ $< 113 114loader.txt: empty 115 $(OBJCOPY) --dump-section .interp=$@ $< /dev/null 116 117cap_magic.o: execable.h execable.c loader.txt libcap.h 118 $(CC) $(CFLAGS) $(CPPFLAGS) -DLIBRARY_VERSION=\"$(LIBTITLE)-$(VERSION).$(MINOR)\" -DSHARED_LOADER=\"$(shell cat loader.txt)\" -include ./libcap.h -c execable.c -o $@ 119 120$(CAPLIBNAME) $(MAJCAPLIBNAME) $(MINCAPLIBNAME): $(CAPOBJS) $(CAPMAGICOBJ) 121 $(LD) $(CFLAGS) $(LDFLAGS) -Wl,-soname,$(MAJCAPLIBNAME) -o $(MINCAPLIBNAME) $^ $(MAGIC) 122 ln -sf $(MINCAPLIBNAME) $(MAJCAPLIBNAME) 123 ln -sf $(MAJCAPLIBNAME) $(CAPLIBNAME) 124 125psx_magic.o: execable.h psx_exec.c loader.txt 126 $(CC) $(CFLAGS) $(CPPFLAGS) -DLIBRARY_VERSION=\"$(PSXTITLE)-$(VERSION).$(MINOR)\" -DSHARED_LOADER=\"$(shell cat loader.txt)\" -c psx_exec.c -o $@ 127 128$(PSXLIBNAME) $(MAJPSXLIBNAME) $(MINPSXLIBNAME): $(PSXOBJS) include/sys/psx_syscall.h $(PSXMAGICOBJ) 129 $(LD) $(CFLAGS) $(LDFLAGS) -Wl,-soname,$(MAJPSXLIBNAME) -o $(MINPSXLIBNAME) $(PSXOBJS) $(PSXMAGICOBJ) $(MAGIC) $(PSXLINKFLAGS) 130 ln -sf $(MINPSXLIBNAME) $(MAJPSXLIBNAME) 131 ln -sf $(MAJPSXLIBNAME) $(PSXLIBNAME) 132endif 133 134%.o: %.c $(INCLS) 135 $(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@ 136 137cap_text.o: cap_text.c $(USE_GPERF_OUTPUT) $(INCLS) 138 $(CC) $(CFLAGS) $(CPPFLAGS) $(INCLUDE_GPERF_OUTPUT) -c $< -o $@ 139 140cap_test: cap_test.c $(INCLS) $(CAPOBJS) 141 $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $< $(CAPOBJS) -o $@ 142 143libcapsotest: $(CAPLIBNAME) 144 ./$(CAPLIBNAME) 145 ./$(CAPLIBNAME) --usage 146 ./$(CAPLIBNAME) --help 147 ./$(CAPLIBNAME) --summary 148 149libpsxsotest: $(PSXLIBNAME) 150 ./$(PSXLIBNAME) 151 152test: cap_test 153 ./cap_test 154ifeq ($(SHARED),yes) 155 $(MAKE) libcapsotest 156ifeq ($(PTHREADS),yes) 157 $(MAKE) libpsxsotest 158endif 159endif 160 161sudotest: 162 @echo no sudotests for libcap 163 164install: install-static 165ifeq ($(SHARED),yes) 166 $(MAKE) install-shared 167endif 168 169install-static: install-static-cap 170ifeq ($(PTHREADS),yes) 171 $(MAKE) install-static-psx 172endif 173 174install-shared: install-shared-cap 175ifeq ($(PTHREADS),yes) 176 $(MAKE) install-shared-psx 177endif 178 179install-cap: install-static-cap 180ifeq ($(SHARED),yes) 181 $(MAKE) install-shared-cap 182endif 183 184install-psx: install-static-psx 185ifeq ($(SHARED),yes) 186 $(MAKE) install-shared-psx 187endif 188 189install-static-cap: install-common-cap $(STACAPLIBNAME) 190 install -m 0644 $(STACAPLIBNAME) $(FAKEROOT)$(LIBDIR)/$(STACAPLIBNAME) 191 192install-shared-cap: install-common-cap $(MINCAPLIBNAME) 193 install -m 0755 $(MINCAPLIBNAME) $(FAKEROOT)$(LIBDIR)/$(MINCAPLIBNAME) 194 ln -sf $(MINCAPLIBNAME) $(FAKEROOT)$(LIBDIR)/$(MAJCAPLIBNAME) 195 ln -sf $(MAJCAPLIBNAME) $(FAKEROOT)$(LIBDIR)/$(CAPLIBNAME) 196ifeq ($(FAKEROOT),) 197 -/sbin/ldconfig 198endif 199 200install-static-psx: install-common-psx $(STAPSXLIBNAME) 201 install -m 0644 $(STAPSXLIBNAME) $(FAKEROOT)$(LIBDIR)/$(STAPSXLIBNAME) 202 203install-shared-psx: install-common-psx $(MINPSXLIBNAME) 204 install -m 0755 $(MINPSXLIBNAME) $(FAKEROOT)$(LIBDIR)/$(MINPSXLIBNAME) 205 ln -sf $(MINPSXLIBNAME) $(FAKEROOT)$(LIBDIR)/$(MAJPSXLIBNAME) 206 ln -sf $(MAJPSXLIBNAME) $(FAKEROOT)$(LIBDIR)/$(PSXLIBNAME) 207ifeq ($(FAKEROOT),) 208 -/sbin/ldconfig 209endif 210 211install-common-cap: install-common $(LIBTITLE).pc 212 install -m 0644 include/sys/capability.h $(FAKEROOT)$(INCDIR)/sys 213 install -m 0644 $(LIBTITLE).pc $(FAKEROOT)$(PKGCONFIGDIR)/$(LIBTITLE).pc 214 215include/sys/psx_syscall.h: ../psx/psx_syscall.h 216 rm -f $@ 217 ln -s ../../../psx/psx_syscall.h $@ 218 219install-common-psx: install-common $(PSXTITLE).pc include/sys/psx_syscall.h 220 install -m 0644 include/sys/psx_syscall.h $(FAKEROOT)$(INCDIR)/sys 221 install -m 0644 $(PSXTITLE).pc $(FAKEROOT)$(PKGCONFIGDIR)/$(PSXTITLE).pc 222 223install-common: 224 mkdir -p -m 0755 $(FAKEROOT)$(INCDIR)/sys 225 mkdir -p -m 0755 $(FAKEROOT)$(PKGCONFIGDIR) 226 mkdir -p -m 0755 $(FAKEROOT)$(LIBDIR) 227 228clean: 229 $(LOCALCLEAN) 230 rm -f $(CAPOBJS) $(CAPLIBNAME)* $(STACAPLIBNAME) $(LIBTITLE).pc 231 rm -f $(PSXOBJS) $(PSXLIBNAME)* $(STAPSXLIBNAME) $(PSXTITLE).pc 232 rm -f cap_names.h cap_names.list.h _makenames $(GPERF_OUTPUT) cap_test 233 rm -f include/sys/psx_syscall.h 234 rm -f $(CAPMAGICOBJ) $(PSXMAGICOBJ) empty loader.txt 235 cd include/sys && $(LOCALCLEAN) 236