Nico Huber has uploaded this change for review.

View Change

[DRAFT] Split Makefile

Now that the sections of the Makefile are somewhat visible again, it
actually looks well structured. How about splitting some of these
sections out?

Change-Id: I2fa86f8b686f61f09a8a5c929587ea71f3e59e78
Signed-off-by: Nico Huber <nico.h@gmx.de>
---
M Makefile
A Makefile.arch
A Makefile.defaults
A Makefile.deps
A Makefile.libs
A Makefile.os
A Makefile.programmers
7 files changed, 791 insertions(+), 693 deletions(-)

git pull ssh://review.coreboot.org:29418/flashrom refs/changes/82/55882/1
diff --git a/Makefile b/Makefile
index 187b1b0..4abed57 100644
--- a/Makefile
+++ b/Makefile
@@ -87,229 +87,17 @@
###############################################################################
# Dependency handling.

-DEPENDS_ON_SERIAL := \
- CONFIG_BUSPIRATE_SPI \
- CONFIG_PONY_SPI \
- CONFIG_SERPROG \
-
-DEPENDS_ON_BITBANG_SPI := \
- CONFIG_INTERNAL \
- CONFIG_NICINTEL_SPI \
- CONFIG_OGP_SPI \
- CONFIG_PONY_SPI \
- CONFIG_RAYER_SPI \
-
-DEPENDS_ON_LIBPCI := \
- CONFIG_ATAHPT \
- CONFIG_ATAPROMISE \
- CONFIG_ATAVIA \
- CONFIG_DRKAISER \
- CONFIG_ENE_LPC \
- CONFIG_GFXNVIDIA \
- CONFIG_INTERNAL \
- CONFIG_IT8212 \
- CONFIG_MEC1308 \
- CONFIG_NIC3COM \
- CONFIG_NICINTEL \
- CONFIG_NICINTEL_EEPROM \
- CONFIG_NICINTEL_SPI \
- CONFIG_NICNATSEMI \
- CONFIG_NICREALTEK \
- CONFIG_OGP_SPI \
- CONFIG_SATAMV \
- CONFIG_SATASII \
-
-DEPENDS_ON_LIBUSB1 := \
- CONFIG_CH341A_SPI \
- CONFIG_DEDIPROG \
- CONFIG_DEVELOPERBOX_SPI \
- CONFIG_DIGILENT_SPI \
- CONFIG_PICKIT2_SPI \
- CONFIG_RAIDEN_DEBUG_SPI \
- CONFIG_STLINKV3_SPI \
-
-DEPENDS_ON_LIBFTDI := \
- CONFIG_FT2232_SPI \
- CONFIG_USBBLASTER_SPI \
-
-DEPENDS_ON_LIBJAYLINK := \
- CONFIG_JLINK_SPI \
-
-define mark_unsupported
-$(foreach p,$1, \
- $(if $(filter $($(p)),yes), \
- $(eval UNSUPPORTED_FEATURES += $(p)=yes),
- $(eval override $(p) := no)))
-endef
-
-define filter_deps
-$(strip $(foreach p,$1, \
- $(if $(filter $($(p)),yes), \
- $(p))))
-endef
-
-define disable_all
-$(foreach p,$1, \
- $(eval override $(p) := no))
-endef
-
-ifeq ($(CONFIG_ENABLE_LIBUSB1_PROGRAMMERS), no)
-$(call disable_all,$(DEPENDS_ON_LIBUSB1))
-endif
-
-ifeq ($(CONFIG_ENABLE_LIBPCI_PROGRAMMERS), no)
-$(call disable_all,$(DEPENDS_ON_LIBPCI))
-endif
+include Makefile.deps

###############################################################################
# General OS-specific settings.
-# 1. Prepare for later by gathering information about host and target OS
-# 2. Set compiler flags and parameters according to OSes
-# 3. Likewise verify user-supplied CONFIG_* variables.

-# HOST_OS is only used to work around local toolchain issues.
-HOST_OS ?= $(shell uname)
-ifeq ($(findstring MINGW, $(HOST_OS)), MINGW)
-# Explicitly set CC = gcc on MinGW, otherwise: "cc: command not found".
-CC = gcc
-endif
-
-ifneq ($(HOST_OS), SunOS)
-STRIP_ARGS = -s
-endif
-
-# Determine the destination OS.
-# 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 $(call debug_shell,$(CC) $(CPPFLAGS) -E os.h 2>/dev/null \
- | tail -1 | cut -f 2 -d'"'))
-
-ifeq ($(TARGET_OS), Darwin)
-override CPPFLAGS += -I/opt/local/include -I/usr/local/include
-override LDFLAGS += -L/opt/local/lib -L/usr/local/lib
-endif
-
-ifeq ($(TARGET_OS), FreeBSD)
-override CPPFLAGS += -I/usr/local/include
-override LDFLAGS += -L/usr/local/lib
-endif
-
-ifeq ($(TARGET_OS), OpenBSD)
-override CPPFLAGS += -I/usr/local/include
-override LDFLAGS += -L/usr/local/lib
-endif
-
-ifeq ($(TARGET_OS), NetBSD)
-override CPPFLAGS += -I/usr/pkg/include
-override LDFLAGS += -L/usr/pkg/lib
-endif
-
-ifeq ($(TARGET_OS), DragonFlyBSD)
-override CPPFLAGS += -I/usr/local/include
-override LDFLAGS += -L/usr/local/lib
-endif
-
-ifeq ($(TARGET_OS), DOS)
-EXEC_SUFFIX := .exe
-# DJGPP has odd uint*_t definitions which cause lots of format string warnings.
-override CFLAGS += -Wno-format
-LIBS += -lgetopt
-# Missing serial support.
-$(call mark_unsupported,$(DEPENDS_ON_SERIAL))
-# Libraries not available for DOS
-$(call mark_unsupported,$(DEPENDS_ON_LIBUSB1) $(DEPENDS_ON_LIBFTDI) $(DEPENDS_ON_LIBJAYLINK))
-# Odd ones (FIXME: why are they unsupported?)
-$(call mark_unsupported,CONFIG_ENE_LPC CONFIG_MEC1308)
-endif
-
-# FIXME: Should we check for Cygwin/MSVC as well?
-ifeq ($(TARGET_OS), MinGW)
-EXEC_SUFFIX := .exe
-# MinGW doesn't have the ffs() function, but we can use gcc's __builtin_ffs().
-FLASHROM_CFLAGS += -Dffs=__builtin_ffs
-# Some functions provided by Microsoft do not work as described in C99 specifications. This macro fixes that
-# for MinGW. See http://sourceforge.net/p/mingw-w64/wiki2/printf%20and%20scanf%20family/ */
-FLASHROM_CFLAGS += -D__USE_MINGW_ANSI_STDIO=1
-
-# For now we disable all PCI-based programmers on Windows/MinGW (no libpci).
-$(call mark_unsupported,$(DEPENDS_ON_LIBPCI))
-# Odd ones (FIXME: why?)
-$(call mark_unsupported,CONFIG_RAYER_SPI)
-
-else # No MinGW
-
-# NI USB-845x only supported on Windows at the moment
-$(call mark_unsupported,CONFIG_NI845X_SPI)
-
-endif
-
-ifeq ($(TARGET_OS), libpayload)
-ifeq ($(MAKECMDGOALS),)
-.DEFAULT_GOAL := libflashrom.a
-$(info Setting default goal to libflashrom.a)
-endif
-FLASHROM_CFLAGS += -DSTANDALONE
-$(call mark_unsupported,CONFIG_DUMMY)
-# libpayload does not provide the romsize field in struct pci_dev that the atapromise code requires.
-$(call mark_unsupported,CONFIG_ATAPROMISE)
-# Bus Pirate, Serprog and PonyProg are not supported with libpayload (missing serial support).
-$(call mark_unsupported,CONFIG_BUSPIRATE_SPI CONFIG_SERPROG CONFIG_PONY_SPI)
-# Dediprog, Developerbox, USB-Blaster, PICkit2, CH341A and FT2232 are not supported with libpayload (missing libusb support).
-$(call mark_unsupported,$(DEPENDS_ON_LIBUSB1) $(DEPENDS_ON_LIBFTDI) $(DEPENDS_ON_LIBJAYLINK))
-# Odd ones. (FIXME: why?)
-$(call mark_unsupported,CONFIG_ENE_LPC CONFIG_MEC1308)
-endif
-
-# Android is handled internally as separate OS, but it supports about the same drivers as Linux.
-ifeq ($(filter $(TARGET_OS),Linux Android), )
-$(call mark_unsupported,CONFIG_LINUX_MTD CONFIG_LINUX_SPI)
-$(call mark_unsupported,CONFIG_MSTARDDC_SPI CONFIG_LSPCON_I2C_SPI CONFIG_REALTEK_MST_I2C_SPI)
-endif
-
-ifeq ($(TARGET_OS), Android)
-# Android on x86 (currently) does not provide raw PCI port I/O operations.
-$(call mark_unsupported,CONFIG_RAYER_SPI)
-endif
-
-ifeq ($(TARGET_OS), Linux)
-CONFIG_LINUX_I2C_HELPER = yes
-endif
+include Makefile.os

