Makefile 20.1 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 44 45 46
# HOST_OS is only used to work around local toolchain issues.
HOST_OS	?= $(shell uname)
ifeq ($(HOST_OS), MINGW32_NT-5.1)
# Explicitly set CC = gcc on MinGW, otherwise: "cc: command not found".
CC = gcc
endif
ifneq ($(HOST_OS), SunOS)
47 48
STRIP_ARGS = -s
endif
49 50 51 52 53 54 55 56

# Determine the destination processor architecture.
# IMPORTANT: The following line must be placed before TARGET_OS is ever used
# (of course), but should come after any lines setting CC because the line
# below uses CC itself.
override TARGET_OS := $(strip $(shell LC_ALL=C $(CC) $(CPPFLAGS) -E os.h 2>/dev/null | grep -v '^\#' | grep '"' | cut -f 2 -d'"'))

ifeq ($(TARGET_OS), Darwin)
57
CPPFLAGS += -I/opt/local/include -I/usr/local/include
58 59
# 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
60
endif
61
ifeq ($(TARGET_OS), FreeBSD)
62
CPPFLAGS += -I/usr/local/include
63 64
LDFLAGS += -L/usr/local/lib
endif
65
ifeq ($(TARGET_OS), OpenBSD)
Carl-Daniel Hailfinger's avatar
Carl-Daniel Hailfinger committed
66 67 68
CPPFLAGS += -I/usr/local/include
LDFLAGS += -L/usr/local/lib
endif
69
ifeq ($(TARGET_OS), DOS)
70
EXEC_SUFFIX := .exe
71
CPPFLAGS += -I../libgetopt -I../libpci/include
72 73
# DJGPP has odd uint*_t definitions which cause lots of format string warnings.
CPPFLAGS += -Wno-format
74 75
# FIXME Check if we can achieve the same effect with -L../libgetopt -lgetopt
LIBS += ../libgetopt/libgetopt.a
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
# 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
98
endif
99

100 101 102
# FIXME: Should we check for Cygwin/MSVC as well?
ifeq ($(TARGET_OS), MinGW)
EXEC_SUFFIX := .exe
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 172 173 174 175 176 177 178 179 180 181
# 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

182
ifeq ($(TARGET_OS), libpayload)
183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211
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

212 213 214
# Determine the destination processor architecture.
# IMPORTANT: The following line must be placed before ARCH is ever used
# (of course), but should come after any lines setting CC because the line
215 216
# below uses CC itself.
override ARCH := $(strip $(shell LC_ALL=C $(CC) $(CPPFLAGS) -E arch.h 2>/dev/null | grep -v '^\#' | grep '"' | cut -f 2 -d'"'))
217

218 219 220
# PCI port I/O support is unimplemented on PPC/MIPS and unavailable on ARM.
# Right now this means the drivers below only work on x86.
ifneq ($(ARCH), x86)
221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252
ifeq ($(CONFIG_NIC3COM), yes)
UNSUPPORTED_FEATURES += CONFIG_NIC3COM=yes
else
override CONFIG_NIC3COM = 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_RAYER_SPI), yes)
UNSUPPORTED_FEATURES += CONFIG_RAYER_SPI=yes
else
override CONFIG_RAYER_SPI = no
endif
ifeq ($(CONFIG_ATAHPT), yes)
UNSUPPORTED_FEATURES += CONFIG_ATAHPT=yes
else
override CONFIG_ATAHPT = no
endif
ifeq ($(CONFIG_SATAMV), yes)
UNSUPPORTED_FEATURES += CONFIG_SATAMV=yes
else
override CONFIG_SATAMV = no
endif
endif

253
CHIP_OBJS = jedec.o stm50flw0x0x.o w39.o w29ee011.o \
254
	sst28sf040.o m29f400bt.o 82802ab.o pm49fl00x.o \
255
	sst49lfxxxc.o sst_fwhub.o flashchips.o spi.o spi25.o sharplhf00l04.o \
256
	a25.o at25.o opaque.o
257 258 259

LIB_OBJS = layout.o

260
CLI_OBJS = flashrom.o cli_classic.o cli_output.o print.o
261

262
PROGRAMMER_OBJS = udelay.o programmer.o
263

264
all: pciutils features $(PROGRAM)$(EXEC_SUFFIX)
265

266 267
# Set the flashrom version string from the highest revision number
# of the checked out flashrom files.
268 269
# Note to packagers: Any tree exported with "make export" or "make tarball"
# will not require subversion. The downloadable snapshots are already exported.
270
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)
271

