Makefile 18.5 KB
Newer Older
1
#
2 3 4
# This file is part of the flashrom project.
#
# Copyright (C) 2005 coresystems GmbH <stepan@coresystems.de>
5
# Copyright (C) 2009,2010 Carl-Daniel Hailfinger
6 7 8 9 10 11 12 13 14 15 16 17 18
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
19
#
20

21
PROGRAM = flashrom
Ronald G. Minnich's avatar
Ronald G. Minnich committed
22

23
CC      ?= gcc
24
STRIP   ?= strip
25
INSTALL = install
26
DIFF    = diff
27
PREFIX  ?= /usr/local
28
MANDIR  ?= $(PREFIX)/share/man
29
CFLAGS  ?= -Os -Wall -Wshadow
30
EXPORTDIR ?= .
31 32
AR      ?= ar
RANLIB  ?= ranlib
33

34 35 36 37 38 39
WARNERROR ?= yes

ifeq ($(WARNERROR), yes)
CFLAGS += -Werror
endif

40 41 42 43
# Determine the destination processor architecture
override ARCH = $(strip $(shell LC_ALL=C $(CC) -E arch.h|grep -v '^\#'))

# FIXME We have to differentiate between host and target OS architecture.
44
OS_ARCH	?= $(shell uname)
Peter Stuge's avatar
Peter Stuge committed
45
ifneq ($(OS_ARCH), SunOS)
46 47
STRIP_ARGS = -s
endif
Stefan Reinauer's avatar
Stefan Reinauer committed
48
ifeq ($(OS_ARCH), Darwin)
49
CPPFLAGS += -I/opt/local/include -I/usr/local/include
50 51
# DirectHW framework can be found in the DirectHW library.
LDFLAGS += -framework IOKit -framework DirectHW -L/opt/local/lib -L/usr/local/lib
Stefan Reinauer's avatar
Stefan Reinauer committed
52
endif
53
ifeq ($(OS_ARCH), FreeBSD)
54
CPPFLAGS += -I/usr/local/include
55 56
LDFLAGS += -L/usr/local/lib
endif
Carl-Daniel Hailfinger's avatar
Carl-Daniel Hailfinger committed
57 58 59 60
ifeq ($(OS_ARCH), OpenBSD)
CPPFLAGS += -I/usr/local/include
LDFLAGS += -L/usr/local/lib
endif
61
ifeq ($(OS_ARCH), DOS)
62
EXEC_SUFFIX := .exe
63
CPPFLAGS += -I../libgetopt -I../libpci/include
64 65
# FIXME Check if we can achieve the same effect with -L../libgetopt -lgetopt
LIBS += ../libgetopt/libgetopt.a
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
# Bus Pirate and Serprog are not supported under DOS (missing serial support).
ifeq ($(CONFIG_BUSPIRATE_SPI), yes)
UNSUPPORTED_FEATURES += CONFIG_BUSPIRATE_SPI=yes
else
override CONFIG_BUSPIRATE_SPI = no
endif
ifeq ($(CONFIG_SERPROG), yes)
UNSUPPORTED_FEATURES += CONFIG_SERPROG=yes
else
override CONFIG_SERPROG = no
endif
# Dediprog and FT2232 are not supported under DOS (missing USB support).
ifeq ($(CONFIG_DEDIPROG), yes)
UNSUPPORTED_FEATURES += CONFIG_DEDIPROG=yes
else
override CONFIG_DEDIPROG = no
endif
ifeq ($(CONFIG_FT2232_SPI), yes)
UNSUPPORTED_FEATURES += CONFIG_FT2232_SPI=yes
else
override CONFIG_FT2232_SPI = no
endif
88
endif
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 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
ifeq ($(OS_ARCH), MINGW32_NT-5.1)
# Explicitly set CC = gcc on MinGW, otherwise: "cc: command not found".
CC = gcc
# MinGW doesn't have the ffs() function, but we can use gcc's __builtin_ffs().
CFLAGS += -Dffs=__builtin_ffs
# libusb-win32/libftdi stuff is usually installed in /usr/local.
CPPFLAGS += -I/usr/local/include
LDFLAGS += -L/usr/local/lib
# Serprog is not supported under Windows/MinGW (missing sockets support).
ifeq ($(CONFIG_SERPROG), yes)
UNSUPPORTED_FEATURES += CONFIG_SERPROG=yes
else
override CONFIG_SERPROG = no
endif
# For now we disable all PCI-based programmers on Windows/MinGW (no libpci).
ifeq ($(CONFIG_INTERNAL), yes)
UNSUPPORTED_FEATURES += CONFIG_INTERNAL=yes
else
override CONFIG_INTERNAL = no
endif
ifeq ($(CONFIG_RAYER_SPI), yes)
UNSUPPORTED_FEATURES += CONFIG_RAYER_SPI=yes
else
override CONFIG_RAYER_SPI = no
endif
ifeq ($(CONFIG_NIC3COM), yes)
UNSUPPORTED_FEATURES += CONFIG_NIC3COM=yes
else
override CONFIG_NIC3COM = no
endif
ifeq ($(CONFIG_GFXNVIDIA), yes)
UNSUPPORTED_FEATURES += CONFIG_GFXNVIDIA=yes
else
override CONFIG_GFXNVIDIA = no
endif
ifeq ($(CONFIG_SATASII), yes)
UNSUPPORTED_FEATURES += CONFIG_SATASII=yes
else
override CONFIG_SATASII = no
endif
ifeq ($(CONFIG_ATAHPT), yes)
UNSUPPORTED_FEATURES += CONFIG_ATAHPT=yes
else
override CONFIG_ATAHPT = no
endif
ifeq ($(CONFIG_DRKAISER), yes)
UNSUPPORTED_FEATURES += CONFIG_DRKAISER=yes
else
override CONFIG_DRKAISER = no
endif
ifeq ($(CONFIG_NICREALTEK), yes)
UNSUPPORTED_FEATURES += CONFIG_NICREALTEK=yes
else
override CONFIG_NICREALTEK = no
endif
ifeq ($(CONFIG_NICNATSEMI), yes)
UNSUPPORTED_FEATURES += CONFIG_NICNATSEMI=yes
else
override CONFIG_NICNATSEMI = no
endif
ifeq ($(CONFIG_NICINTEL), yes)
UNSUPPORTED_FEATURES += CONFIG_NICINTEL=yes
else
override CONFIG_NICINTEL = no
endif
ifeq ($(CONFIG_NICINTEL_SPI), yes)
UNSUPPORTED_FEATURES += CONFIG_NICINTEL_SPI=yes
else
override CONFIG_NICINTEL_SPI = no
endif
ifeq ($(CONFIG_OGP_SPI), yes)
UNSUPPORTED_FEATURES += CONFIG_OGP_SPI=yes
else
override CONFIG_OGP_SPI = no
endif
ifeq ($(CONFIG_SATAMV), yes)
UNSUPPORTED_FEATURES += CONFIG_SATAMV=yes
else
override CONFIG_SATAMV = no
endif
endif

