client.mk
author Chris Manchester <cmanchester@mozilla.com>
Tue, 16 Oct 2018 22:21:36 +0000
changeset 1728827 6dad1580bc3ea76a5239ef86a78e82745f197f5a
parent 1721034 47bcc150ba0b3f2e23209d7b9590799769eef1b3
child 1765446 a37366e331f47c99417e3935d919bab1de11c04e
child 1807905 62cdf398ef6848156294efbb640b9dc139d0847c
child 1807911 bf9d65b25697da65af52a8e87debc5b6ba962425
child 1992987 a362f74fcf08198964cbfe0e6d669a24f4ade239
child 2049650 d1e3d55f359c234b2b1d81030c104db880cbe015
child 2049719 2c0f9729d1fc0e350bb3b97fb83e1c49b75bee75
child 2180080 f82fecb1cd8a2a1627eccebbdc28c2560a2891bc
child 2376137 fabe04235f77bc06d3c7dc28e2c8eeeeba1dd53f
child 2385442 e3f5710970d2b97be7ad2a7b02be2f0a9ae673ca
child 2385843 a01de4009e4ecacd970be405d518faa6e2f053b1
child 2634829 334d5208acdd498b647b0dd7de65a3f2d54e2427
child 2634855 a68e07872584afa47086fdf93b7e1529ae56e205
child 2827440 1ef6a1e0d9c29fa4feeddab338e62994112d995e
permissions -rw-r--r--
Bug 1498031 - Merge code paths for running configure between Tup and Make based backends. r=firefox-build-system-reviewers,mshal This addresses a related issue along the way: a build that results in running configure would not update the value of self.config_environment (and therefore self.substs) as seen from the build driver, so out of date values would have been used. The changes to Makefile.in and client.mk made exploit the assumption that by he time anything in the Make build is running, config.status is up to date. Users running "make" without the benefit of "mach" will need to manually run configure when necessary in order to take this into account. Differential Revision: https://phabricator.services.mozilla.com/D8473

# -*- makefile -*-
# vim:set ts=8 sw=8 sts=8 noet:
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

# Defines main targets for driving the Firefox build system.
#
# This make file should not be invoked directly. Instead, use
# `mach` (likely `mach build`) for invoking the build system.
#
# Options:
#   MOZ_OBJDIR           - Destination object directory
#   MOZ_MAKE_FLAGS       - Flags to pass to $(MAKE)
#
#######################################################################
# Defines

ifdef MACH
ifndef NO_BUILDSTATUS_MESSAGES
define BUILDSTATUS
@echo 'BUILDSTATUS $1'

endef
endif
endif


CWD := $(CURDIR)

ifeq "$(CWD)" "/"
CWD   := /.
endif

PYTHON ?= $(shell which python2.7 > /dev/null 2>&1 && echo python2.7 || echo python)

####################################
# Load mozconfig Options

include $(OBJDIR)/.mozconfig-client-mk

ifdef MOZ_PARALLEL_BUILD
  MOZ_MAKE_FLAGS := $(filter-out -j%,$(MOZ_MAKE_FLAGS))
  MOZ_MAKE_FLAGS += -j$(MOZ_PARALLEL_BUILD)
endif

# Automatically add -jN to make flags if not defined. N defaults to number of cores.
ifeq (,$(findstring -j,$(MOZ_MAKE_FLAGS)))
  cores=$(shell $(PYTHON) -c 'import multiprocessing; print(multiprocessing.cpu_count())')
  MOZ_MAKE_FLAGS += -j$(cores)
endif

ifdef MOZ_AUTOMATION
ifeq (4.0,$(firstword $(sort 4.0 $(MAKE_VERSION))))
MOZ_MAKE_FLAGS += --output-sync=line
endif
endif

MOZ_MAKE = $(MAKE) $(MOZ_MAKE_FLAGS) -C $(OBJDIR)

# 'configure' scripts generated by autoconf.
CONFIGURES := $(TOPSRCDIR)/configure
CONFIGURES += $(TOPSRCDIR)/js/src/configure

#######################################################################
# Rules

# The default rule is build
build::

ifndef MACH
$(error client.mk must be used via `mach`. Try running \
`./mach $(firstword $(MAKECMDGOALS) $(.DEFAULT_GOAL))`)
endif

# In automation, manage an sccache daemon. The starting of the server
# needs to be in a make file so sccache inherits the jobserver.
ifdef MOZBUILD_MANAGE_SCCACHE_DAEMON
build::
	# Terminate any sccache server that might still be around.
	-$(MOZBUILD_MANAGE_SCCACHE_DAEMON) --stop-server > /dev/null 2>&1
	# Start a new server, ensuring it gets the jobserver file descriptors
	# from make (but don't use the + prefix when make -n is used, so that
	# the command doesn't run in that case)
	mkdir -p $(UPLOAD_PATH)
	$(if $(findstring n,$(filter-out --%, $(MAKEFLAGS))),,+)env RUST_LOG=sccache=debug SCCACHE_ERROR_LOG=$(UPLOAD_PATH)/sccache.log $(MOZBUILD_MANAGE_SCCACHE_DAEMON) --start-server
endif

####################################
# Configure

$(CONFIGURES): %: %.in
	@echo Generating $@
	cp -f $< $@
	chmod +x $@

CONFIGURE_ENV_ARGS += \
  MAKE='$(MAKE)' \
  $(NULL)

# configure uses the program name to determine @srcdir@. Calling it without
#   $(TOPSRCDIR) will set @srcdir@ to "."; otherwise, it is set to the full
#   path of $(TOPSRCDIR).
ifeq ($(TOPSRCDIR),$(OBJDIR))
  CONFIGURE = ./configure
else
  CONFIGURE = $(TOPSRCDIR)/configure
endif

configure:: $(CONFIGURES)
	$(call BUILDSTATUS,TIERS configure)
	$(call BUILDSTATUS,TIER_START configure)
	@echo cd $(OBJDIR);
	@echo $(CONFIGURE) $(CONFIGURE_ARGS)
	@cd $(OBJDIR) && $(CONFIGURE_ENV_ARGS) $(CONFIGURE) $(CONFIGURE_ARGS) \
	  || ( echo '*** Fix above errors and then restart with\
               "./mach build"' && exit 1 )
	@touch $(OBJDIR)/Makefile
	$(call BUILDSTATUS,TIER_FINISH configure)

####################################
# Build it

build::
	+$(MOZ_MAKE)

ifdef MOZ_AUTOMATION
build::
	+$(MOZ_MAKE) automation/build
endif

# This makefile doesn't support parallel execution. It does pass
# MOZ_MAKE_FLAGS to sub-make processes, so they will correctly execute
# in parallel.
.NOTPARALLEL:

.PHONY: \
    build \
    configure