272
RELEASE := 0.9.4
273 274
VERSION := $(RELEASE)-r$(SVNVERSION)
RELEASENAME ?= $(VERSION)
275 276

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

278 279 280
# Always enable internal/onboard support for now.
CONFIG_INTERNAL ?= yes

281
# Always enable serprog for now. Needs to be disabled on Windows.
282 283
CONFIG_SERPROG ?= yes

284 285 286
# RayeR SPIPGM hardware support
CONFIG_RAYER_SPI ?= yes

287 288 289
# Always enable 3Com NICs for now.
CONFIG_NIC3COM ?= yes

290 291
# Enable NVIDIA graphics cards. Note: write and erase do not work properly.
CONFIG_GFXNVIDIA ?= yes
292

293 294 295
# Always enable SiI SATA controllers for now.
CONFIG_SATASII ?= yes

296 297 298 299
# Highpoint (HPT) ATA/RAID controller support.
# IMPORTANT: This code is not yet working!
CONFIG_ATAHPT ?= no

300
# Always enable FT2232 SPI dongles for now.
301
CONFIG_FT2232_SPI ?= yes
302 303 304 305 306 307

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

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

309 310 311
# Always enable Realtek NICs for now.
CONFIG_NICREALTEK ?= yes

312 313 314
# Disable National Semiconductor NICs until support is complete and tested.
CONFIG_NICNATSEMI ?= no

315 316 317
# Always enable Intel NICs for now.
CONFIG_NICINTEL ?= yes

318 319 320
# Always enable SPI on Intel NICs for now.
CONFIG_NICINTEL_SPI ?= yes

321 322 323
# Always enable SPI on OGP cards for now.
CONFIG_OGP_SPI ?= yes

324
# Always enable Bus Pirate SPI for now.
325
CONFIG_BUSPIRATE_SPI ?= yes
326

327 328 329 330
# Disable Linux spidev interface support for now, until we check for a Linux
# device (not host, as DOS binaries for example are built on a Linux host).
CONFIG_LINUX_SPI ?= no

331 332 333
# Disable Dediprog SF100 until support is complete and tested.
CONFIG_DEDIPROG ?= no

334 335 336
# Always enable Marvell SATA controllers for now.
CONFIG_SATAMV ?= yes

337
# Disable wiki printing by default. It is only useful if you have wiki access.
338
CONFIG_PRINT_WIKI ?= no
339

340 341 342 343 344 345 346 347 348 349
# 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
350 351 352
ifeq ($(CONFIG_OGP_SPI), yes)
override CONFIG_BITBANG_SPI = yes
else
353 354 355 356
CONFIG_BITBANG_SPI ?= no
endif
endif
endif
357
endif
358

359
ifeq ($(CONFIG_INTERNAL), yes)
360
FEATURE_CFLAGS += -D'CONFIG_INTERNAL=1'
361
PROGRAMMER_OBJS += processor_enable.o chipset_enable.o board_enable.o cbtable.o dmi.o internal.o
362
ifeq ($(ARCH), x86)
363 364
PROGRAMMER_OBJS += it87spi.o it85spi.o sb600spi.o wbsio_spi.o mcp6x_spi.o
PROGRAMMER_OBJS += ichspi.o ich_descriptors.o
365 366
else
endif
367 368 369
NEED_PCI := yes
endif

370
ifeq ($(CONFIG_SERPROG), yes)
371
FEATURE_CFLAGS += -D'CONFIG_SERPROG=1'
372
PROGRAMMER_OBJS += serprog.o
373 374
NEED_SERIAL := yes
NEED_NET := yes
375
endif
376

377 378 379 380 381 382 383
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

384
ifeq ($(CONFIG_BITBANG_SPI), yes)
385
FEATURE_CFLAGS += -D'CONFIG_BITBANG_SPI=1'
386
PROGRAMMER_OBJS += bitbang_spi.o
387 388
endif

389
ifeq ($(CONFIG_NIC3COM), yes)
390
FEATURE_CFLAGS += -D'CONFIG_NIC3COM=1'
391
PROGRAMMER_OBJS += nic3com.o
392
NEED_PCI := yes
393
endif
394

395
ifeq ($(CONFIG_GFXNVIDIA), yes)
396
FEATURE_CFLAGS += -D'CONFIG_GFXNVIDIA=1'
397
PROGRAMMER_OBJS += gfxnvidia.o
398
NEED_PCI := yes
399 400
endif

401
ifeq ($(CONFIG_SATASII), yes)
402
FEATURE_CFLAGS += -D'CONFIG_SATASII=1'
403
PROGRAMMER_OBJS += satasii.o
404
NEED_PCI := yes
405 406
endif