###############################################################################
# General architecture-specific settings.
-# Like above for the OS, below we verify user-supplied options depending on the target architecture.

-# 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
-# below uses CC itself.
-override ARCH := $(strip $(call debug_shell,$(CC) $(CPPFLAGS) -E archtest.c 2>/dev/null \
- | tail -1 | cut -f 2 -d'"'))
-override ENDIAN := $(strip $(call debug_shell,$(CC) $(CPPFLAGS) -E endiantest.c 2>/dev/null \
- | tail -1))
-
-# Disable the internal programmer on unsupported architectures (everything but x86 and mipsel)
-ifneq ($(ARCH)-little, $(filter $(ARCH),x86 mips)-$(ENDIAN))
-$(call mark_unsupported,CONFIG_INTERNAL)
-endif
-
-# PCI port I/O support is unimplemented on PPC/MIPS/SPARC and unavailable on ARM.
-# Right now this means the drivers below only work on x86.
-ifneq ($(ARCH), x86)
-$(call mark_unsupported,CONFIG_NIC3COM CONFIG_NICREALTEK CONFIG_NICNATSEMI)
-$(call mark_unsupported,CONFIG_RAYER_SPI CONFIG_ATAHPT CONFIG_ATAPROMISE)
-$(call mark_unsupported,CONFIG_SATAMV CONFIG_ENE_LPC CONFIG_MEC1308)
-endif
-
-# Additionally disable all drivers needing raw access (memory, PCI, port I/O)
-# on architectures with unknown raw access properties.
-# Right now those architectures are alpha hppa m68k sh s390
-ifneq ($(ARCH),$(filter $(ARCH),x86 mips ppc arm sparc arc))
-$(call mark_unsupported,CONFIG_GFXNVIDIA CONFIG_SATASII CONFIG_ATAVIA)
-$(call mark_unsupported,CONFIG_DRKAISER CONFIG_NICINTEL CONFIG_NICINTEL_SPI)
-$(call mark_unsupported,CONFIG_NICINTEL_EEPROM CONFIG_OGP_SPI CONFIG_IT8212)
-endif
+include Makefile.arch

###############################################################################
# Flash chip drivers and bus support infrastructure.
@@ -350,149 +138,7 @@
###############################################################################
# Default settings of CONFIG_* variables.

-# Always enable internal/onboard support for now.
-CONFIG_INTERNAL ?= yes
-
-# Always enable serprog for now.
-CONFIG_SERPROG ?= yes
-
-# RayeR SPIPGM hardware support
-CONFIG_RAYER_SPI ?= yes
-
-# ChromiumOS servo DUT debug board hardware support
-CONFIG_RAIDEN_DEBUG_SPI ?= yes
-
-# PonyProg2000 SPI hardware support
-CONFIG_PONY_SPI ?= yes
-
-# Always enable 3Com NICs for now.
-CONFIG_NIC3COM ?= yes
-
-# Enable NVIDIA graphics cards. Note: write and erase do not work properly.
-CONFIG_GFXNVIDIA ?= yes
-
-# Always enable SiI SATA controllers for now.
-CONFIG_SATASII ?= yes
-
-# Highpoint (HPT) ATA/RAID controller support.
-# IMPORTANT: This code is not yet working!
-CONFIG_ATAHPT ?= no
-
-# VIA VT6421A LPC memory support
-CONFIG_ATAVIA ?= yes
-
-# Promise ATA controller support.
-CONFIG_ATAPROMISE ?= no
-
-# ENE LPC interface keyboard controller
-CONFIG_ENE_LPC ?= yes
-
-# Always enable FT2232 SPI dongles for now.
-CONFIG_FT2232_SPI ?= yes
-
-# Microchip MEC1308 Embedded Controller
-CONFIG_MEC1308 ?= yes
-
-# Always enable Altera USB-Blaster dongles for now.
-CONFIG_USBBLASTER_SPI ?= yes
-
-# MSTAR DDC support needs more tests/reviews/cleanups.
-CONFIG_MSTARDDC_SPI ?= no
-
-# Always enable PICkit2 SPI dongles for now.
-CONFIG_PICKIT2_SPI ?= yes
-
-# Always enable STLink V3
-CONFIG_STLINKV3_SPI ?= yes
-
-# Disables LSPCON support until the i2c helper supports multiple systems.
-CONFIG_LSPCON_I2C_SPI ?= no
-
-# Disables REALTEK_MST support until the i2c helper supports multiple systems.
-CONFIG_REALTEK_MST_I2C_SPI ?= no
-
-# Always enable dummy tracing for now.
-CONFIG_DUMMY ?= yes
-
-# Always enable Dr. Kaiser for now.
-CONFIG_DRKAISER ?= yes
-
-# Always enable Realtek NICs for now.
-CONFIG_NICREALTEK ?= yes
-
-# Disable National Semiconductor NICs until support is complete and tested.
-CONFIG_NICNATSEMI ?= no
-
-# Always enable Intel NICs for now.
-CONFIG_NICINTEL ?= yes
-
-# Always enable SPI on Intel NICs for now.
-CONFIG_NICINTEL_SPI ?= yes
-
-# Always enable EEPROM on Intel NICs for now.
-CONFIG_NICINTEL_EEPROM ?= yes
-
-# Always enable SPI on OGP cards for now.
-CONFIG_OGP_SPI ?= yes
-
-# Always enable Bus Pirate SPI for now.
-CONFIG_BUSPIRATE_SPI ?= yes
-
-# Always enable Dediprog SF100 for now.
-CONFIG_DEDIPROG ?= yes
-
-# Always enable Developerbox emergency recovery for now.
-CONFIG_DEVELOPERBOX_SPI ?= yes
-
-# Always enable Marvell SATA controllers for now.
-CONFIG_SATAMV ?= yes
-
-# Enable Linux spidev and MTD interfaces by default. We disable them on non-Linux targets.
-CONFIG_LINUX_MTD ?= yes
-CONFIG_LINUX_SPI ?= yes
-
-# Always enable ITE IT8212F PATA controllers for now.
-CONFIG_IT8212 ?= yes
-
-# Winchiphead CH341A
-CONFIG_CH341A_SPI ?= yes
-
-# Digilent Development board JTAG
-CONFIG_DIGILENT_SPI ?= yes
-
-# Disable J-Link for now.
-CONFIG_JLINK_SPI ?= no
-
-# National Instruments USB-845x is Windows only and needs a proprietary library.
-CONFIG_NI845X_SPI ?= no
-
-# Disable wiki printing by default. It is only useful if you have wiki access.
-CONFIG_PRINT_WIKI ?= no
-
-# Disable all features if CONFIG_NOTHING=yes is given unless CONFIG_EVERYTHING was also set
-ifeq ($(CONFIG_NOTHING), yes)
- ifeq ($(CONFIG_EVERYTHING), yes)
- $(error Setting CONFIG_NOTHING=yes and CONFIG_EVERYTHING=yes does not make sense)
- endif
- $(foreach var, $(filter CONFIG_%, $(.VARIABLES)),\
- $(if $(filter yes, $($(var))),\
- $(eval $(var)=no)))
-endif
-
-# Enable all features if CONFIG_EVERYTHING=yes is given
-ifeq ($(CONFIG_EVERYTHING), yes)
-$(foreach var, $(filter CONFIG_%, $(.VARIABLES)),\
- $(if $(filter no, $($(var))),\
- $(eval $(var)=yes)))
-endif
-
-# Bitbanging SPI infrastructure, default off unless needed.
-
-ifneq ($(call filter_deps,$(DEPENDS_ON_BITBANG_SPI)), )
-override CONFIG_BITBANG_SPI = yes
-else
-CONFIG_BITBANG_SPI ?= no
-endif
+include Makefile.defaults

###############################################################################
# Handle CONFIG_* variables that depend on others set (and verified) above.
@@ -512,345 +158,17 @@
CONFIG_INTERNAL_DMI ?= yes

###############################################################################
-# Programmer drivers and programmer support infrastructure.
-# Depending on the CONFIG_* variables set and verified above we set compiler flags and parameters below.
+# Configuration for programmer drivers and programmer support infrastructure.

-ifdef CONFIG_DEFAULT_PROGRAMMER_NAME
-FEATURE_CFLAGS += -D'CONFIG_DEFAULT_PROGRAMMER_NAME=&programmer_$(CONFIG_DEFAULT_PROGRAMMER_NAME)'
-else
-FEATURE_CFLAGS += -D'CONFIG_DEFAULT_PROGRAMMER_NAME=NULL'
-endif
+include Makefile.programmers

-FEATURE_CFLAGS += -D'CONFIG_DEFAULT_PROGRAMMER_ARGS="$(CONFIG_DEFAULT_PROGRAMMER_ARGS)"'
+###############################################################################
+# Configuration for libraries.

