xref: /aosp_15_r20/external/libcap/libcap/Makefile (revision 2810ac1b38eead2603277920c78344c84ddf3aff)
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