172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204
ifeq ($(OS_ARCH), libpayload)
CC:=CC=i386-elf-gcc lpgcc
AR:=i386-elf-ar
RANLIB:=i386-elf-ranlib
CPPFLAGS += -DSTANDALONE
ifeq ($(CONFIG_DUMMY), yes)
UNSUPPORTED_FEATURES += CONFIG_DUMMY=yes
else
override CONFIG_DUMMY = no
endif
ifeq ($(CONFIG_BUSPIRATE_SPI), yes)
UNSUPPORTED_FEATURES += CONFIG_BUSPIRATE_SPI=yes
else
override CONFIG_BUSPIRATE_SPI = no
endif
ifeq ($(CONFIG_SERPROG), yes)
UNSUPPORTED_FEATURES += CONFIG_SERPROG=yes
else
override CONFIG_SERPROG = no
endif
# Dediprog and FT2232 are not supported with libpayload (missing libusb support)
ifeq ($(CONFIG_DEDIPROG), yes)
UNSUPPORTED_FEATURES += CONFIG_DEDIPROG=yes
else
override CONFIG_DEDIPROG = no
endif
ifeq ($(CONFIG_FT2232_SPI), yes)
UNSUPPORTED_FEATURES += CONFIG_FT2232_SPI=yes
else
override CONFIG_FT2232_SPI = no
endif
endif

205
CHIP_OBJS = jedec.o stm50flw0x0x.o w39.o w29ee011.o \
206
	sst28sf040.o m29f400bt.o 82802ab.o pm49fl00x.o \
207 208
	sst49lfxxxc.o sst_fwhub.o flashchips.o spi.o spi25.o sharplhf00l04.o \
	a25.o at25.o
209 210 211