-ifeq ($(CONFIG_INTERNAL), yes)
-FEATURE_CFLAGS += -D'CONFIG_INTERNAL=1'
-PROGRAMMER_OBJS += processor_enable.o chipset_enable.o board_enable.o cbtable.o internal.o
-ifeq ($(ARCH), x86)
-PROGRAMMER_OBJS += it87spi.o it85spi.o sb600spi.o amd_imc.o wbsio_spi.o mcp6x_spi.o
-PROGRAMMER_OBJS += ichspi.o dmi.o
-ifeq ($(CONFIG_INTERNAL_DMI), yes)
-FEATURE_CFLAGS += -D'CONFIG_INTERNAL_DMI=1'
-endif
-else
-endif
-endif
+include Makefile.libs

-ifeq ($(CONFIG_ENE_LPC), yes)
-FEATURE_CFLAGS += -D'CONFIG_ENE_LPC=1'
-PROGRAMMER_OBJS += ene_lpc.o
-NEED_RAW_ACCESS += CONFIG_ENE_LPC
-endif
-
-ifeq ($(CONFIG_MEC1308), yes)
-FEATURE_CFLAGS += -D'CONFIG_MEC1308=1'
-PROGRAMMER_OBJS += mec1308.o
-NEED_RAW_ACCESS += CONFIG_MEC1308
-endif
-
-ifeq ($(CONFIG_SERPROG), yes)
-FEATURE_CFLAGS += -D'CONFIG_SERPROG=1'
-PROGRAMMER_OBJS += serprog.o
-NEED_SERIAL += CONFIG_SERPROG
-NEED_POSIX_SOCKETS += CONFIG_SERPROG
-endif
-
-ifeq ($(CONFIG_RAYER_SPI), yes)
-FEATURE_CFLAGS += -D'CONFIG_RAYER_SPI=1'
-PROGRAMMER_OBJS += rayer_spi.o
-NEED_RAW_ACCESS += CONFIG_RAYER_SPI
-endif
-
-ifeq ($(CONFIG_RAIDEN_DEBUG_SPI), yes)
-FEATURE_CFLAGS += -D'CONFIG_RAIDEN_DEBUG_SPI=1'
-PROGRAMMER_OBJS += raiden_debug_spi.o
-endif
-
-ifeq ($(CONFIG_PONY_SPI), yes)
-FEATURE_CFLAGS += -D'CONFIG_PONY_SPI=1'
-PROGRAMMER_OBJS += pony_spi.o
-NEED_SERIAL += CONFIG_PONY_SPI
-endif
-
-ifeq ($(CONFIG_BITBANG_SPI), yes)
-FEATURE_CFLAGS += -D'CONFIG_BITBANG_SPI=1'
-PROGRAMMER_OBJS += bitbang_spi.o
-endif
-
-ifeq ($(CONFIG_NIC3COM), yes)
-FEATURE_CFLAGS += -D'CONFIG_NIC3COM=1'
-PROGRAMMER_OBJS += nic3com.o
-endif
-
-ifeq ($(CONFIG_GFXNVIDIA), yes)
-FEATURE_CFLAGS += -D'CONFIG_GFXNVIDIA=1'
-PROGRAMMER_OBJS += gfxnvidia.o
-endif
-
-ifeq ($(CONFIG_SATASII), yes)
-FEATURE_CFLAGS += -D'CONFIG_SATASII=1'
-PROGRAMMER_OBJS += satasii.o
-endif
-
-ifeq ($(CONFIG_ATAHPT), yes)
-FEATURE_CFLAGS += -D'CONFIG_ATAHPT=1'
-PROGRAMMER_OBJS += atahpt.o
-endif
-
-ifeq ($(CONFIG_ATAVIA), yes)
-FEATURE_CFLAGS += -D'CONFIG_ATAVIA=1'
-PROGRAMMER_OBJS += atavia.o
-endif
-
-ifeq ($(CONFIG_ATAPROMISE), yes)
-FEATURE_CFLAGS += -D'CONFIG_ATAPROMISE=1'
-PROGRAMMER_OBJS += atapromise.o
-endif
-
-ifeq ($(CONFIG_IT8212), yes)
-FEATURE_CFLAGS += -D'CONFIG_IT8212=1'
-PROGRAMMER_OBJS += it8212.o
-endif
-
-ifeq ($(CONFIG_FT2232_SPI), yes)
-# This is a totally ugly hack.
-FEATURE_CFLAGS += $(call debug_shell,grep -q "FTDISUPPORT := yes" .features && printf "%s" "-D'CONFIG_FT2232_SPI=1'")
-PROGRAMMER_OBJS += ft2232_spi.o
-endif
-
-ifeq ($(CONFIG_USBBLASTER_SPI), yes)
-# This is a totally ugly hack.
-FEATURE_CFLAGS += $(call debug_shell,grep -q "FTDISUPPORT := yes" .features && printf "%s" "-D'CONFIG_USBBLASTER_SPI=1'")
-PROGRAMMER_OBJS += usbblaster_spi.o
-endif
-
-ifeq ($(CONFIG_PICKIT2_SPI), yes)
-FEATURE_CFLAGS += -D'CONFIG_PICKIT2_SPI=1'
-PROGRAMMER_OBJS += pickit2_spi.o
-endif
-
-ifeq ($(CONFIG_STLINKV3_SPI), yes)
-FEATURE_CFLAGS += -D'CONFIG_STLINKV3_SPI=1'
-PROGRAMMER_OBJS += stlinkv3_spi.o
-endif
-
-ifeq ($(CONFIG_LSPCON_I2C_SPI), yes)
-FEATURE_CFLAGS += -D'CONFIG_LSPCON_I2C_SPI=1'
-PROGRAMMER_OBJS += lspcon_i2c_spi.o
-endif
-
-ifeq ($(CONFIG_REALTEK_MST_I2C_SPI), yes)
-FEATURE_CFLAGS += -D'CONFIG_REALTEK_MST_I2C_SPI=1'
-PROGRAMMER_OBJS += realtek_mst_i2c_spi.o
-endif
-
-ifeq ($(CONFIG_DUMMY), yes)
-FEATURE_CFLAGS += -D'CONFIG_DUMMY=1'
-PROGRAMMER_OBJS += dummyflasher.o
-endif
-
-ifeq ($(CONFIG_DRKAISER), yes)
-FEATURE_CFLAGS += -D'CONFIG_DRKAISER=1'
-PROGRAMMER_OBJS += drkaiser.o
-endif
-
-ifeq ($(CONFIG_NICREALTEK), yes)
-FEATURE_CFLAGS += -D'CONFIG_NICREALTEK=1'
-PROGRAMMER_OBJS += nicrealtek.o
-endif
-
-ifeq ($(CONFIG_NICNATSEMI), yes)
-FEATURE_CFLAGS += -D'CONFIG_NICNATSEMI=1'
-PROGRAMMER_OBJS += nicnatsemi.o
-endif
-
-ifeq ($(CONFIG_NICINTEL), yes)
-FEATURE_CFLAGS += -D'CONFIG_NICINTEL=1'
-PROGRAMMER_OBJS += nicintel.o
-endif
-
-ifeq ($(CONFIG_NICINTEL_SPI), yes)
-FEATURE_CFLAGS += -D'CONFIG_NICINTEL_SPI=1'
-PROGRAMMER_OBJS += nicintel_spi.o
-endif
-
-ifeq ($(CONFIG_NICINTEL_EEPROM), yes)
-FEATURE_CFLAGS += -D'CONFIG_NICINTEL_EEPROM=1'
-PROGRAMMER_OBJS += nicintel_eeprom.o
-endif
-
-ifeq ($(CONFIG_OGP_SPI), yes)
-FEATURE_CFLAGS += -D'CONFIG_OGP_SPI=1'
-PROGRAMMER_OBJS += ogp_spi.o
-endif
-
-ifeq ($(CONFIG_BUSPIRATE_SPI), yes)
-FEATURE_CFLAGS += -D'CONFIG_BUSPIRATE_SPI=1'
-PROGRAMMER_OBJS += buspirate_spi.o
-NEED_SERIAL += CONFIG_BUSPIRATE_SPI
-endif
-
-ifeq ($(CONFIG_DEDIPROG), yes)
-FEATURE_CFLAGS += -D'CONFIG_DEDIPROG=1'
-PROGRAMMER_OBJS += dediprog.o
-endif
-
-ifeq ($(CONFIG_DEVELOPERBOX_SPI), yes)
-FEATURE_CFLAGS += -D'CONFIG_DEVELOPERBOX_SPI=1'
-PROGRAMMER_OBJS += developerbox_spi.o
-endif
-
-ifeq ($(CONFIG_SATAMV), yes)
-FEATURE_CFLAGS += -D'CONFIG_SATAMV=1'
-PROGRAMMER_OBJS += satamv.o
-endif
-
-ifeq ($(CONFIG_LINUX_MTD), yes)
-# This is a totally ugly hack.
-FEATURE_CFLAGS += $(call debug_shell,grep -q "LINUX_MTD_SUPPORT := yes" .features && printf "%s" "-D'CONFIG_LINUX_MTD=1'")
-PROGRAMMER_OBJS += linux_mtd.o
-endif
-
-ifeq ($(CONFIG_LINUX_SPI), yes)
-# This is a totally ugly hack.
-FEATURE_CFLAGS += $(call debug_shell,grep -q "LINUX_SPI_SUPPORT := yes" .features && printf "%s" "-D'CONFIG_LINUX_SPI=1'")
-PROGRAMMER_OBJS += linux_spi.o
-endif
-
-ifeq ($(CONFIG_MSTARDDC_SPI), yes)
-# This is a totally ugly hack.
-FEATURE_CFLAGS += $(call debug_shell,grep -q "LINUX_I2C_SUPPORT := yes" .features && printf "%s" "-D'CONFIG_MSTARDDC_SPI=1'")
-NEED_LINUX_I2C += CONFIG_MSTARDDC_SPI
-PROGRAMMER_OBJS += mstarddc_spi.o
-endif
-
-ifeq ($(CONFIG_CH341A_SPI), yes)
-FEATURE_CFLAGS += -D'CONFIG_CH341A_SPI=1'
-PROGRAMMER_OBJS += ch341a_spi.o
-endif
-
-ifeq ($(CONFIG_DIGILENT_SPI), yes)
-FEATURE_CFLAGS += -D'CONFIG_DIGILENT_SPI=1'
-PROGRAMMER_OBJS += digilent_spi.o
-endif
-
-ifeq ($(CONFIG_JLINK_SPI), yes)
-FEATURE_CFLAGS += -D'CONFIG_JLINK_SPI=1'
-PROGRAMMER_OBJS += jlink_spi.o
-endif
-
-ifeq ($(CONFIG_NI845X_SPI), yes)
-FEATURE_CFLAGS += -D'CONFIG_NI845X_SPI=1'
-
-ifeq ($(CONFIG_NI845X_LIBRARY_PATH),)
-# if the user did not specified the NI-845x headers/lib path
-# do a guess for both 32 and 64 bit Windows versions
-NI845X_LIBS += -L'${PROGRAMFILES}\National Instruments\NI-845x\MS Visual C'
-NI845X_LIBS += -L'${PROGRAMFILES(x86)}\National Instruments\NI-845x\MS Visual C'
-NI845X_INCLUDES += -I'${PROGRAMFILES}\National Instruments\NI-845x\MS Visual C'
-NI845X_INCLUDES += -I'${PROGRAMFILES(x86)}\National Instruments\NI-845x\MS Visual C'
-else
-NI845X_LIBS += -L'$(CONFIG_NI845X_LIBRARY_PATH)'
-NI845X_INCLUDES += -I'$(CONFIG_NI845X_LIBRARY_PATH)'
-endif
-
-FEATURE_CFLAGS += $(NI845X_INCLUDES)
-LIBS += -lni845x
-PROGRAMMER_OBJS += ni845x_spi.o
-endif
-
-ifeq ($(CONFIG_LINUX_I2C_HELPER), yes)
-LIB_OBJS += i2c_helper_linux.o
-FEATURE_CFLAGS += -D'CONFIG_I2C_SUPPORT=1'
-endif
-
-ifneq ($(NEED_SERIAL), )
-LIB_OBJS += serial.o custom_baud.o
-endif
-
-ifneq ($(NEED_POSIX_SOCKETS), )
-ifeq ($(TARGET_OS), SunOS)
-LIBS += -lsocket -lnsl
-endif
-endif
-
-NEED_LIBPCI := $(call filter_deps,$(DEPENDS_ON_LIBPCI))
-ifneq ($(NEED_LIBPCI), )
-CHECK_LIBPCI = yes
-# This is a dirty hack, but it saves us from checking all PCI drivers and all platforms manually.
-# libpci may need raw memory, MSR or PCI port I/O on some platforms.
-# Individual drivers might have the same needs as well.
-NEED_RAW_ACCESS += $(NEED_LIBPCI)
-FEATURE_CFLAGS += -D'NEED_PCI=1'
-FEATURE_CFLAGS += $(call debug_shell,grep -q "OLD_PCI_GET_DEV := yes" .libdeps && printf "%s" "-D'OLD_PCI_GET_DEV=1'")
-
-PROGRAMMER_OBJS += pcidev.o
-ifeq ($(TARGET_OS), NetBSD)
-# The libpci we want is called libpciutils on NetBSD and needs NetBSD libpci.
-PCILIBS += -lpciutils -lpci
-else
-PCILIBS += -lpci
-endif
-endif
-
-ifneq ($(NEED_RAW_ACCESS), )
-# Raw memory, MSR or PCI port I/O access.
-FEATURE_CFLAGS += -D'NEED_RAW_ACCESS=1'
-PROGRAMMER_OBJS += physmap.o hwaccess.o
-
-ifeq ($(TARGET_OS), NetBSD)
-# For (i386|x86_64)_iopl(2).
-PCILIBS += -l$(shell uname -p)
-else
-ifeq ($(TARGET_OS), OpenBSD)
-# For (i386|amd64)_iopl(2).
-PCILIBS += -l$(shell uname -m)
-else
-ifeq ($(TARGET_OS), Darwin)
-# DirectHW framework can be found in the DirectHW library.
-PCILIBS += -framework IOKit -framework DirectHW
-endif
-endif
-endif
-
-endif
-
-NEED_LIBUSB1 := $(call filter_deps,$(DEPENDS_ON_LIBUSB1))
-ifneq ($(NEED_LIBUSB1), )
-CHECK_LIBUSB1 = yes
-FEATURE_CFLAGS += -D'NEED_LIBUSB1=1'
-PROGRAMMER_OBJS += usbdev.o usb_device.o
-# FreeBSD and DragonflyBSD use a reimplementation of libusb-1.0 that is simply called libusb
-ifeq ($(TARGET_OS),$(filter $(TARGET_OS),FreeBSD DragonFlyBSD))
-USB1LIBS += -lusb
-else
-ifeq ($(TARGET_OS),NetBSD)
-override CPPFLAGS += -I/usr/pkg/include/libusb-1.0
-USB1LIBS += -lusb-1.0
-else
-USB1LIBS += $(call debug_shell,[ -n "$(PKG_CONFIG_LIBDIR)" ] && export PKG_CONFIG_LIBDIR="$(PKG_CONFIG_LIBDIR)"; $(PKG_CONFIG) --libs libusb-1.0 || printf "%s" "-lusb-1.0")
-override CPPFLAGS += $(call debug_shell,[ -n "$(PKG_CONFIG_LIBDIR)" ] && export PKG_CONFIG_LIBDIR="$(PKG_CONFIG_LIBDIR)"; $(PKG_CONFIG) --cflags-only-I libusb-1.0 || printf "%s" "-I/usr/include/libusb-1.0")
-endif
-endif
-endif
-
-NEED_LIBFTDI := $(call filter_deps,$(DEPENDS_ON_LIBFTDI))
-ifneq ($(NEED_LIBFTDI), )
-FTDILIBS := $(call debug_shell,[ -n "$(PKG_CONFIG_LIBDIR)" ] && export PKG_CONFIG_LIBDIR="$(PKG_CONFIG_LIBDIR)" ; $(PKG_CONFIG) --libs libftdi1 || $(PKG_CONFIG) --libs libftdi || printf "%s" "-lftdi -lusb")
-FEATURE_CFLAGS += $(call debug_shell,grep -q "FT232H := yes" .features && printf "%s" "-D'HAVE_FT232H=1'")
-FTDI_INCLUDES := $(call debug_shell,[ -n "$(PKG_CONFIG_LIBDIR)" ] && export PKG_CONFIG_LIBDIR="$(PKG_CONFIG_LIBDIR)" ; $(PKG_CONFIG) --cflags-only-I libftdi1)
-FEATURE_CFLAGS += $(FTDI_INCLUDES)
-FEATURE_LIBS += $(call debug_shell,grep -q "FTDISUPPORT := yes" .features && printf "%s" "$(FTDILIBS)")
-# We can't set NEED_LIBUSB1 here because that would transform libftdi auto-enabling
-# into a hard requirement for libusb, defeating the purpose of auto-enabling.
-endif
-
-NEED_LIBJAYLINK := $(call filter_deps,$(DEPENDS_ON_LIBJAYLINK))
-ifneq ($(NEED_LIBJAYLINK), )
-CHECK_LIBJAYLINK = yes
-JAYLINKLIBS += $(call debug_shell,[ -n "$(PKG_CONFIG_LIBDIR)" ] && export PKG_CONFIG_LIBDIR="$(PKG_CONFIG_LIBDIR)"; $(PKG_CONFIG) --libs libjaylink)
-override CPPFLAGS += $(call debug_shell,[ -n "$(PKG_CONFIG_LIBDIR)" ] && export PKG_CONFIG_LIBDIR="$(PKG_CONFIG_LIBDIR)"; $(PKG_CONFIG) --cflags-only-I libjaylink)
-endif
+###############################################################################
+# Some more infrastructure and actual make rules below.

