New extensible build system - initial work

This commit is contained in:
Andrew Dunham 2015-06-25 00:38:04 -07:00
parent f57e57f7b2
commit 93267dc075
6 changed files with 256 additions and 0 deletions

0
make/build/clear_vars.mk Normal file
View File

55
make/build/config.mk Normal file
View File

@ -0,0 +1,55 @@
# This file is included by the top-level Makefile. It sets up
# standard variables based on the current configuration and
# platform that are not specific to what is being built.
# Always use bash, not whatever is installed as /bin/sh
SHELL := /bin/bash
# Utility variables
empty :=
space := $(empty) $(empty)
comma := ,
# Note: make removes the newline immediately prior to `endef`
define newline
endef
backslash := \a
backslash := $(patsubst %a,%,$(backslash))
# ###############################################################
# Build system internal files
# ###############################################################
BUILD_COMBOS:= $(BUILD_SYSTEM)/combo
CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk
# TODO: BUILD_STATIC_LIBRARY := $(BUILD_SYSTEM)/static_library.mk
# TODO: BUILD_HOST_EXECUTABLE := $(BUILD_SYSTEM)/host_executable.mk
# TODO: BUILD_TARGET_EXECUTABLE := $(BUILD_SYSTEM)/target_executable.mk
# ###############################################################
# Include sub-configuration files
# ###############################################################
# This sets up most of the global variables that are specific to the
# user's build configuration.
include $(BUILD_SYSTEM)/envsetup.mk
# ###############################################################
# Generic tools
# ###############################################################
COLUMN := column
# It's called md5 on Mac OS and md5sum on Linux
ifeq ($(HOST_OS),darwin)
MD5SUM:=md5 -q
else
MD5SUM:=md5sum
endif

80
make/build/definitions.mk Normal file
View File

@ -0,0 +1,80 @@
# Common build system definitions. Mostly helpful shortcuts or
# functions, since we don't actually compile code here.
# The names of all packages in the system.
ALL_PACKAGES :=
###########################################################
## Debugging; prints a variable list to stdout
###########################################################
# $(1): variable name list, not variable values
define print-vars
$(foreach var,$(1), \
$(info $(var):) \
$(foreach word,$($(var)), \
$(info $(space)$(space)$(word)) \
) \
)
endef
###########################################################
## Retrieve the directory of the current makefile
## Must be called before including any other makefile!!
###########################################################
# Figure out where we are.
define my-dir
$(strip \
$(eval LOCAL_MODULE_MAKEFILE := $$(lastword $$(MAKEFILE_LIST))) \
$(if $(filter $(BUILD_SYSTEM)/% $(OUT_DIR)/%,$(LOCAL_MODULE_MAKEFILE)), \
$(error my-dir must be called before including any other makefile.) \
, \
$(patsubst %/,%,$(dir $(LOCAL_MODULE_MAKEFILE))) \
) \
)
endef
###########################################################
## Function we can evaluate to introduce a dynamic dependency
###########################################################
define add-dependency
$(1): $(2)
endef
###########################################################
## Run rot13 on a string
## $(1): the string. Must be one line.
###########################################################
define rot13
$(shell echo $(1) | tr 'a-zA-Z' 'n-za-mN-ZA-M')
endef
###########################################################
## Returns true if $(1) and $(2) are equal. Returns
## the empty string if they are not equal.
###########################################################
define streq
$(strip $(if $(strip $(1)),\
$(if $(strip $(2)),\
$(if $(filter-out __,_$(subst $(strip $(1)),,$(strip $(2)))$(subst $(strip $(2)),,$(strip $(1)))_),,true), \
),\
$(if $(strip $(2)),\
,\
true)\
))
endef
###########################################################
## TODO: Command for running 'make' to build an output
## TODO: Command for running ./configure to prepare a build
###########################################################

43
make/build/envsetup.mk Normal file
View File