LIB_OBJS = layout.o

212
CLI_OBJS = flashrom.o cli_classic.o cli_output.o print.o
213

214
PROGRAMMER_OBJS = udelay.o programmer.o
215

216
all: pciutils features $(PROGRAM)$(EXEC_SUFFIX)
217

218 219
# Set the flashrom version string from the highest revision number
# of the checked out flashrom files.
220 221
# Note to packagers: Any tree exported with "make export" or "make tarball"
# will not require subversion. The downloadable snapshots are already exported.
222
SVNVERSION := $(shell LC_ALL=C svnversion -cn . 2>/dev/null | sed -e "s/.*://" -e "s/\([0-9]*\).*/\1/" | grep "[0-9]" || LC_ALL=C svn info . 2>/dev/null | awk '/^Revision:/ {print $$2 }' | grep "[0-9]" || LC_ALL=C git svn info . 2>/dev/null | awk '/^Revision:/ {print $$2 }' | grep "[0-9]" || echo unknown)
223

224
RELEASE := 0.9.4
225 226
VERSION := $(RELEASE)-r$(SVNVERSION)
RELEASENAME ?= $(VERSION)
227 228

SVNDEF := -D'FLASHROM_VERSION="$(VERSION)"'
229

230 231 232
# Always enable internal/onboard support for now.
CONFIG_INTERNAL ?= yes

233
# Always enable serprog for now. Needs to be disabled on Windows.
234 235
CONFIG_SERPROG ?= yes

236 237 238
# RayeR SPIPGM hardware support
CONFIG_RAYER_SPI ?= yes

239 240 241
# Always enable 3Com NICs for now.
CONFIG_NIC3COM ?= yes

242 243
# Enable NVIDIA graphics cards. Note: write and erase do not work properly.
CONFIG_GFXNVIDIA ?= yes
244

245 246 247
# Always enable SiI SATA controllers for now.
CONFIG_SATASII ?= yes

248 249 250 251
# Highpoint (HPT) ATA/RAID controller support.
# IMPORTANT: This code is not yet working!
CONFIG_ATAHPT ?= no

252
# Always enable FT2232 SPI dongles for now.
253
CONFIG_FT2232_SPI ?= yes
254 255 256 257 258 259

# Always enable dummy tracing for now.
CONFIG_DUMMY ?= yes

# Always enable Dr. Kaiser for now.
CONFIG_DRKAISER ?= yes
260

261 262 263
# Always enable Realtek NICs for now.
CONFIG_NICREALTEK ?= yes

264 265 266
# Disable National Semiconductor NICs until support is complete and tested.
CONFIG_NICNATSEMI ?= no

267 268 269
# Always enable Intel NICs for now.
CONFIG_NICINTEL ?= yes

270 271 272
# Always enable SPI on Intel NICs for now.
CONFIG_NICINTEL_SPI ?= yes

273 274 275
# Always enable SPI on OGP cards for now.
CONFIG_OGP_SPI ?= yes

276
# Always enable Bus Pirate SPI for now.
277
CONFIG_BUSPIRATE_SPI ?= yes
278

279 280 281
# Disable Dediprog SF100 until support is complete and tested.
CONFIG_DEDIPROG ?= no

282 283 284
# Always enable Marvell SATA controllers for now.
CONFIG_SATAMV ?= yes

285
# Disable wiki printing by default. It is only useful if you have wiki access.
286
CONFIG_PRINT_WIKI ?= no
287

288 289 290 291 292 293 294 295 296 297
# Bitbanging SPI infrastructure, default off unless needed.
ifeq ($(CONFIG_RAYER_SPI), yes)
override CONFIG_BITBANG_SPI = yes
else
ifeq ($(CONFIG_INTERNAL), yes)
override CONFIG_BITBANG_SPI = yes
else
ifeq ($(CONFIG_NICINTEL_SPI), yes)
override CONFIG_BITBANG_SPI = yes
else
298 299 300
ifeq ($(CONFIG_OGP_SPI), yes)
override CONFIG_BITBANG_SPI = yes
else
301 302 303 304
CONFIG_BITBANG_SPI ?= no
endif
endif
endif
305
endif
306

