1#
2# Copyright (C) 2003-2004 Greg Kroah-Hartman <greg@kroah.com>
3# Copyright (C) 2004-2006 Kay Sievers <kay.sievers@vrfy.org>
4#
5# This program is free software; you can redistribute it and/or modify
6# it under the terms of the GNU General Public License as published by
7# the Free Software Foundation; version 2 of the License.
8#
9# This program is distributed in the hope that it will be useful,
10# but WITHOUT ANY WARRANTY; without even the implied warranty of
11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12# General Public License for more details.
13#
14# You should have received a copy of the GNU General Public License
15# along with this program; if not, write to the Free Software
16# 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
17#
18
19VERSION = 113
20
21# set this to make use of syslog
22USE_LOG = true
23
24# compile-in development debug messages
25# (export UDEV_LOG="debug" or set udev_log="debug" in udev.conf
26#  to print the debug messages to syslog)
27DEBUG = false
28
29# compile with gcc's code coverage option
30USE_GCOV = false
31
32# include Security-Enhanced Linux support
33USE_SELINUX = false
34
35# set this to create statically linked binaries
36USE_STATIC = false
37
38# to build any of the extras programs pass:
39#  make EXTRAS="extras/<extra1> extras/<extra2>"
40EXTRAS =
41EXTRAS = extras/volume_id
42
43# make the build silent
44V =
45
46PROGRAMS = \
47	udevd				\
48	udevtrigger			\
49	udevsettle			\
50	udevcontrol			\
51	udevmonitor			\
52	udevinfo			\
53	udevtest			\
54	test-udev			\
55	udevstart
56
57# We only need udevtrigger for now
58PROGRAMS = udevtrigger
59
60HEADERS = \
61	udev.h				\
62	udevd.h				\
63	udev_rules.h			\
64	logging.h			\
65	udev_sysdeps.h			\
66	udev_selinux.h			\
67	list.h
68
69UDEV_OBJS = \
70	udev_device.o			\
71	udev_config.o			\
72	udev_node.o			\
73	udev_db.o			\
74	udev_sysfs.o			\
75	udev_rules.o			\
76	udev_rules_parse.o		\
77	udev_utils.o			\
78	udev_utils_string.o		\
79	udev_utils_file.o		\
80	udev_utils_run.o		\
81	udev_sysdeps.o
82LIBUDEV = libudev.a
83
84MAN_PAGES = \
85	udev.7				\
86	udevmonitor.8			\
87	udevd.8				\
88	udevtrigger.8			\
89	udevsettle.8			\
90	udevtest.8			\
91	udevinfo.8			\
92	udevstart.8
93
94GEN_HEADERS = \
95	udev_version.h
96
97prefix ?=
98etcdir =	${prefix}/etc
99sbindir =	${prefix}/sbin
100usrbindir =	${prefix}/usr/bin
101usrsbindir =	${prefix}/usr/sbin
102libudevdir =	${prefix}/lib/udev
103mandir =	${prefix}/usr/share/man
104configdir =	${etcdir}/udev
105udevdir =	/dev
106DESTDIR =
107
108INSTALL = install
109INSTALL_PROGRAM = ${INSTALL}
110INSTALL_DATA = ${INSTALL} -m 644
111INSTALL_SCRIPT = ${INSTALL}
112PWD = $(shell pwd)
113
114CROSS_COMPILE ?=
115CC = $(CROSS_COMPILE)gcc
116LD = $(CROSS_COMPILE)gcc
117AR = $(CROSS_COMPILE)ar
118RANLIB = $(CROSS_COMPILE)ranlib
119
120CFLAGS		+= -g -Wall -pipe -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64
121WARNINGS	= -Wstrict-prototypes -Wsign-compare -Wshadow \
122		  -Wchar-subscripts -Wmissing-declarations -Wnested-externs \
123		  -Wpointer-arith -Wsign-compare -Wmissing-prototypes
124CFLAGS		+= $(WARNINGS)
125
126LDFLAGS += -Wl,-warn-common
127
128OPTFLAGS = -Os
129CFLAGS += $(OPTFLAGS)
130
131ifeq ($(strip $(USE_LOG)),true)
132	CFLAGS += -DUSE_LOG
133endif
134
135# if DEBUG is enabled, then we do not strip
136ifeq ($(strip $(DEBUG)),true)
137	CFLAGS  += -DDEBUG
138endif
139
140ifeq ($(strip $(USE_GCOV)),true)
141	CFLAGS += -fprofile-arcs -ftest-coverage
142	LDFLAGS += -fprofile-arcs
143endif
144
145ifeq ($(strip $(USE_SELINUX)),true)
146	UDEV_OBJS += udev_selinux.o
147	LIB_OBJS += -lselinux -lsepol
148	CFLAGS += -DUSE_SELINUX
149endif
150
151ifeq ($(strip $(USE_STATIC)),true)
152	CFLAGS += -DUSE_STATIC
153	LDFLAGS += -static
154endif
155
156ifeq ($(strip $(V)),)
157	E = @echo
158	Q = @
159else
160	E = @\#
161	Q =
162endif
163export E Q
164
165all: $(PROGRAMS)
166	$(Q) extras="$(EXTRAS)"; for target in $$extras; do \
167		$(MAKE) CC="$(CC)" \
168			CFLAGS="$(CFLAGS)" \
169			LD="$(LD)" \
170			LDFLAGS="$(LDFLAGS)" \
171			AR="$(AR)" \
172			RANLIB="$(RANLIB)" \
173			LIB_OBJS="$(LIB_OBJS)" \
174			LIBUDEV="$(PWD)/$(LIBUDEV)" \
175			-C $$target $@ || exit 1; \
176	done;
177.PHONY: all
178.DEFAULT: all
179
180# clear implicit rules
181.SUFFIXES:
182
183# build the objects
184%.o: %.c $(HEADERS) $(GEN_HEADERS)
185	$(E) "  CC      " $@
186	$(Q) $(CC) -c $(CFLAGS) $< -o $@
187
188# "Static Pattern Rule" to build all programs
189$(PROGRAMS): %: $(HEADERS) $(GEN_HEADERS) $(LIBUDEV) %.o
190	$(E) "  LD      " $@
191	$(Q) $(LD) $(LDFLAGS) $@.o -o $@ $(LIBUDEV) $(LIB_OBJS)
192
193$(LIBUDEV): $(HEADERS) $(GEN_HEADERS) $(UDEV_OBJS)
194	$(Q) rm -f $@
195	$(E) "  AR      " $@
196	$(Q) $(AR) cq $@ $(UDEV_OBJS)
197	$(E) "  RANLIB  " $@
198	$(Q) $(RANLIB) $@
199
200udev_version.h:
201	$(E) "  GENHDR  " $@
202	$(Q) echo "/* Generated by make. */" > $@
203	$(Q) echo \#define UDEV_VERSION		\"$(VERSION)\" >> $@
204	$(Q) echo \#define UDEV_ROOT		\"$(udevdir)\" >> $@
205	$(Q) echo \#define UDEV_CONFIG_FILE	\"$(configdir)/udev.conf\" >> $@
206	$(Q) echo \#define UDEV_RULES_DIR	\"$(configdir)/rules.d\" >> $@
207
208# man pages
209%.8 %.7: %.xml
210	$(E) "  XMLTO   " $@
211	$(Q) xmlto man $?
212.PRECIOUS: %.8
213
214clean:
215	$(E) "  CLEAN   "
216	$(Q) - find . -type f -name '*.orig' -print0 | xargs -0r rm -f
217	$(Q) - find . -type f -name '*.rej' -print0 | xargs -0r rm -f
218	$(Q) - find . -type f -name '*~' -print0 | xargs -0r rm -f
219	$(Q) - find . -type f -name '*.[oas]' -print0 | xargs -0r rm -f
220	$(Q) - find . -type f -name "*.gcno" -print0 | xargs -0r rm -f
221	$(Q) - find . -type f -name "*.gcda" -print0 | xargs -0r rm -f
222	$(Q) - find . -type f -name "*.gcov" -print0 | xargs -0r rm -f
223	$(Q) - rm -f udev_gcov.txt
224	$(Q) - rm -f core $(PROGRAMS) $(GEN_HEADERS)
225	$(Q) - rm -f udev-$(VERSION).tar.gz
226	$(Q) - rm -f udev-$(VERSION).tar.bz2
227	@ extras="$(EXTRAS)"; for target in $$extras; do \
228		$(MAKE) -C $$target $@ || exit 1; \
229	done;
230.PHONY: clean
231
232install-config:
233	$(INSTALL) -d $(DESTDIR)$(configdir)/rules.d
234	@ if [ ! -r $(DESTDIR)$(configdir)/udev.conf ]; then \
235		$(INSTALL_DATA) etc/udev/udev.conf $(DESTDIR)$(configdir); \
236	fi
237	@ if [ ! -r $(DESTDIR)$(configdir)/rules.d/50-udev.rules ]; then \
238		echo; \
239		echo "pick a udev rules file from the etc/udev directory that matches your distribution"; \
240		echo; \
241	fi
242	@ extras="$(EXTRAS)"; for target in $$extras; do \
243		$(MAKE) -C $$target $@ || exit 1; \
244	done;
245.PHONY: install-config
246
247install-man:
248	$(INSTALL_DATA) -D udev.7 $(DESTDIR)$(mandir)/man7/udev.7
249	$(INSTALL_DATA) -D udevinfo.8 $(DESTDIR)$(mandir)/man8/udevinfo.8
250	$(INSTALL_DATA) -D udevtest.8 $(DESTDIR)$(mandir)/man8/udevtest.8
251	$(INSTALL_DATA) -D udevd.8 $(DESTDIR)$(mandir)/man8/udevd.8
252	$(INSTALL_DATA) -D udevtrigger.8 $(DESTDIR)$(mandir)/man8/udevtrigger.8
253	$(INSTALL_DATA) -D udevsettle.8 $(DESTDIR)$(mandir)/man8/udevsettle.8
254	$(INSTALL_DATA) -D udevmonitor.8 $(DESTDIR)$(mandir)/man8/udevmonitor.8
255	- ln -f -s udevd.8 $(DESTDIR)$(mandir)/man8/udevcontrol.8
256	@extras="$(EXTRAS)"; for target in $$extras; do \
257		$(MAKE) -C $$target $@ || exit 1; \
258	done;
259.PHONY: install-man
260
261uninstall-man:
262	- rm -f $(DESTDIR)$(mandir)/man7/udev.7
263	- rm -f $(DESTDIR)$(mandir)/man8/udevinfo.8
264	- rm -f $(DESTDIR)$(mandir)/man8/udevtest.8
265	- rm -f $(DESTDIR)$(mandir)/man8/udevd.8
266	- rm -f $(DESTDIR)$(mandir)/man8/udevtrigger.8
267	- rm -f $(DESTDIR)$(mandir)/man8/udevsettle.8
268	- rm -f $(DESTDIR)$(mandir)/man8/udevmonitor.8
269	- rm -f $(DESTDIR)$(mandir)/man8/udevcontrol.8
270	@ extras="$(EXTRAS)"; for target in $$extras; do \
271		$(MAKE) -C $$target $@ || exit 1; \
272	done;
273.PHONY: uninstall-man
274
275install-udevtrigger:
276	$(INSTALL) -d $(DESTDIR)$(udevdir)
277	$(INSTALL) -d $(DESTDIR)$(configdir)
278	$(INSTALL_DATA) etc/udev/udev.conf $(DESTDIR)$(configdir)
279	$(INSTALL_PROGRAM) -D udevtrigger $(DESTDIR)$(sbindir)/udevtrigger
280	$(STRIP) $(DESTDIR)$(sbindir)/udevtrigger
281	@extras="$(EXTRAS)"; for target in $$extras; do \
282		$(MAKE) -C $$target install-bin || exit 1; \
283	done;
284
285install-bin:
286	$(INSTALL) -d $(DESTDIR)$(udevdir)
287	$(INSTALL_PROGRAM) -D udevd $(DESTDIR)$(sbindir)/udevd
288	$(INSTALL_PROGRAM) -D udevtrigger $(DESTDIR)$(sbindir)/udevtrigger
289	$(INSTALL_PROGRAM) -D udevsettle $(DESTDIR)$(sbindir)/udevsettle
290	$(INSTALL_PROGRAM) -D udevcontrol $(DESTDIR)$(sbindir)/udevcontrol
291	$(INSTALL_PROGRAM) -D udevmonitor $(DESTDIR)$(usrsbindir)/udevmonitor
292	$(INSTALL_PROGRAM) -D udevinfo $(DESTDIR)$(usrbindir)/udevinfo
293	$(INSTALL_PROGRAM) -D udevtest $(DESTDIR)$(usrbindir)/udevtest
294	@extras="$(EXTRAS)"; for target in $$extras; do \
295		$(MAKE) -C $$target $@ || exit 1; \
296	done;
297ifndef DESTDIR
298	- killall udevd
299	- rm -rf /dev/.udev
300	- $(sbindir)/udevd --daemon
301endif
302.PHONY: install-bin
303
304uninstall-bin:
305	- rm -f $(DESTDIR)$(sbindir)/udevd
306	- rm -f $(DESTDIR)$(sbindir)/udevtrigger
307	- rm -f $(DESTDIR)$(sbindir)/udevsettle
308	- rm -f $(DESTDIR)$(sbindir)/udevcontrol
309	- rm -f $(DESTDIR)$(usrsbindir)/udevmonitor
310	- rm -f $(DESTDIR)$(usrbindir)/udevinfo
311	- rm -f $(DESTDIR)$(usrbindir)/udevtest
312ifndef DESTDIR
313	- killall udevd
314	- rm -rf /dev/.udev
315endif
316	@extras="$(EXTRAS)"; for target in $$extras; do \
317		$(MAKE) -C $$target $@ || exit 1; \
318	done;
319.PHONY: uninstall-bin
320
321install: all install-bin
322.PHONY: install
323
324uninstall: uninstall-bin uninstall-man
325.PHONY: uninstall
326
327test tests: all
328	@ cd test && ./udev-test.pl
329	@ cd test && ./udevstart-test.pl
330.PHONY: test tests
331
332buildtest:
333	test/simple-build-check.sh
334.PHONY: buildtest
335
336ChangeLog:
337	head -1 $@ | grep -q "to v$(shell echo $$(($(VERSION) - 1)))"
338	@ mv $@ $@.tmp
339	@ echo "Summary of changes from v$(shell echo $$(($(VERSION) - 1))) to v$(VERSION)" >> $@
340	@ echo "============================================" >> $@
341	@ echo >> $@
342	@ git log --pretty=short $(shell echo $$(($(VERSION) - 1)))..HEAD | git shortlog  >> $@
343	@ echo >> $@
344	@ cat $@
345	@ cat $@.tmp >> $@
346	@ rm $@.tmp
347	head -1 $@ | grep -q "to v$(VERSION)"
348.PHONY: ChangeLog
349.PRECIOUS: ChangeLog
350
351release:
352	$(Q) - rm -f udev-$(VERSION).tar.gz
353	$(Q) - rm -f udev-$(VERSION).tar.bz2
354	head -1 ChangeLog | grep -q "to v$(VERSION)"
355	head -1 RELEASE-NOTES | grep -q "udev $(VERSION)"
356	git commit -a -m "release $(VERSION)"
357	cat .git/refs/heads/master > .git/refs/tags/$(VERSION)
358	@ echo
359	git-archive --format=tar --prefix=udev-$(VERSION)/ HEAD | gzip -9v > udev-$(VERSION).tar.gz
360	git-archive --format=tar --prefix=udev-$(VERSION)/ HEAD | bzip2 -9v > udev-$(VERSION).tar.bz2
361.PHONY: release
362
363gcov-all:
364	$(MAKE) clean all USE_GCOV=true
365	@ echo
366	@ echo "binaries built with gcov support."
367	@ echo "run the tests and analyze with 'make udev_gcov.txt'"
368.PHONY: gcov-all
369
370# see docs/README-gcov_for_udev
371udev_gcov.txt: $(wildcard *.gcda) $(wildcard *.gcno)
372	for file in `find -maxdepth 1 -name "*.gcno"`; do \
373		name=`basename $$file .gcno`; \
374		echo "################" >> $@; \
375		echo "$$name.c" >> $@; \
376		echo "################" >> $@; \
377		if [ -e "$$name.gcda" ]; then \
378			gcov -l "$$name.c" >> $@ 2>&1; \
379		else \
380			echo "code for $$name.c was never executed" >> $@ 2>&1; \
381		fi; \
382		echo >> $@; \
383	done; \
384	echo "view $@ for the result"
385