ifeq ($(CONFIG_PRINT_WIKI), yes)
FEATURE_CFLAGS += -D'CONFIG_PRINT_WIKI=1'
diff --git a/Makefile.arch b/Makefile.arch
new file mode 100644
index 0000000..555ce9e
--- /dev/null
+++ b/Makefile.arch
@@ -0,0 +1,46 @@
+#
+# This file is part of the flashrom project.
+#
+# 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.
+#
+
+# Like `Makefile.os`, below we verify user-supplied options
+# depending on the target architecture.
+
+# 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
+# below uses CC itself.
+override ARCH := $(strip $(call debug_shell,$(CC) $(CPPFLAGS) -E archtest.c 2>/dev/null \
+ | tail -1 | cut -f 2 -d'"'))
+override ENDIAN := $(strip $(call debug_shell,$(CC) $(CPPFLAGS) -E endiantest.c 2>/dev/null \
+ | tail -1))
+
+# Disable the internal programmer on unsupported architectures (everything but x86 and mipsel)
+ifneq ($(ARCH)-little, $(filter $(ARCH),x86 mips)-$(ENDIAN))
+$(call mark_unsupported,CONFIG_INTERNAL)
+endif
+
+# PCI port I/O support is unimplemented on PPC/MIPS/SPARC and unavailable on ARM.
+# Right now this means the drivers below only work on x86.
+ifneq ($(ARCH), x86)
+$(call mark_unsupported,CONFIG_NIC3COM CONFIG_NICREALTEK CONFIG_NICNATSEMI)
+$(call mark_unsupported,CONFIG_RAYER_SPI CONFIG_ATAHPT CONFIG_ATAPROMISE)
+$(call mark_unsupported,CONFIG_SATAMV CONFIG_ENE_LPC CONFIG_MEC1308)
+endif
+
+# Additionally disable all drivers needing raw access (memory, PCI, port I/O)
+# on architectures with unknown raw access properties.
+# Right now those architectures are alpha hppa m68k sh s390
+ifneq ($(ARCH),$(filter $(ARCH),x86 mips ppc arm sparc arc))
+$(call mark_unsupported,CONFIG_GFXNVIDIA CONFIG_SATASII CONFIG_ATAVIA)
+$(call mark_unsupported,CONFIG_DRKAISER CONFIG_NICINTEL CONFIG_NICINTEL_SPI)
+$(call mark_unsupported,CONFIG_NICINTEL_EEPROM CONFIG_OGP_SPI CONFIG_IT8212)
+endif
diff --git a/Makefile.defaults b/Makefile.defaults
new file mode 100644
index 0000000..9cf4c3a
--- /dev/null
+++ b/Makefile.defaults
@@ -0,0 +1,160 @@
+#
+# This file is part of the flashrom project.
+#
+# 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.
+#
+
+# The defaults for all programmers unless already overridden
+# by OS or architecture rules. Doing it in this order allows
+# us to detect if the user explicitly requested a programmer
+# during evaluation of the OS and architecture rules.
+
+# Always enable internal/onboard support for now.
+CONFIG_INTERNAL ?= yes
+
+# Always enable serprog for now.
+CONFIG_SERPROG ?= yes
+
+# RayeR SPIPGM hardware support
+CONFIG_RAYER_SPI ?= yes
+
+# ChromiumOS servo DUT debug board hardware support
+CONFIG_RAIDEN_DEBUG_SPI ?= yes
+
+# PonyProg2000 SPI hardware support
+CONFIG_PONY_SPI ?= yes
+
+# Always enable 3Com NICs for now.
+CONFIG_NIC3COM ?= yes
+
+# Enable NVIDIA graphics cards. Note: write and erase do not work properly.
+CONFIG_GFXNVIDIA ?= yes
+
+# Always enable SiI SATA controllers for now.
+CONFIG_SATASII ?= yes
+
+# Highpoint (HPT) ATA/RAID controller support.
+# IMPORTANT: This code is not yet working!
+CONFIG_ATAHPT ?= no
+
+# VIA VT6421A LPC memory support
+CONFIG_ATAVIA ?= yes
+
+# Promise ATA controller support.
+CONFIG_ATAPROMISE ?= no
+
+# ENE LPC interface keyboard controller
+CONFIG_ENE_LPC ?= yes
+
+# Always enable FT2232 SPI dongles for now.
+CONFIG_FT2232_SPI ?= yes
+
+# Microchip MEC1308 Embedded Controller
+CONFIG_MEC1308 ?= yes
+
+# Always enable Altera USB-Blaster dongles for now.
+CONFIG_USBBLASTER_SPI ?= yes
+
+# MSTAR DDC support needs more tests/reviews/cleanups.
+CONFIG_MSTARDDC_SPI ?= no
+
+# Always enable PICkit2 SPI dongles for now.
+CONFIG_PICKIT2_SPI ?= yes
+
+# Always enable STLink V3
+CONFIG_STLINKV3_SPI ?= yes
+
+# Disables LSPCON support until the i2c helper supports multiple systems.
+CONFIG_LSPCON_I2C_SPI ?= no
+
+# Disables REALTEK_MST support until the i2c helper supports multiple systems.
+CONFIG_REALTEK_MST_I2C_SPI ?= no
+
+# Always enable dummy tracing for now.
+CONFIG_DUMMY ?= yes
+
+# Always enable Dr. Kaiser for now.
+CONFIG_DRKAISER ?= yes
+
+# Always enable Realtek NICs for now.
+CONFIG_NICREALTEK ?= yes
+
+# Disable National Semiconductor NICs until support is complete and tested.
+CONFIG_NICNATSEMI ?= no
+
+# Always enable Intel NICs for now.
+CONFIG_NICINTEL ?= yes
+
+# Always enable SPI on Intel NICs for now.
+CONFIG_NICINTEL_SPI ?= yes
+
+# Always enable EEPROM on Intel NICs for now.
+CONFIG_NICINTEL_EEPROM ?= yes
+
+# Always enable SPI on OGP cards for now.
+CONFIG_OGP_SPI ?= yes
+
+# Always enable Bus Pirate SPI for now.
+CONFIG_BUSPIRATE_SPI ?= yes
+
+# Always enable Dediprog SF100 for now.
+CONFIG_DEDIPROG ?= yes
+
+# Always enable Developerbox emergency recovery for now.
+CONFIG_DEVELOPERBOX_SPI ?= yes
+
+# Always enable Marvell SATA controllers for now.
+CONFIG_SATAMV ?= yes
+
+# Enable Linux spidev and MTD interfaces by default. We disable them on non-Linux targets.
+CONFIG_LINUX_MTD ?= yes
+CONFIG_LINUX_SPI ?= yes
+
+# Always enable ITE IT8212F PATA controllers for now.
+CONFIG_IT8212 ?= yes
+
+# Winchiphead CH341A
+CONFIG_CH341A_SPI ?= yes
+
+# Digilent Development board JTAG
+CONFIG_DIGILENT_SPI ?= yes
+
+# Disable J-Link for now.
+CONFIG_JLINK_SPI ?= no
+
+# National Instruments USB-845x is Windows only and needs a proprietary library.
+CONFIG_NI845X_SPI ?= no
+
+# Disable wiki printing by default. It is only useful if you have wiki access.
+CONFIG_PRINT_WIKI ?= no
+
+# Disable all features if CONFIG_NOTHING=yes is given unless CONFIG_EVERYTHING was also set
+ifeq ($(CONFIG_NOTHING), yes)
+ ifeq ($(CONFIG_EVERYTHING), yes)
+ $(error Setting CONFIG_NOTHING=yes and CONFIG_EVERYTHING=yes does not make sense)
+ endif
+ $(foreach var, $(filter CONFIG_%, $(.VARIABLES)),\
+ $(if $(filter yes, $($(var))),\
+ $(eval $(var)=no)))
+endif
+
+# Enable all features if CONFIG_EVERYTHING=yes is given
+ifeq ($(CONFIG_EVERYTHING), yes)
+$(foreach var, $(filter CONFIG_%, $(.VARIABLES)),\
+ $(if $(filter no, $($(var))),\
+ $(eval $(var)=yes)))
+endif
+
+# Bitbanging SPI infrastructure, default off unless needed.
+ifneq ($(call filter_deps,$(DEPENDS_ON_BITBANG_SPI)), )
+override CONFIG_BITBANG_SPI = yes
+else
+CONFIG_BITBANG_SPI ?= no
+endif
diff --git a/Makefile.deps b/Makefile.deps
new file mode 100644
index 0000000..e0d53c8
--- /dev/null
+++ b/Makefile.deps
@@ -0,0 +1,86 @@
+#
+# This file is part of the flashrom project.
+#
+# 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.
+#
+
+DEPENDS_ON_SERIAL := \
+ CONFIG_BUSPIRATE_SPI \
+ CONFIG_PONY_SPI \
+ CONFIG_SERPROG \
+
+DEPENDS_ON_BITBANG_SPI := \
+ CONFIG_INTERNAL \
+ CONFIG_NICINTEL_SPI \
+ CONFIG_OGP_SPI \
+ CONFIG_PONY_SPI \
+ CONFIG_RAYER_SPI \
+
+DEPENDS_ON_LIBPCI := \
+ CONFIG_ATAHPT \
+ CONFIG_ATAPROMISE \
+ CONFIG_ATAVIA \
+ CONFIG_DRKAISER \
+ CONFIG_ENE_LPC \
+ CONFIG_GFXNVIDIA \
+ CONFIG_INTERNAL \
+ CONFIG_IT8212 \
+ CONFIG_MEC1308 \
+ CONFIG_NIC3COM \
+ CONFIG_NICINTEL \
+ CONFIG_NICINTEL_EEPROM \
+ CONFIG_NICINTEL_SPI \
+ CONFIG_NICNATSEMI \
+ CONFIG_NICREALTEK \
+ CONFIG_OGP_SPI \
+ CONFIG_SATAMV \
+ CONFIG_SATASII \
+
+DEPENDS_ON_LIBUSB1 := \
+ CONFIG_CH341A_SPI \
+ CONFIG_DEDIPROG \
+ CONFIG_DEVELOPERBOX_SPI \
+ CONFIG_DIGILENT_SPI \
+ CONFIG_PICKIT2_SPI \
+ CONFIG_RAIDEN_DEBUG_SPI \
+ CONFIG_STLINKV3_SPI \
+
+DEPENDS_ON_LIBFTDI := \
+ CONFIG_FT2232_SPI \
+ CONFIG_USBBLASTER_SPI \
+
+DEPENDS_ON_LIBJAYLINK := \
+ CONFIG_JLINK_SPI \
+
+define mark_unsupported
+$(foreach p,$1, \
+ $(if $(filter $($(p)),yes), \
+ $(eval UNSUPPORTED_FEATURES += $(p)=yes),
+ $(eval override $(p) := no)))
+endef
+
+define filter_deps
+$(strip $(foreach p,$1, \
+ $(if $(filter $($(p)),yes), \
+ $(p))))
+endef
+
+define disable_all
+$(foreach p,$1, \
+ $(eval override $(p) := no))
+endef
+
+ifeq ($(CONFIG_ENABLE_LIBUSB1_PROGRAMMERS), no)
+$(call disable_all,$(DEPENDS_ON_LIBUSB1))
+endif
+
+ifeq ($(CONFIG_ENABLE_LIBPCI_PROGRAMMERS), no)
+$(call disable_all,$(DEPENDS_ON_LIBPCI))
+endif
diff --git a/Makefile.libs b/Makefile.libs
new file mode 100644
index 0000000..e6ddd79
--- /dev/null
+++ b/Makefile.libs
@@ -0,0 +1,96 @@
+#
+# This file is part of the flashrom project.
+#
+# 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.
+#
+
+ifneq ($(NEED_POSIX_SOCKETS), )
+ifeq ($(TARGET_OS), SunOS)
+LIBS += -lsocket -lnsl
+endif
+endif
+
+NEED_LIBPCI := $(call filter_deps,$(DEPENDS_ON_LIBPCI))
+ifneq ($(NEED_LIBPCI), )
+CHECK_LIBPCI = yes
+# This is a dirty hack, but it saves us from checking all PCI drivers and all platforms manually.
+# libpci may need raw memory, MSR or PCI port I/O on some platforms.
+# Individual drivers might have the same needs as well.
+NEED_RAW_ACCESS += $(NEED_LIBPCI)
+FEATURE_CFLAGS += -D'NEED_PCI=1'
+FEATURE_CFLAGS += $(call debug_shell,grep -q "OLD_PCI_GET_DEV := yes" .libdeps && printf "%s" "-D'OLD_PCI_GET_DEV=1'")
+
+PROGRAMMER_OBJS += pcidev.o
+ifeq ($(TARGET_OS), NetBSD)
+# The libpci we want is called libpciutils on NetBSD and needs NetBSD libpci.
+PCILIBS += -lpciutils -lpci
+else
+PCILIBS += -lpci
+endif
+endif
+
+ifneq ($(NEED_RAW_ACCESS), )
+# Raw memory, MSR or PCI port I/O access.
+FEATURE_CFLAGS += -D'NEED_RAW_ACCESS=1'
+PROGRAMMER_OBJS += physmap.o hwaccess.o
+
+ifeq ($(TARGET_OS), NetBSD)
+# For (i386|x86_64)_iopl(2).
+PCILIBS += -l$(shell uname -p)
+else
+ifeq ($(TARGET_OS), OpenBSD)
+# For (i386|amd64)_iopl(2).
+PCILIBS += -l$(shell uname -m)
+else
+ifeq ($(TARGET_OS), Darwin)
+# DirectHW framework can be found in the DirectHW library.
+PCILIBS += -framework IOKit -framework DirectHW
+endif
+endif
+endif
+
+endif
+
+NEED_LIBUSB1 := $(call filter_deps,$(DEPENDS_ON_LIBUSB1))
+ifneq ($(NEED_LIBUSB1), )
+CHECK_LIBUSB1 = yes
+FEATURE_CFLAGS += -D'NEED_LIBUSB1=1'
+PROGRAMMER_OBJS += usbdev.o usb_device.o
+# FreeBSD and DragonflyBSD use a reimplementation of libusb-1.0 that is simply called libusb
+ifeq ($(TARGET_OS),$(filter $(TARGET_OS),FreeBSD DragonFlyBSD))
+USB1LIBS += -lusb
+else
+ifeq ($(TARGET_OS),NetBSD)
+override CPPFLAGS += -I/usr/pkg/include/libusb-1.0
+USB1LIBS += -lusb-1.0
+else
+USB1LIBS += $(call debug_shell,[ -n "$(PKG_CONFIG_LIBDIR)" ] && export PKG_CONFIG_LIBDIR="$(PKG_CONFIG_LIBDIR)"; $(PKG_CONFIG) --libs libusb-1.0 || printf "%s" "-lusb-1.0")
+override CPPFLAGS += $(call debug_shell,[ -n "$(PKG_CONFIG_LIBDIR)" ] && export PKG_CONFIG_LIBDIR="$(PKG_CONFIG_LIBDIR)"; $(PKG_CONFIG) --cflags-only-I libusb-1.0 || printf "%s" "-I/usr/include/libusb-1.0")
+endif
+endif
+endif
+
+NEED_LIBFTDI := $(call filter_deps,$(DEPENDS_ON_LIBFTDI))
+ifneq ($(NEED_LIBFTDI), )
+FTDILIBS := $(call debug_shell,[ -n "$(PKG_CONFIG_LIBDIR)" ] && export PKG_CONFIG_LIBDIR="$(PKG_CONFIG_LIBDIR)" ; $(PKG_CONFIG) --libs libftdi1 || $(PKG_CONFIG) --libs libftdi || printf "%s" "-lftdi -lusb")
+FEATURE_CFLAGS += $(call debug_shell,grep -q "FT232H := yes" .features && printf "%s" "-D'HAVE_FT232H=1'")
+FTDI_INCLUDES := $(call debug_shell,[ -n "$(PKG_CONFIG_LIBDIR)" ] && export PKG_CONFIG_LIBDIR="$(PKG_CONFIG_LIBDIR)" ; $(PKG_CONFIG) --cflags-only-I libftdi1)
+FEATURE_CFLAGS += $(FTDI_INCLUDES)
+FEATURE_LIBS += $(call debug_shell,grep -q "FTDISUPPORT := yes" .features && printf "%s" "$(FTDILIBS)")
+# We can't set NEED_LIBUSB1 here because that would transform libftdi auto-enabling
+# into a hard requirement for libusb, defeating the purpose of auto-enabling.
+endif
+
+NEED_LIBJAYLINK := $(call filter_deps,$(DEPENDS_ON_LIBJAYLINK))
+ifneq ($(NEED_LIBJAYLINK), )
+CHECK_LIBJAYLINK = yes
+JAYLINKLIBS += $(call debug_shell,[ -n "$(PKG_CONFIG_LIBDIR)" ] && export PKG_CONFIG_LIBDIR="$(PKG_CONFIG_LIBDIR)"; $(PKG_CONFIG) --libs libjaylink)
+override CPPFLAGS += $(call debug_shell,[ -n "$(PKG_CONFIG_LIBDIR)" ] && export PKG_CONFIG_LIBDIR="$(PKG_CONFIG_LIBDIR)"; $(PKG_CONFIG) --cflags-only-I libjaylink)
+endif
diff --git a/Makefile.os b/Makefile.os
new file mode 100644
index 0000000..de8c205
--- /dev/null
+++ b/Makefile.os
@@ -0,0 +1,125 @@
+#
+# This file is part of the flashrom project.
+#
+# 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.
+#
+
+# 1. Prepare for later by gathering information about host and target OS
+# 2. Set compiler flags and parameters according to OSes
+# 3. Likewise verify user-supplied CONFIG_* variables.
+
+# HOST_OS is only used to work around local toolchain issues.
+HOST_OS ?= $(shell uname)
+ifeq ($(findstring MINGW, $(HOST_OS)), MINGW)
+# Explicitly set CC = gcc on MinGW, otherwise: "cc: command not found".
+CC = gcc
+endif
+
+ifneq ($(HOST_OS), SunOS)
+STRIP_ARGS = -s
+endif
+
+# Determine the destination OS.
+# 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 $(call debug_shell,$(CC) $(CPPFLAGS) -E os.h 2>/dev/null \
+ | tail -1 | cut -f 2 -d'"'))
+
+ifeq ($(TARGET_OS), Darwin)
+override CPPFLAGS += -I/opt/local/include -I/usr/local/include
+override LDFLAGS += -L/opt/local/lib -L/usr/local/lib
+endif
+
+ifeq ($(TARGET_OS), FreeBSD)
+override CPPFLAGS += -I/usr/local/include
+override LDFLAGS += -L/usr/local/lib
+endif
+
+ifeq ($(TARGET_OS), OpenBSD)
+override CPPFLAGS += -I/usr/local/include
+override LDFLAGS += -L/usr/local/lib
+endif
+
+ifeq ($(TARGET_OS), NetBSD)
+override CPPFLAGS += -I/usr/pkg/include
+override LDFLAGS += -L/usr/pkg/lib
+endif
+
+ifeq ($(TARGET_OS), DragonFlyBSD)
+override CPPFLAGS += -I/usr/local/include
+override LDFLAGS += -L/usr/local/lib
+endif
+
+ifeq ($(TARGET_OS), DOS)
+EXEC_SUFFIX := .exe
+# DJGPP has odd uint*_t definitions which cause lots of format string warnings.
+override CFLAGS += -Wno-format
+LIBS += -lgetopt
+# Missing serial support.
+$(call mark_unsupported,$(DEPENDS_ON_SERIAL))
+# Libraries not available for DOS
+$(call mark_unsupported,$(DEPENDS_ON_LIBUSB1) $(DEPENDS_ON_LIBFTDI) $(DEPENDS_ON_LIBJAYLINK))
+# Odd ones (FIXME: why are they unsupported?)
+$(call mark_unsupported,CONFIG_ENE_LPC CONFIG_MEC1308)
+endif
+
+# FIXME: Should we check for Cygwin/MSVC as well?
+ifeq ($(TARGET_OS), MinGW)
+EXEC_SUFFIX := .exe
+# MinGW doesn't have the ffs() function, but we can use gcc's __builtin_ffs().
+FLASHROM_CFLAGS += -Dffs=__builtin_ffs
+# Some functions provided by Microsoft do not work as described in C99 specifications. This macro fixes that
+# for MinGW. See http://sourceforge.net/p/mingw-w64/wiki2/printf%20and%20scanf%20family/ */
+FLASHROM_CFLAGS += -D__USE_MINGW_ANSI_STDIO=1
+
+# For now we disable all PCI-based programmers on Windows/MinGW (no libpci).
+$(call mark_unsupported,$(DEPENDS_ON_LIBPCI))
+# Odd ones (FIXME: why?)
+$(call mark_unsupported,CONFIG_RAYER_SPI)
+
+else # No MinGW
+
+# NI USB-845x only supported on Windows at the moment
+$(call mark_unsupported,CONFIG_NI845X_SPI)
+
+endif
+
+ifeq ($(TARGET_OS), libpayload)
+ifeq ($(MAKECMDGOALS),)
+.DEFAULT_GOAL := libflashrom.a
+$(info Setting default goal to libflashrom.a)
+endif
+FLASHROM_CFLAGS += -DSTANDALONE
+$(call mark_unsupported,CONFIG_DUMMY)
+# libpayload does not provide the romsize field in struct pci_dev that the atapromise code requires.
+$(call mark_unsupported,CONFIG_ATAPROMISE)
+# Bus Pirate, Serprog and PonyProg are not supported with libpayload (missing serial support).
+$(call mark_unsupported,CONFIG_BUSPIRATE_SPI CONFIG_SERPROG CONFIG_PONY_SPI)
+# Dediprog, Developerbox, USB-Blaster, PICkit2, CH341A and FT2232 are not supported with libpayload (missing libusb support).
+$(call mark_unsupported,$(DEPENDS_ON_LIBUSB1) $(DEPENDS_ON_LIBFTDI) $(DEPENDS_ON_LIBJAYLINK))
+# Odd ones. (FIXME: why?)
+$(call mark_unsupported,CONFIG_ENE_LPC CONFIG_MEC1308)
+endif
+
+# Android is handled internally as separate OS, but it supports about the same drivers as Linux.
+ifeq ($(filter $(TARGET_OS),Linux Android), )
+$(call mark_unsupported,CONFIG_LINUX_MTD CONFIG_LINUX_SPI)
+$(call mark_unsupported,CONFIG_MSTARDDC_SPI CONFIG_LSPCON_I2C_SPI CONFIG_REALTEK_MST_I2C_SPI)
+endif
+
+ifeq ($(TARGET_OS), Android)
+# Android on x86 (currently) does not provide raw PCI port I/O operations.
+$(call mark_unsupported,CONFIG_RAYER_SPI)
+endif
+
+ifeq ($(TARGET_OS), Linux)
+CONFIG_LINUX_I2C_HELPER = yes
+endif
diff --git a/Makefile.programmers b/Makefile.programmers
new file mode 100644
index 0000000..1bb0dc9
--- /dev/null
+++ b/Makefile.programmers
@@ -0,0 +1,267 @@
+#
+# This file is part of the flashrom project.
+#
+# 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.
+#
+
+# Depending on the CONFIG_* variables set and verified above we set compiler flags and parameters below.
+
+ifdef CONFIG_DEFAULT_PROGRAMMER_NAME
+FEATURE_CFLAGS += -D'CONFIG_DEFAULT_PROGRAMMER_NAME=&programmer_$(CONFIG_DEFAULT_PROGRAMMER_NAME)'
+else
+FEATURE_CFLAGS += -D'CONFIG_DEFAULT_PROGRAMMER_NAME=NULL'
+endif
+
+FEATURE_CFLAGS += -D'CONFIG_DEFAULT_PROGRAMMER_ARGS="$(CONFIG_DEFAULT_PROGRAMMER_ARGS)"'
+
+ifeq ($(CONFIG_INTERNAL), yes)
+FEATURE_CFLAGS += -D'CONFIG_INTERNAL=1'
+PROGRAMMER_OBJS += processor_enable.o chipset_enable.o board_enable.o cbtable.o internal.o
+ifeq ($(ARCH), x86)
+PROGRAMMER_OBJS += it87spi.o it85spi.o sb600spi.o amd_imc.o wbsio_spi.o mcp6x_spi.o
+PROGRAMMER_OBJS += ichspi.o dmi.o
+ifeq ($(CONFIG_INTERNAL_DMI), yes)
+FEATURE_CFLAGS += -D'CONFIG_INTERNAL_DMI=1'
+endif
+else
+endif
+endif
+
+ifeq ($(CONFIG_ENE_LPC), yes)
+FEATURE_CFLAGS += -D'CONFIG_ENE_LPC=1'
+PROGRAMMER_OBJS += ene_lpc.o
+NEED_RAW_ACCESS += CONFIG_ENE_LPC
+endif
+
+ifeq ($(CONFIG_MEC1308), yes)
+FEATURE_CFLAGS += -D'CONFIG_MEC1308=1'
+PROGRAMMER_OBJS += mec1308.o
+NEED_RAW_ACCESS += CONFIG_MEC1308
+endif
+
+ifeq ($(CONFIG_SERPROG), yes)
+FEATURE_CFLAGS += -D'CONFIG_SERPROG=1'
+PROGRAMMER_OBJS += serprog.o
+NEED_SERIAL += CONFIG_SERPROG
+NEED_POSIX_SOCKETS += CONFIG_SERPROG
+endif
+
+ifeq ($(CONFIG_RAYER_SPI), yes)
+FEATURE_CFLAGS += -D'CONFIG_RAYER_SPI=1'
+PROGRAMMER_OBJS += rayer_spi.o
+NEED_RAW_ACCESS += CONFIG_RAYER_SPI
+endif
+
+ifeq ($(CONFIG_RAIDEN_DEBUG_SPI), yes)
+FEATURE_CFLAGS += -D'CONFIG_RAIDEN_DEBUG_SPI=1'
+PROGRAMMER_OBJS += raiden_debug_spi.o
+endif
+
+ifeq ($(CONFIG_PONY_SPI), yes)
+FEATURE_CFLAGS += -D'CONFIG_PONY_SPI=1'
+PROGRAMMER_OBJS += pony_spi.o
+NEED_SERIAL += CONFIG_PONY_SPI
+endif
+
+ifeq ($(CONFIG_BITBANG_SPI), yes)
+FEATURE_CFLAGS += -D'CONFIG_BITBANG_SPI=1'
+PROGRAMMER_OBJS += bitbang_spi.o
+endif
+
+ifeq ($(CONFIG_NIC3COM), yes)
+FEATURE_CFLAGS += -D'CONFIG_NIC3COM=1'
+PROGRAMMER_OBJS += nic3com.o
+endif
+
+ifeq ($(CONFIG_GFXNVIDIA), yes)
+FEATURE_CFLAGS += -D'CONFIG_GFXNVIDIA=1'
+PROGRAMMER_OBJS += gfxnvidia.o
+endif
+
+ifeq ($(CONFIG_SATASII), yes)
+FEATURE_CFLAGS += -D'CONFIG_SATASII=1'
+PROGRAMMER_OBJS += satasii.o
+endif
+
+ifeq ($(CONFIG_ATAHPT), yes)
+FEATURE_CFLAGS += -D'CONFIG_ATAHPT=1'
+PROGRAMMER_OBJS += atahpt.o
+endif
+
+ifeq ($(CONFIG_ATAVIA), yes)
+FEATURE_CFLAGS += -D'CONFIG_ATAVIA=1'
+PROGRAMMER_OBJS += atavia.o
+endif
+
+ifeq ($(CONFIG_ATAPROMISE), yes)
+FEATURE_CFLAGS += -D'CONFIG_ATAPROMISE=1'
+PROGRAMMER_OBJS += atapromise.o
+endif
+
+ifeq ($(CONFIG_IT8212), yes)
+FEATURE_CFLAGS += -D'CONFIG_IT8212=1'
+PROGRAMMER_OBJS += it8212.o
+endif
+
+ifeq ($(CONFIG_FT2232_SPI), yes)
+# This is a totally ugly hack.
+FEATURE_CFLAGS += $(call debug_shell,grep -q "FTDISUPPORT := yes" .features && printf "%s" "-D'CONFIG_FT2232_SPI=1'")
+PROGRAMMER_OBJS += ft2232_spi.o
+endif
+
+ifeq ($(CONFIG_USBBLASTER_SPI), yes)
+# This is a totally ugly hack.
+FEATURE_CFLAGS += $(call debug_shell,grep -q "FTDISUPPORT := yes" .features && printf "%s" "-D'CONFIG_USBBLASTER_SPI=1'")
+PROGRAMMER_OBJS += usbblaster_spi.o
+endif
+
+ifeq ($(CONFIG_PICKIT2_SPI), yes)
+FEATURE_CFLAGS += -D'CONFIG_PICKIT2_SPI=1'
+PROGRAMMER_OBJS += pickit2_spi.o
+endif
+
+ifeq ($(CONFIG_STLINKV3_SPI), yes)
+FEATURE_CFLAGS += -D'CONFIG_STLINKV3_SPI=1'
+PROGRAMMER_OBJS += stlinkv3_spi.o
+endif
+
+ifeq ($(CONFIG_LSPCON_I2C_SPI), yes)
+FEATURE_CFLAGS += -D'CONFIG_LSPCON_I2C_SPI=1'
+PROGRAMMER_OBJS += lspcon_i2c_spi.o
+endif
+
+ifeq ($(CONFIG_REALTEK_MST_I2C_SPI), yes)
+FEATURE_CFLAGS += -D'CONFIG_REALTEK_MST_I2C_SPI=1'
+PROGRAMMER_OBJS += realtek_mst_i2c_spi.o
+endif
+
+ifeq ($(CONFIG_DUMMY), yes)
+FEATURE_CFLAGS += -D'CONFIG_DUMMY=1'
+PROGRAMMER_OBJS += dummyflasher.o
+endif
+
+ifeq ($(CONFIG_DRKAISER), yes)
+FEATURE_CFLAGS += -D'CONFIG_DRKAISER=1'
+PROGRAMMER_OBJS += drkaiser.o
+endif
+
+ifeq ($(CONFIG_NICREALTEK), yes)
+FEATURE_CFLAGS += -D'CONFIG_NICREALTEK=1'
+PROGRAMMER_OBJS += nicrealtek.o
+endif
+
+ifeq ($(CONFIG_NICNATSEMI), yes)
+FEATURE_CFLAGS += -D'CONFIG_NICNATSEMI=1'
+PROGRAMMER_OBJS += nicnatsemi.o
+endif
+
+ifeq ($(CONFIG_NICINTEL), yes)
+FEATURE_CFLAGS += -D'CONFIG_NICINTEL=1'
+PROGRAMMER_OBJS += nicintel.o
+endif
+
+ifeq ($(CONFIG_NICINTEL_SPI), yes)
+FEATURE_CFLAGS += -D'CONFIG_NICINTEL_SPI=1'
+PROGRAMMER_OBJS += nicintel_spi.o
+endif
+
+ifeq ($(CONFIG_NICINTEL_EEPROM), yes)
+FEATURE_CFLAGS += -D'CONFIG_NICINTEL_EEPROM=1'
+PROGRAMMER_OBJS += nicintel_eeprom.o
+endif
+
+ifeq ($(CONFIG_OGP_SPI), yes)
+FEATURE_CFLAGS += -D'CONFIG_OGP_SPI=1'
+PROGRAMMER_OBJS += ogp_spi.o
+endif
+
+ifeq ($(CONFIG_BUSPIRATE_SPI), yes)
+FEATURE_CFLAGS += -D'CONFIG_BUSPIRATE_SPI=1'
+PROGRAMMER_OBJS += buspirate_spi.o
+NEED_SERIAL += CONFIG_BUSPIRATE_SPI
+endif
+
+ifeq ($(CONFIG_DEDIPROG), yes)
+FEATURE_CFLAGS += -D'CONFIG_DEDIPROG=1'
+PROGRAMMER_OBJS += dediprog.o
+endif
+
+ifeq ($(CONFIG_DEVELOPERBOX_SPI), yes)
+FEATURE_CFLAGS += -D'CONFIG_DEVELOPERBOX_SPI=1'
+PROGRAMMER_OBJS += developerbox_spi.o
+endif
+
+ifeq ($(CONFIG_SATAMV), yes)
+FEATURE_CFLAGS += -D'CONFIG_SATAMV=1'
+PROGRAMMER_OBJS += satamv.o
+endif
+
+ifeq ($(CONFIG_LINUX_MTD), yes)
+# This is a totally ugly hack.
+FEATURE_CFLAGS += $(call debug_shell,grep -q "LINUX_MTD_SUPPORT := yes" .features && printf "%s" "-D'CONFIG_LINUX_MTD=1'")
+PROGRAMMER_OBJS += linux_mtd.o
+endif
+
+ifeq ($(CONFIG_LINUX_SPI), yes)
+# This is a totally ugly hack.
+FEATURE_CFLAGS += $(call debug_shell,grep -q "LINUX_SPI_SUPPORT := yes" .features && printf "%s" "-D'CONFIG_LINUX_SPI=1'")
+PROGRAMMER_OBJS += linux_spi.o
+endif
+
+ifeq ($(CONFIG_MSTARDDC_SPI), yes)
+# This is a totally ugly hack.
+FEATURE_CFLAGS += $(call debug_shell,grep -q "LINUX_I2C_SUPPORT := yes" .features && printf "%s" "-D'CONFIG_MSTARDDC_SPI=1'")
+NEED_LINUX_I2C += CONFIG_MSTARDDC_SPI
+PROGRAMMER_OBJS += mstarddc_spi.o
+endif
+
+ifeq ($(CONFIG_CH341A_SPI), yes)
+FEATURE_CFLAGS += -D'CONFIG_CH341A_SPI=1'
+PROGRAMMER_OBJS += ch341a_spi.o
+endif
+
+ifeq ($(CONFIG_DIGILENT_SPI), yes)
+FEATURE_CFLAGS += -D'CONFIG_DIGILENT_SPI=1'
+PROGRAMMER_OBJS += digilent_spi.o
+endif
+
+ifeq ($(CONFIG_JLINK_SPI), yes)
+FEATURE_CFLAGS += -D'CONFIG_JLINK_SPI=1'
+PROGRAMMER_OBJS += jlink_spi.o
+endif
+
+ifeq ($(CONFIG_NI845X_SPI), yes)
+FEATURE_CFLAGS += -D'CONFIG_NI845X_SPI=1'
+
+ifeq ($(CONFIG_NI845X_LIBRARY_PATH),)
+# if the user did not specified the NI-845x headers/lib path
+# do a guess for both 32 and 64 bit Windows versions
+NI845X_LIBS += -L'${PROGRAMFILES}\National Instruments\NI-845x\MS Visual C'
+NI845X_LIBS += -L'${PROGRAMFILES(x86)}\National Instruments\NI-845x\MS Visual C'
+NI845X_INCLUDES += -I'${PROGRAMFILES}\National Instruments\NI-845x\MS Visual C'
+NI845X_INCLUDES += -I'${PROGRAMFILES(x86)}\National Instruments\NI-845x\MS Visual C'
+else
+NI845X_LIBS += -L'$(CONFIG_NI845X_LIBRARY_PATH)'
+NI845X_INCLUDES += -I'$(CONFIG_NI845X_LIBRARY_PATH)'
+endif
+
+FEATURE_CFLAGS += $(NI845X_INCLUDES)
+LIBS += -lni845x
+PROGRAMMER_OBJS += ni845x_spi.o
+endif
+
+ifeq ($(CONFIG_LINUX_I2C_HELPER), yes)
+LIB_OBJS += i2c_helper_linux.o
+FEATURE_CFLAGS += -D'CONFIG_I2C_SUPPORT=1'
+endif
+
+ifneq ($(NEED_SERIAL), )
+LIB_OBJS += serial.o custom_baud.o
+endif

To view, visit change 55882. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: flashrom
Gerrit-Branch: master
Gerrit-Change-Id: I2fa86f8b686f61f09a8a5c929587ea71f3e59e78
Gerrit-Change-Number: 55882
Gerrit-PatchSet: 1
Gerrit-Owner: Nico Huber <nico.h@gmx.de>
Gerrit-MessageType: newchange