Skip to content

Commit

Permalink
[build] Allow for named configurations at build time
Browse files Browse the repository at this point in the history
Allow named configurations to be specified via the CONFIG=... build
parameter.  For headers in config/*.h which support named
configurations, the following files will be included when building
with CONFIG=<name>:

  - config/defaults/<platform>.h (e.g. config/defaults/pcbios.h)

  - config/<header>.h

  - config/<name>/<header>.h (only if the directory config/<name> exists)

  - config/local/<header>.h (autocreated if necessary)

  - config/local/<name>/<header>.h (autocreated if necessary)

This mechanism allows for predefined named configurations to be
checked in to the source tree, as a directory config/<name> containing
all of the required header files.

The mechanism also allows for users to define multiple local
configurations, by creating header files in the directory
config/local/<name>.

Note that the config/*.h files which are used only to configure
internal iPXE APIs (e.g. config/ioapi.h) cannot be modified via a
named configuration.  This avoids rebuilding the entire iPXE codebase
whenever switching to a different named configuration.

Inspired-by: Robin Smidsrød <robin@smidsrod.no>
Tested-by: Robin Smidsrød <robin@smidsrod.no>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
  • Loading branch information
mcb30 committed Aug 20, 2014
1 parent 3953ddd commit c801cb2
Show file tree
Hide file tree
Showing 9 changed files with 85 additions and 2 deletions.
40 changes: 38 additions & 2 deletions src/Makefile.housekeeping
Expand Up @@ -689,6 +689,34 @@ privkey_DEPS += $(PRIVKEY_LIST)

CFLAGS_privkey += $(if $(PRIVKEY),-DPRIVATE_KEY="\"$(PRIVKEY_INC)\"")

# (Single-element) list of named configurations
#
CONFIG_LIST := $(BIN)/.config.list
ifeq ($(wildcard $(CONFIG_LIST)),)
CONFIG_OLD := <invalid>
else
CONFIG_OLD := $(shell cat $(CONFIG_LIST))
endif
ifneq ($(CONFIG_OLD),$(CONFIG))
$(shell $(ECHO) "$(CONFIG)" > $(CONFIG_LIST))
endif

$(CONFIG_LIST) : $(MAKEDEPS)

VERYCLEANUP += $(CONFIG_LIST)

# Named configurations
#
ifneq ($(CONFIG),)
ifneq ($(wildcard config/$(CONFIG)),)
CFLAGS += -DCONFIG=$(CONFIG)
endif
CFLAGS += -DLOCAL_CONFIG=$(CONFIG)
endif

config/named.h : $(CONFIG_LIST)
$(Q)$(TOUCH) $@

# These files use .incbin inline assembly to include a binary file.
# Unfortunately ccache does not detect this dependency and caches
# builds even when the binary file has changed.
Expand Down Expand Up @@ -1260,8 +1288,16 @@ CLEANUP += $(EINFO)
#
# Local configs
#
config/local/%.h :
$(Q)touch $@
CONFIG_HEADERS := $(patsubst config/%,%,$(wildcard config/*.h))

$(foreach HEADER,$(CONFIG_HEADERS),config/local/$(HEADER)) :
$(Q)$(TOUCH) $@

ifneq ($(CONFIG),)
$(foreach HEADER,$(CONFIG_HEADERS),config/local/$(CONFIG)/$(HEADER)) :
$(Q)$(MKDIR) -p $(dir $@)
$(Q)$(TOUCH) $@
endif

###############################################################################
#
Expand Down
3 changes: 3 additions & 0 deletions src/config/colour.h
Expand Up @@ -30,6 +30,9 @@ FILE_LICENCE ( GPL2_OR_LATER );
#define COLOR_PXE_FG COLOR_BLACK
#define COLOR_PXE_BG COLOR_WHITE

#include <config/named.h>
#include NAMED_CONFIG(colour.h)
#include <config/local/colour.h>
#include LOCAL_NAMED_CONFIG(colour.h)

#endif /* CONFIG_COLOUR_H */
3 changes: 3 additions & 0 deletions src/config/console.h
Expand Up @@ -28,6 +28,9 @@ FILE_LICENCE ( GPL2_OR_LATER );