307
ifeq ($(CONFIG_INTERNAL), yes)
308
FEATURE_CFLAGS += -D'CONFIG_INTERNAL=1'
309
PROGRAMMER_OBJS += processor_enable.o chipset_enable.o board_enable.o cbtable.o dmi.o internal.o
310
ifeq ($(ARCH),"x86")
311
PROGRAMMER_OBJS += it87spi.o it85spi.o ichspi.o sb600spi.o wbsio_spi.o mcp6x_spi.o
312 313
else
endif
314 315 316
NEED_PCI := yes
endif

317
ifeq ($(CONFIG_SERPROG), yes)
318
FEATURE_CFLAGS += -D'CONFIG_SERPROG=1'
319
PROGRAMMER_OBJS += serprog.o
320 321
NEED_SERIAL := yes
NEED_NET := yes
322
endif
323

324 325 326 327 328 329 330
ifeq ($(CONFIG_RAYER_SPI), yes)
FEATURE_CFLAGS += -D'CONFIG_RAYER_SPI=1'
PROGRAMMER_OBJS += rayer_spi.o
# Actually, NEED_PCI is wrong. NEED_IOPORT_ACCESS would be more correct.
NEED_PCI := yes
endif

331
ifeq ($(CONFIG_BITBANG_SPI), yes)
332
FEATURE_CFLAGS += -D'CONFIG_BITBANG_SPI=1'
333
PROGRAMMER_OBJS += bitbang_spi.o
334 335
endif

336
ifeq ($(CONFIG_NIC3COM), yes)
337
FEATURE_CFLAGS += -D'CONFIG_NIC3COM=1'
338
PROGRAMMER_OBJS += nic3com.o
339
NEED_PCI := yes
340
endif
341

342
ifeq ($(CONFIG_GFXNVIDIA), yes)
343
FEATURE_CFLAGS += -D'CONFIG_GFXNVIDIA=1'
344
PROGRAMMER_OBJS += gfxnvidia.o
345
NEED_PCI := yes
346 347
endif

348
ifeq ($(CONFIG_SATASII), yes)
349
FEATURE_CFLAGS += -D'CONFIG_SATASII=1'
350
PROGRAMMER_OBJS += satasii.o
351
NEED_PCI := yes
352 353
endif

354
ifeq ($(CONFIG_ATAHPT), yes)
355
FEATURE_CFLAGS += -D'CONFIG_ATAHPT=1'
356 357 358 359
PROGRAMMER_OBJS += atahpt.o
NEED_PCI := yes
endif

360
ifeq ($(CONFIG_FT2232_SPI), yes)
361
FTDILIBS := $(shell pkg-config --libs libftdi 2>/dev/null || printf "%s" "-lftdi -lusb")
362
# This is a totally ugly hack.
363
FEATURE_CFLAGS += $(shell LC_ALL=C grep -q "FTDISUPPORT := yes" .features && printf "%s" "-D'CONFIG_FT2232_SPI=1'")
364
FEATURE_LIBS += $(shell LC_ALL=C grep -q "FTDISUPPORT := yes" .features && printf "%s" "$(FTDILIBS)")
365
PROGRAMMER_OBJS += ft2232_spi.o
366 367 368
endif

ifeq ($(CONFIG_DUMMY), yes)
369
FEATURE_CFLAGS += -D'CONFIG_DUMMY=1'
370
PROGRAMMER_OBJS += dummyflasher.o
371 372 373
endif

ifeq ($(CONFIG_DRKAISER), yes)
374
FEATURE_CFLAGS += -D'CONFIG_DRKAISER=1'
375
PROGRAMMER_OBJS += drkaiser.o
376
NEED_PCI := yes
377
endif
378

379
ifeq ($(CONFIG_NICREALTEK), yes)
380
FEATURE_CFLAGS += -D'CONFIG_NICREALTEK=1'
381 382 383 384
PROGRAMMER_OBJS += nicrealtek.o
NEED_PCI := yes
endif

385 386 387 388 389 390
ifeq ($(CONFIG_NICNATSEMI), yes)
FEATURE_CFLAGS += -D'CONFIG_NICNATSEMI=1'
PROGRAMMER_OBJS += nicnatsemi.o
NEED_PCI := yes
endif

391 392 393 394 395 396
ifeq ($(CONFIG_NICINTEL), yes)
FEATURE_CFLAGS += -D'CONFIG_NICINTEL=1'
PROGRAMMER_OBJS += nicintel.o
NEED_PCI := yes
endif

397 398 399 400 401 402
ifeq ($(CONFIG_NICINTEL_SPI), yes)
FEATURE_CFLAGS += -D'CONFIG_NICINTEL_SPI=1'
PROGRAMMER_OBJS += nicintel_spi.o
NEED_PCI := yes
endif