407
ifeq ($(CONFIG_ATAHPT), yes)
408
FEATURE_CFLAGS += -D'CONFIG_ATAHPT=1'
409 410 411 412
PROGRAMMER_OBJS += atahpt.o
NEED_PCI := yes
endif

413
ifeq ($(CONFIG_FT2232_SPI), yes)
414
FTDILIBS := $(shell pkg-config --libs libftdi 2>/dev/null || printf "%s" "-lftdi -lusb")
415
# This is a totally ugly hack.
416
FEATURE_CFLAGS += $(shell LC_ALL=C grep -q "FTDISUPPORT := yes" .features && printf "%s" "-D'CONFIG_FT2232_SPI=1'")
417
FEATURE_LIBS += $(shell LC_ALL=C grep -q "FTDISUPPORT := yes" .features && printf "%s" "$(FTDILIBS)")
418
PROGRAMMER_OBJS += ft2232_spi.o
419 420 421
endif

ifeq ($(CONFIG_DUMMY), yes)
422
FEATURE_CFLAGS += -D'CONFIG_DUMMY=1'
423
PROGRAMMER_OBJS += dummyflasher.o
424 425 426
endif

ifeq ($(CONFIG_DRKAISER), yes)
427
FEATURE_CFLAGS += -D'CONFIG_DRKAISER=1'
428
PROGRAMMER_OBJS += drkaiser.o
429
NEED_PCI := yes
430
endif
431

432
ifeq ($(CONFIG_NICREALTEK), yes)
433
FEATURE_CFLAGS += -D'CONFIG_NICREALTEK=1'
434 435 436 437
PROGRAMMER_OBJS += nicrealtek.o
NEED_PCI := yes
endif

438 439 440 441 442 443
ifeq ($(CONFIG_NICNATSEMI), yes)
FEATURE_CFLAGS += -D'CONFIG_NICNATSEMI=1'
PROGRAMMER_OBJS += nicnatsemi.o
NEED_PCI := yes
endif

444 445 446 447 448 449
ifeq ($(CONFIG_NICINTEL), yes)
FEATURE_CFLAGS += -D'CONFIG_NICINTEL=1'
PROGRAMMER_OBJS += nicintel.o
NEED_PCI := yes
endif

450 451 452 453 454 455
ifeq ($(CONFIG_NICINTEL_SPI), yes)
FEATURE_CFLAGS += -D'CONFIG_NICINTEL_SPI=1'
PROGRAMMER_OBJS += nicintel_spi.o
NEED_PCI := yes
endif

456 457 458 459 460 461
ifeq ($(CONFIG_OGP_SPI), yes)
FEATURE_CFLAGS += -D'CONFIG_OGP_SPI=1'
PROGRAMMER_OBJS += ogp_spi.o
NEED_PCI := yes
endif

462 463
ifeq ($(CONFIG_BUSPIRATE_SPI), yes)
FEATURE_CFLAGS += -D'CONFIG_BUSPIRATE_SPI=1'
464
PROGRAMMER_OBJS += buspirate_spi.o
465
NEED_SERIAL := yes
466 467
endif

468 469 470 471 472
ifeq ($(CONFIG_LINUX_SPI), yes)
FEATURE_CFLAGS += -D'CONFIG_LINUX_SPI=1'
PROGRAMMER_OBJS += linux_spi.o
endif

473
ifeq ($(CONFIG_DEDIPROG), yes)
474
FEATURE_CFLAGS += -D'CONFIG_DEDIPROG=1'
475 476 477 478
FEATURE_LIBS += -lusb
PROGRAMMER_OBJS += dediprog.o
endif

479 480 481 482 483 484
ifeq ($(CONFIG_SATAMV), yes)
FEATURE_CFLAGS += -D'CONFIG_SATAMV=1'
PROGRAMMER_OBJS += satamv.o
NEED_PCI := yes
endif

485
ifeq ($(NEED_SERIAL), yes)
486
LIB_OBJS += serial.o
487
endif
488

489
ifeq ($(NEED_NET), yes)
490
ifeq ($(TARGET_OS), SunOS)
491 492
LIBS += -lsocket
endif
493 494 495
endif