@ -0,0 +1,43 @@
# ---------------------------------------------------------------
# Set up configuration for the host machine.
UNAME := $(shell uname -sm)
ifneq (,$(findstring Linux,$(UNAME)))
HOST_OS := linux
endif
ifneq (,$(findstring Darwin,$(UNAME)))
HOST_OS := darwin
endif
ifneq (,$(findstring Macintosh,$(UNAME)))
HOST_OS := darwin
endif
ifneq (,$(findstring CYGWIN,$(UNAME)))
HOST_OS := windows
endif
ifeq ($(HOST_OS),)
$(error Unable to determine HOST_OS from uname -sm: $(UNAME)!)
endif
ifneq (,$(findstring x86_64,$(UNAME)))
HOST_ARCH := x86_64
else
ifneq (,$(findstring x86,$(UNAME)))
$(error Building on a 32-bit x86 host is not supported: $(UNAME)!)
endif
endif
ifeq ($(HOST_ARCH),)
$(error Unable to determine HOST_ARCH from uname -sm: $(UNAME)!)
endif
# ---------------------------------------------------------------
# Figure out the output directory
ifeq (,$(strip $(OUT_DIR)))
OUT_DIR := $(TOPDIR)out
endif
# ---------------------------------------------------------------
# TODO: figure out the target output dir, etc...

76
make/build/main.mk Normal file
View File

@ -0,0 +1,76 @@
# Always use bash, not whatever is installed as /bin/sh
SHELL := /bin/bash
# Disable built-in suffix rules.
.SUFFIXES:
# Turn off the RCS / SCCS implicit rules of GNU Make
% : RCS/%,v
% : RCS/%
% : %,v
% : s.%
% : SCCS/s.%
# If a rule fails, delete $@.
.DELETE_ON_ERROR:
# Check for broken versions of make.
# (Allow any version under Cygwin since we don't actually build the platform there.)
ifneq (1,$(strip $(shell expr $(MAKE_VERSION) \>= 3.81)))
$(warning ********************************************************************************)
$(warning * You are using version $(MAKE_VERSION) of make.)
$(warning * Android can only be built by versions 3.81 and higher.)
$(warning * see https://source.android.com/source/download.html)
$(warning ********************************************************************************)
$(error stopping)
endif
# Absolute path of the present working direcotry.
# This overrides the shell variable $PWD, which does not necessarily point to
# the top of the source tree, for example when "make -C" is used.
PWD := $(shell pwd)
TOP := .
TOPDIR :=
# This is the default target. It must be the first declared target.
.PHONY: all
DEFAULT_GOAL := all
$(DEFAULT_GOAL):
# The path to the directory containing our build system's Makefiles.
BUILD_SYSTEM := $(TOPDIR)build
# Set up standard variables based on configuration.
include $(BUILD_SYSTEM)/config.mk
# Check the sanity of the build tools.
VERSION_CHECK_SEQUENCE_NUMBER := 5
-include $(OUT_DIR)/versions_checked.mk
ifneq ($(VERSION_CHECK_SEQUENCE_NUMBER),$(VERSIONS_CHECKED))
$(info Checking build tools versions...)
# Make sure that there are no spaces in the absolute path; the
# build system can't deal with them.
ifneq ($(words $(shell pwd)),1)
$(warning ************************************************************)
$(warning You are building in a directory whose absolute path contains)
$(warning a space character:)
$(warning $(space))
$(warning "$(shell pwd)")
$(warning $(space))
$(warning Please move your source tree to a path that does not contain)
$(warning any spaces.)
$(warning ************************************************************)
$(error Directory names containing spaces not supported)
endif
# Now that we've checked all our build tools, write the include file that we
# load next time.
$(shell echo 'VERSIONS_CHECKED := $(VERSION_CHECK_SEQUENCE_NUMBER)' \
> $(OUT_DIR)/versions_checked.mk)
endif
# Bring in standard build system definitions
include $(BUILD_SYSTEM)/definitions.mk

2
make/out/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
*
!.gitignore