403 404 405 406 407 408
ifeq ($(CONFIG_OGP_SPI), yes)
FEATURE_CFLAGS += -D'CONFIG_OGP_SPI=1'
PROGRAMMER_OBJS += ogp_spi.o
NEED_PCI := yes
endif

409 410
ifeq ($(CONFIG_BUSPIRATE_SPI), yes)
FEATURE_CFLAGS += -D'CONFIG_BUSPIRATE_SPI=1'
411
PROGRAMMER_OBJS += buspirate_spi.o
412
NEED_SERIAL := yes
413 414
endif

415
ifeq ($(CONFIG_DEDIPROG), yes)
416
FEATURE_CFLAGS += -D'CONFIG_DEDIPROG=1'
417 418 419 420
FEATURE_LIBS += -lusb
PROGRAMMER_OBJS += dediprog.o
endif

421 422 423 424 425 426
ifeq ($(CONFIG_SATAMV), yes)
FEATURE_CFLAGS += -D'CONFIG_SATAMV=1'
PROGRAMMER_OBJS += satamv.o
NEED_PCI := yes
endif

427
ifeq ($(NEED_SERIAL), yes)
428
LIB_OBJS += serial.o
429
endif
430

431 432 433 434
ifeq ($(NEED_NET), yes)
ifeq ($(OS_ARCH), SunOS)
LIBS += -lsocket
endif
435 436 437
endif

ifeq ($(NEED_PCI), yes)
438
CHECK_LIBPCI = yes
439
FEATURE_CFLAGS += -D'NEED_PCI=1'
440
PROGRAMMER_OBJS += pcidev.o physmap.o hwaccess.o
Jonathan A. Kollasch's avatar
Jonathan A. Kollasch committed
441
ifeq ($(OS_ARCH), NetBSD)
442 443 444 445
# The libpci we want is called libpciutils on NetBSD and needs NetBSD libpci.
LIBS += -lpciutils -lpci
# For (i386|x86_64)_iopl(2).
LIBS += -l$(shell uname -p)
446 447 448
else
ifeq ($(OS_ARCH), DOS)
# FIXME There needs to be a better way to do this
449
LIBS += ../libpci/lib/libpci.a
450 451
else
LIBS += -lpci
Carl-Daniel Hailfinger's avatar
Carl-Daniel Hailfinger committed
452 453 454 455
ifeq ($(OS_ARCH), OpenBSD)
# For (i386|amd64)_iopl(2).
LIBS += -l$(shell uname -m)
endif
456
endif
Jonathan A. Kollasch's avatar
Jonathan A. Kollasch committed
457
endif
458 459
endif

460
ifeq ($(CONFIG_PRINT_WIKI), yes)
461
FEATURE_CFLAGS += -D'CONFIG_PRINT_WIKI=1'
462
CLI_OBJS += print_wiki.o
463 464
endif

465 466
FEATURE_CFLAGS += $(shell LC_ALL=C grep -q "UTSNAME := yes" .features && printf "%s" "-D'HAVE_UTSNAME=1'")

467 468 469
# We could use PULLED_IN_LIBS, but that would be ugly.
FEATURE_LIBS += $(shell LC_ALL=C grep -q "NEEDLIBZ := yes" .libdeps && printf "%s" "-lz")

470 471
LIBFLASHROM_OBJS = $(CHIP_OBJS) $(PROGRAMMER_OBJS) $(LIB_OBJS)
OBJS = $(CLI_OBJS) $(LIBFLASHROM_OBJS) 
472

473 474
$(PROGRAM)$(EXEC_SUFFIX): $(OBJS)
	$(CC) $(LDFLAGS) -o $(PROGRAM)$(EXEC_SUFFIX) $(OBJS) $(FEATURE_LIBS) $(LIBS)
475

476 477 478 479
libflashrom.a: $(LIBFLASHROM_OBJS)
	$(AR) rcs $@ $^
	$(RANLIB) $@

480 481 482 483
# TAROPTIONS reduces information leakage from the packager's system.
# If other tar programs support command line arguments for setting uid/gid of
# stored files, they can be handled here as well.
TAROPTIONS = $(shell LC_ALL=C tar --version|grep -q GNU && echo "--owner=root --group=root")
484