ifeq ($(NEED_PCI), yes)
496
CHECK_LIBPCI = yes
497
FEATURE_CFLAGS += -D'NEED_PCI=1'
498
PROGRAMMER_OBJS += pcidev.o physmap.o hwaccess.o
499
ifeq ($(TARGET_OS), NetBSD)
500 501 502 503
# 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)
504
else
505
ifeq ($(TARGET_OS), DOS)
506
# FIXME There needs to be a better way to do this
507
LIBS += ../libpci/lib/libpci.a
508 509
else
LIBS += -lpci
510
ifeq ($(TARGET_OS), OpenBSD)
Carl-Daniel Hailfinger's avatar
Carl-Daniel Hailfinger committed
511 512 513
# For (i386|amd64)_iopl(2).
LIBS += -l$(shell uname -m)
endif
514
endif
Jonathan A. Kollasch's avatar
Jonathan A. Kollasch committed
515
endif
516 517
endif

518
ifeq ($(CONFIG_PRINT_WIKI), yes)
519
FEATURE_CFLAGS += -D'CONFIG_PRINT_WIKI=1'
520
CLI_OBJS += print_wiki.o
521 522
endif

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

525 526 527
# 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")

528 529
LIBFLASHROM_OBJS = $(CHIP_OBJS) $(PROGRAMMER_OBJS) $(LIB_OBJS)
OBJS = $(CLI_OBJS) $(LIBFLASHROM_OBJS) 
530

531 532
$(PROGRAM)$(EXEC_SUFFIX): $(OBJS)
	$(CC) $(LDFLAGS) -o $(PROGRAM)$(EXEC_SUFFIX) $(OBJS) $(FEATURE_LIBS) $(LIBS)
533

534 535 536 537
libflashrom.a: $(LIBFLASHROM_OBJS)
	$(AR) rcs $@ $^
	$(RANLIB) $@

538 539 540 541
# 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")
542

543
%.o: %.c .features
544
	$(CC) -MMD $(CFLAGS) $(CPPFLAGS) $(FEATURE_CFLAGS) $(SVNDEF) -o $@ -c $<
545

546 547
# Make sure to add all names of generated binaries here.
# This includes all frontends and libflashrom.
548
# We don't use EXEC_SUFFIX here because we want to clean everything.
549
clean:
550
	rm -f $(PROGRAM) $(PROGRAM).exe libflashrom.a *.o *.d
551 552

distclean: clean
553
	rm -f .features .libdeps
554

555 556
strip: $(PROGRAM)$(EXEC_SUFFIX)
	$(STRIP) $(STRIP_ARGS) $(PROGRAM)$(EXEC_SUFFIX)
557

558 559 560 561 562 563 564 565 566 567 568 569 570
# to define test programs we use verbatim variables, which get exported
# to environment variables and are referenced with $$<varname> later

define COMPILER_TEST
int main(int argc, char **argv)
{
	(void) argc;
	(void) argv;
	return 0;
}
endef
export COMPILER_TEST

571
compiler: featuresavailable
572
	@printf "Checking for a C compiler... "
573 574
	@echo "$$COMPILER_TEST" > .test.c
	@$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) .test.c -o .test$(EXEC_SUFFIX) >/dev/null 2>&1 &&	\
575
		echo "found." || ( echo "not found."; \
576 577
		rm -f .test.c .test$(EXEC_SUFFIX); exit 1)
	@rm -f .test.c .test$(EXEC_SUFFIX)
578
	@printf "Target arch is "
579
	@# FreeBSD wc will output extraneous whitespace.
580
	@echo $(ARCH)|wc -w|grep -q '^[[:blank:]]*1[[:blank:]]*$$' ||	\
581 582
		( echo "unknown. Aborting."; exit 1)
	@printf "%s\n" '$(ARCH)'
583 584 585 586 587
	@printf "Target OS is "
	@# FreeBSD wc will output extraneous whitespace.
	@echo $(TARGET_OS)|wc -w|grep -q '^[[:blank:]]*1[[:blank:]]*$$' ||	\
		( echo "unknown. Aborting."; exit 1)
	@printf "%s\n" '$(TARGET_OS)'
588

589 590 591 592 593 594 595 596 597 598 599 600 601 602 603
define LIBPCI_TEST
/* Avoid a failing test due to libpci header symbol shadowing breakage */
#define index shadow_workaround_index
#include <pci/pci.h>
struct pci_access *pacc;
int main(int argc, char **argv)
{
	(void) argc;
	(void) argv;
	pacc = pci_alloc();
	return 0;
}
endef
export LIBPCI_TEST

604
ifeq ($(CHECK_LIBPCI), yes)
605
pciutils: compiler
606
	@printf "Checking for libpci headers... "
607
	@echo "$$LIBPCI_TEST" > .test.c