#define LOG_LEVEL LOG_NONE

#include <config/named.h>
#include NAMED_CONFIG(console.h)
#include <config/local/console.h>
#include LOCAL_NAMED_CONFIG(console.h)

#endif /* CONFIG_CONSOLE_H */
3 changes: 3 additions & 0 deletions src/config/crypto.h
Expand Up @@ -17,6 +17,9 @@ FILE_LICENCE ( GPL2_OR_LATER );
*/
#define TIMESTAMP_ERROR_MARGIN ( ( 12 * 60 + 30 ) * 60 )

#include <config/named.h>
#include NAMED_CONFIG(crypto.h)
#include <config/local/crypto.h>
#include LOCAL_NAMED_CONFIG(crypto.h)

#endif /* CONFIG_CRYPTO_H */
3 changes: 3 additions & 0 deletions src/config/general.h
Expand Up @@ -182,6 +182,9 @@ FILE_LICENCE ( GPL2_OR_LATER );
#undef GDBUDP /* Remote GDB debugging over UDP
* (both may be set) */

#include <config/named.h>
#include NAMED_CONFIG(general.h)
#include <config/local/general.h>
#include LOCAL_NAMED_CONFIG(general.h)

#endif /* CONFIG_GENERAL_H */
26 changes: 26 additions & 0 deletions src/config/named.h
@@ -0,0 +1,26 @@
#ifndef CONFIG_NAMED_H
#define CONFIG_NAMED_H

/** @file
*
* Named configurations
*
*/

FILE_LICENCE ( GPL2_OR_LATER );

/* config/<name>/<header>.h */
#ifdef CONFIG
#define NAMED_CONFIG(_header) <config/CONFIG/_header>
#else
#define NAMED_CONFIG(_header) <config/_header>
#endif

/* config/local/<name>/<header>.h */
#ifdef LOCAL_CONFIG
#define LOCAL_NAMED_CONFIG(_header) <config/local/LOCAL_CONFIG/_header>
#else
#define LOCAL_NAMED_CONFIG(_header) <config/_header>
#endif

#endif /* CONFIG_NAMED_H */
3 changes: 3 additions & 0 deletions src/config/serial.h
Expand Up @@ -32,6 +32,9 @@ FILE_LICENCE ( GPL2_OR_LATER );
#define COMSTOP 1 /* Stop bits */
#endif

#include <config/named.h>
#include NAMED_CONFIG(serial.h)
#include <config/local/serial.h>
#include LOCAL_NAMED_CONFIG(serial.h)

#endif /* CONFIG_SERIAL_H */
3 changes: 3 additions & 0 deletions src/config/settings.h
Expand Up @@ -14,6 +14,9 @@ FILE_LICENCE ( GPL2_OR_LATER );
//#define MEMMAP_SETTINGS /* Memory map settings */
//#define VMWARE_SETTINGS /* VMware GuestInfo settings */

#include <config/named.h>
#include NAMED_CONFIG(settings.h)
#include <config/local/settings.h>
#include LOCAL_NAMED_CONFIG(settings.h)

#endif /* CONFIG_SETTINGS_H */
3 changes: 3 additions & 0 deletions src/config/sideband.h
Expand Up @@ -11,6 +11,9 @@ FILE_LICENCE ( GPL2_OR_LATER );

//#define CONFIG_BOFM /* IBM's BladeCenter Open Fabric Manager */

#include <config/named.h>
#include NAMED_CONFIG(sideband.h)
#include <config/local/sideband.h>
#include LOCAL_NAMED_CONFIG(sideband.h)

#endif /* CONFIG_SIDEBAND_H */

0 comments on commit c801cb2

Please sign in to comment.