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