608
	@$(CC) -c $(CPPFLAGS) $(CFLAGS) .test.c -o .test.o >/dev/null 2>&1 &&		\
609 610 611 612
		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)
613
	@printf "Checking if libpci is present and sufficient... "
614
	@printf "" > .libdeps
615
	@$(CC) $(LDFLAGS) .test.o -o .test$(EXEC_SUFFIX) $(LIBS) >/dev/null 2>&1 &&				\
616
		echo "yes." || ( echo "no.";							\
617
		printf "Checking if libz+libpci are present and sufficient...";	\
618
		$(CC) $(LDFLAGS) .test.o -o .test$(EXEC_SUFFIX) $(LIBS) -lz >/dev/null 2>&1 &&		\
619
		( echo "yes."; echo "NEEDLIBZ := yes" > .libdeps ) || ( echo "no."; echo;	\
620
		echo "Please install libpci (package pciutils) and/or libz.";			\
621
		echo "See README for more information."; echo;				\
622 623
		rm -f .test.c .test.o .test$(EXEC_SUFFIX); exit 1) )
	@rm -f .test.c .test.o .test$(EXEC_SUFFIX)
624 625 626 627
else
pciutils: compiler
	@printf "" > .libdeps
endif
628

629 630
.features: features

631 632 633 634 635 636 637 638 639 640 641
# 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

642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666
define FTDI_TEST
#include <ftdi.h>
struct ftdi_context *ftdic = NULL;
int main(int argc, char **argv)
{
	(void) argc;
	(void) argv;
	return ftdi_init(ftdic);
}
endef
export FTDI_TEST

define UTSNAME_TEST
#include <sys/utsname.h>
struct utsname osinfo;
int main(int argc, char **argv)
{
	(void) argc;
	(void) argv;
	uname (&osinfo);
	return 0;
}
endef
export UTSNAME_TEST

667 668
features: compiler
	@echo "FEATURES := yes" > .features.tmp
669
ifeq ($(CONFIG_FT2232_SPI), yes)
670
	@printf "Checking for FTDI support... "
671
	@echo "$$FTDI_TEST" > .featuretest.c
672
	@$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) .featuretest.c -o .featuretest$(EXEC_SUFFIX) $(FTDILIBS) $(LIBS) >/dev/null 2>&1 &&	\
673 674
		( echo "found."; echo "FTDISUPPORT := yes" >> .features.tmp ) ||	\
		( echo "not found."; echo "FTDISUPPORT := no" >> .features.tmp )
675
endif
676
	@printf "Checking for utsname support... "
677
	@echo "$$UTSNAME_TEST" > .featuretest.c
678
	@$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) .featuretest.c -o .featuretest$(EXEC_SUFFIX) >/dev/null 2>&1 &&	\
679 680
		( echo "found."; echo "UTSNAME := yes" >> .features.tmp ) ||	\
		( echo "not found."; echo "UTSNAME := no" >> .features.tmp )
681
	@$(DIFF) -q .features.tmp .features >/dev/null 2>&1 && rm .features.tmp || mv .features.tmp .features
682
	@rm -f .featuretest.c .featuretest$(EXEC_SUFFIX)
683

684
install: $(PROGRAM)$(EXEC_SUFFIX)
685
	mkdir -p $(DESTDIR)$(PREFIX)/sbin
686
	mkdir -p $(DESTDIR)$(MANDIR)/man8
687
	$(INSTALL) -m 0755 $(PROGRAM)$(EXEC_SUFFIX) $(DESTDIR)$(PREFIX)/sbin
688
	$(INSTALL) -m 0644 $(PROGRAM).8 $(DESTDIR)$(MANDIR)/man8
689

690
export:
691 692 693 694 695
	@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)/
696 697

tarball: export
698 699 700
	@tar cjf $(EXPORTDIR)/flashrom-$(RELEASENAME).tar.bz2 -C $(EXPORTDIR)/ $(TAROPTIONS) flashrom-$(RELEASENAME)/
	@rm -rf $(EXPORTDIR)/flashrom-$(RELEASENAME)
	@echo Created $(EXPORTDIR)/flashrom-$(RELEASENAME).tar.bz2
701

702
djgpp-dos: clean
703 704 705
	make CC=i586-pc-msdosdjgpp-gcc STRIP=i586-pc-msdosdjgpp-strip
libpayload: clean
	make CC="CC=i386-elf-gcc lpgcc" AR=i386-elf-ar RANLIB=i386-elf-ranlib
706

707
.PHONY: all clean distclean compiler pciutils features export tarball dos featuresavailable
708

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