485
%.o: %.c .features
486
	$(CC) -MMD $(CFLAGS) $(CPPFLAGS) $(FEATURE_CFLAGS) $(SVNDEF) -o $@ -c $<
487

488 489
# Make sure to add all names of generated binaries here.
# This includes all frontends and libflashrom.
490
# We don't use EXEC_SUFFIX here because we want to clean everything.
491
clean:
492
	rm -f $(PROGRAM) $(PROGRAM).exe libflashrom.a *.o *.d
493 494

distclean: clean
495
	rm -f .features .libdeps
496

497 498
strip: $(PROGRAM)$(EXEC_SUFFIX)
	$(STRIP) $(STRIP_ARGS) $(PROGRAM)$(EXEC_SUFFIX)
499

500
compiler: featuresavailable
501
	@printf "Checking for a C compiler... "
502
	@$(shell ( echo "int main(int argc, char **argv)"; \
503
		   echo "{ (void) argc; (void) argv; return 0; }"; ) > .test.c )
504
	@$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) .test.c -o .test$(EXEC_SUFFIX) >/dev/null &&	\
505
		echo "found." || ( echo "not found."; \
506 507
		rm -f .test.c .test$(EXEC_SUFFIX); exit 1)
	@rm -f .test.c .test$(EXEC_SUFFIX)
508 509 510 511 512
	@printf "ARCH is "
	@# FreeBSD wc will output extraneous whitespace.
	@echo $(ARCH)|wc -l|grep -q '^[[:blank:]]*1[[:blank:]]*$$' ||	\
		( echo "unknown. Aborting."; exit 1)
	@printf "%s\n" '$(ARCH)'
513

514
ifeq ($(CHECK_LIBPCI), yes)
515
pciutils: compiler
516
	@printf "Checking for libpci headers... "
517 518 519
	@# Avoid a failing test due to libpci header symbol shadowing breakage
	@$(shell ( echo "#define index shadow_workaround_index"; \
		   echo "#include <pci/pci.h>";		   \
520 521
		   echo "struct pci_access *pacc;";	   \
		   echo "int main(int argc, char **argv)"; \
522
		   echo "{ (void) argc; (void) argv; pacc = pci_alloc(); return 0; }"; ) > .test.c )
523
	@$(CC) -c $(CPPFLAGS) $(CFLAGS) .test.c -o .test.o >/dev/null 2>&1 &&		\
524 525 526 527
		echo "found." || ( echo "not found."; echo;			\
		echo "Please install libpci headers (package pciutils-devel).";	\
		echo "See README for more information."; echo;			\
		rm -f .test.c .test.o; exit 1)
528
	@printf "Checking if libpci is present and sufficient... "
529
	@printf "" > .libdeps
530
	@$(CC) $(LDFLAGS) .test.o -o .test$(EXEC_SUFFIX) $(LIBS) >/dev/null 2>&1 &&				\
531
		echo "yes." || ( echo "no.";							\
532
		printf "Checking if libz+libpci are present and sufficient...";	\
533
		$(CC) $(LDFLAGS) .test.o -o .test$(EXEC_SUFFIX) $(LIBS) -lz >/dev/null 2>&1 &&		\
534
		( echo "yes."; echo "NEEDLIBZ := yes" > .libdeps ) || ( echo "no."; echo;	\
535
		echo "Please install libpci (package pciutils) and/or libz.";			\
536
		echo "See README for more information."; echo;				\
537 538
		rm -f .test.c .test.o .test$(EXEC_SUFFIX); exit 1) )
	@rm -f .test.c .test.o .test$(EXEC_SUFFIX)
539 540 541 542
else
pciutils: compiler
	@printf "" > .libdeps
endif
543

544 545
.features: features

546 547 548 549 550 551 552 553 554 555 556
# If a user does not explicitly request a non-working feature, we should
# silently disable it. However, if a non-working (does not compile) feature
# is explicitly requested, we should bail out with a descriptive error message.
ifeq ($(UNSUPPORTED_FEATURES), )
featuresavailable:
else
featuresavailable:
	@echo "The following features are unavailable on your machine: $(UNSUPPORTED_FEATURES)"
	@false
endif

557
ifeq ($(CONFIG_FT2232_SPI), yes)
558 559
features: compiler
	@echo "FEATURES := yes" > .features.tmp
560 561 562 563
	@printf "Checking for FTDI support... "
	@$(shell ( echo "#include <ftdi.h>";		   \
		   echo "struct ftdi_context *ftdic = NULL;";	   \
		   echo "int main(int argc, char **argv)"; \
564
		   echo "{ (void) argc; (void) argv; return ftdi_init(ftdic); }"; ) > .featuretest.c )
565
	@$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) .featuretest.c -o .featuretest$(EXEC_SUFFIX) $(FTDILIBS) $(LIBS) >/dev/null 2>&1 &&	\
566 567
		( echo "found."; echo "FTDISUPPORT := yes" >> .features.tmp ) ||	\
		( echo "not found."; echo "FTDISUPPORT := no" >> .features.tmp )
568 569 570 571
	@printf "Checking for utsname support... "
	@$(shell ( echo "#include <sys/utsname.h>";		   \
		   echo "struct utsname osinfo;";	   \
		   echo "int main(int argc, char **argv)"; \
572
		   echo "{ (void) argc; (void) argv; uname (&osinfo); return 0; }"; ) > .featuretest.c )
573
	@$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) .featuretest.c -o .featuretest$(EXEC_SUFFIX) >/dev/null 2>&1 &&	\
574 575
		( echo "found."; echo "UTSNAME := yes" >> .features.tmp ) ||	\
		( echo "not found."; echo "UTSNAME := no" >> .features.tmp )
576
	@$(DIFF) -q .features.tmp .features >/dev/null 2>&1 && rm .features.tmp || mv .features.tmp .features
577
	@rm -f .featuretest.c .featuretest$(EXEC_SUFFIX)
578 579
else
features: compiler
580
	@echo "FEATURES := yes" > .features.tmp
581 582 583 584
	@printf "Checking for utsname support... "
	@$(shell ( echo "#include <sys/utsname.h>";		   \
		   echo "struct utsname osinfo;";	   \
		   echo "int main(int argc, char **argv)"; \
585
		   echo "{ (void) argc; (void) argv; uname (&osinfo); return 0; }"; ) > .featuretest.c )
586
	@$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) .featuretest.c -o .featuretest$(EXEC_SUFFIX) >/dev/null 2>&1 &&	\
587 588
		( echo "found."; echo "UTSNAME := yes" >> .features.tmp ) ||	\
		( echo "not found."; echo "UTSNAME := no" >> .features.tmp )
589
	@$(DIFF) -q .features.tmp .features >/dev/null 2>&1 && rm .features.tmp || mv .features.tmp .features
590
	@rm -f .featuretest.c .featuretest$(EXEC_SUFFIX)
591
endif
592

593
install: $(PROGRAM)$(EXEC_SUFFIX)
594
	mkdir -p $(DESTDIR)$(PREFIX)/sbin
595
	mkdir -p $(DESTDIR)$(MANDIR)/man8
596
	$(INSTALL) -m 0755 $(PROGRAM)$(EXEC_SUFFIX) $(DESTDIR)$(PREFIX)/sbin
597
	$(INSTALL) -m 0644 $(PROGRAM).8 $(DESTDIR)$(MANDIR)/man8
598

599
export:
600 601 602 603 604
	@rm -rf $(EXPORTDIR)/flashrom-$(RELEASENAME)
	@svn export -r BASE . $(EXPORTDIR)/flashrom-$(RELEASENAME)
	@sed "s/^SVNVERSION.*/SVNVERSION := $(SVNVERSION)/" Makefile >$(EXPORTDIR)/flashrom-$(RELEASENAME)/Makefile
	@LC_ALL=C svn log >$(EXPORTDIR)/flashrom-$(RELEASENAME)/ChangeLog
	@echo Exported $(EXPORTDIR)/flashrom-$(RELEASENAME)/
605 606

tarball: export
607 608 609
	@tar cjf $(EXPORTDIR)/flashrom-$(RELEASENAME).tar.bz2 -C $(EXPORTDIR)/ $(TAROPTIONS) flashrom-$(RELEASENAME)/
	@rm -rf $(EXPORTDIR)/flashrom-$(RELEASENAME)
	@echo Created $(EXPORTDIR)/flashrom-$(RELEASENAME).tar.bz2
610

611 612 613
djgpp-dos: clean
	make CC=i586-pc-msdosdjgpp-gcc STRIP=i586-pc-msdosdjgpp-strip WARNERROR=no OS_ARCH=DOS

614
.PHONY: all clean distclean compiler pciutils features export tarball dos featuresavailable
615

616
-include $(OBJS:.o=.d)