Blame client.mk

Packit f0b94e
# -*- makefile -*-
Packit f0b94e
# vim:set ts=8 sw=8 sts=8 noet:
Packit f0b94e
# This Source Code Form is subject to the terms of the Mozilla Public
Packit f0b94e
# License, v. 2.0. If a copy of the MPL was not distributed with this
Packit f0b94e
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
Packit f0b94e
Packit f0b94e
# Defines main targets for driving the Firefox build system.
Packit f0b94e
#
Packit f0b94e
# This make file should not be invoked directly. Instead, use
Packit f0b94e
# `mach` (likely `mach build`) for invoking the build system.
Packit f0b94e
#
Packit f0b94e
# Options:
Packit f0b94e
#   MOZ_OBJDIR           - Destination object directory
Packit f0b94e
#   MOZ_MAKE_FLAGS       - Flags to pass to $(MAKE)
Packit f0b94e
#
Packit f0b94e
#######################################################################
Packit f0b94e
# Defines
Packit f0b94e
Packit f0b94e
ifdef MACH
Packit f0b94e
ifndef NO_BUILDSTATUS_MESSAGES
Packit f0b94e
define BUILDSTATUS
Packit f0b94e
@echo 'BUILDSTATUS $1'
Packit f0b94e
Packit f0b94e
endef
Packit f0b94e
endif
Packit f0b94e
endif
Packit f0b94e
Packit f0b94e
Packit f0b94e
CWD := $(CURDIR)
Packit f0b94e
Packit f0b94e
ifeq "$(CWD)" "/"
Packit f0b94e
CWD   := /.
Packit f0b94e
endif
Packit f0b94e
Packit f0b94e
PYTHON ?= $(shell which python2.7 > /dev/null 2>&1 && echo python2.7 || echo python)
Packit f0b94e
Packit f0b94e
####################################
Packit f0b94e
# Load mozconfig Options
Packit f0b94e
Packit f0b94e
include $(OBJDIR)/.mozconfig-client-mk
Packit f0b94e
Packit f0b94e
ifdef MOZ_PARALLEL_BUILD
Packit f0b94e
  MOZ_MAKE_FLAGS := $(filter-out -j%,$(MOZ_MAKE_FLAGS))
Packit f0b94e
  MOZ_MAKE_FLAGS += -j$(MOZ_PARALLEL_BUILD)
Packit f0b94e
endif
Packit f0b94e
Packit f0b94e
# Automatically add -jN to make flags if not defined. N defaults to number of cores.
Packit f0b94e
ifeq (,$(findstring -j,$(MOZ_MAKE_FLAGS)))
Packit f0b94e
  cores=$(shell $(PYTHON) -c 'import multiprocessing; print(multiprocessing.cpu_count())')
Packit f0b94e
  MOZ_MAKE_FLAGS += -j$(cores)
Packit f0b94e
endif
Packit f0b94e
Packit f0b94e
ifdef MOZ_AUTOMATION
Packit f0b94e
ifeq (4.0,$(firstword $(sort 4.0 $(MAKE_VERSION))))
Packit f0b94e
MOZ_MAKE_FLAGS += --output-sync=line
Packit f0b94e
endif
Packit f0b94e
endif
Packit f0b94e
Packit f0b94e
MOZ_MAKE = $(MAKE) $(MOZ_MAKE_FLAGS) -C $(OBJDIR)
Packit f0b94e
Packit f0b94e
# 'configure' scripts generated by autoconf.
Packit f0b94e
CONFIGURES := $(TOPSRCDIR)/configure
Packit f0b94e
CONFIGURES += $(TOPSRCDIR)/js/src/configure
Packit f0b94e
Packit f0b94e
#######################################################################
Packit f0b94e
# Rules
Packit f0b94e
Packit f0b94e
# The default rule is build
Packit f0b94e
build::
Packit f0b94e
Packit f0b94e
ifndef MACH
Packit f0b94e
$(error client.mk must be used via `mach`. Try running \
Packit f0b94e
`./mach $(firstword $(MAKECMDGOALS) $(.DEFAULT_GOAL))`)
Packit f0b94e
endif
Packit f0b94e
Packit f0b94e
# In automation, manage an sccache daemon. The starting of the server
Packit f0b94e
# needs to be in a make file so sccache inherits the jobserver.
Packit f0b94e
ifdef MOZBUILD_MANAGE_SCCACHE_DAEMON
Packit f0b94e
build::
Packit f0b94e
	# Terminate any sccache server that might still be around.
Packit f0b94e
	-$(MOZBUILD_MANAGE_SCCACHE_DAEMON) --stop-server > /dev/null 2>&1
Packit f0b94e
	# Start a new server, ensuring it gets the jobserver file descriptors
Packit f0b94e
	# from make (but don't use the + prefix when make -n is used, so that
Packit f0b94e
	# the command doesn't run in that case)
Packit f0b94e
	mkdir -p $(UPLOAD_PATH)
Packit f0b94e
	$(if $(findstring n,$(filter-out --%, $(MAKEFLAGS))),,+)env RUST_LOG=sccache=debug SCCACHE_ERROR_LOG=$(UPLOAD_PATH)/sccache.log $(MOZBUILD_MANAGE_SCCACHE_DAEMON) --start-server
Packit f0b94e
endif
Packit f0b94e
Packit f0b94e
####################################
Packit f0b94e
# Configure
Packit f0b94e
Packit f0b94e
MAKEFILE      = $(wildcard $(OBJDIR)/Makefile)
Packit f0b94e
CONFIG_STATUS = $(wildcard $(OBJDIR)/config.status)
Packit f0b94e
Packit f0b94e
EXTRA_CONFIG_DEPS := \
Packit f0b94e
  $(TOPSRCDIR)/aclocal.m4 \
Packit f0b94e
  $(TOPSRCDIR)/old-configure.in \
Packit f0b94e
  $(wildcard $(TOPSRCDIR)/build/autoconf/*.m4) \
Packit f0b94e
  $(TOPSRCDIR)/js/src/aclocal.m4 \
Packit f0b94e
  $(TOPSRCDIR)/js/src/old-configure.in \
Packit f0b94e
  $(NULL)
Packit f0b94e
Packit f0b94e
$(CONFIGURES): %: %.in $(EXTRA_CONFIG_DEPS)
Packit f0b94e
	@echo Generating $@
Packit f0b94e
	cp -f $< $@
Packit f0b94e
	chmod +x $@
Packit f0b94e
Packit f0b94e
CONFIG_STATUS_DEPS := \
Packit f0b94e
  $(wildcard $(TOPSRCDIR)/*/confvars.sh) \
Packit f0b94e
  $(CONFIGURES) \
Packit f0b94e
  $(TOPSRCDIR)/nsprpub/configure \
Packit f0b94e
  $(TOPSRCDIR)/config/milestone.txt \
Packit f0b94e
  $(TOPSRCDIR)/browser/config/version.txt \
Packit f0b94e
  $(TOPSRCDIR)/browser/config/version_display.txt \
Packit f0b94e
  $(TOPSRCDIR)/build/virtualenv_packages.txt \
Packit f0b94e
  $(TOPSRCDIR)/python/mozbuild/mozbuild/virtualenv.py \
Packit f0b94e
  $(TOPSRCDIR)/testing/mozbase/packages.txt \
Packit f0b94e
  $(OBJDIR)/.mozconfig.json \
Packit f0b94e
  $(NULL)
Packit f0b94e
Packit f0b94e
# Include a dep file emitted by configure to track Python files that
Packit f0b94e
# may influence the result of configure.
Packit f0b94e
-include $(OBJDIR)/configure.d
Packit f0b94e
Packit f0b94e
CONFIGURE_ENV_ARGS += \
Packit f0b94e
  MAKE='$(MAKE)' \
Packit f0b94e
  $(NULL)
Packit f0b94e
Packit f0b94e
# configure uses the program name to determine @srcdir@. Calling it without
Packit f0b94e
#   $(TOPSRCDIR) will set @srcdir@ to "."; otherwise, it is set to the full
Packit f0b94e
#   path of $(TOPSRCDIR).
Packit f0b94e
ifeq ($(TOPSRCDIR),$(OBJDIR))
Packit f0b94e
  CONFIGURE = ./configure
Packit f0b94e
else
Packit f0b94e
  CONFIGURE = $(TOPSRCDIR)/configure
Packit f0b94e
endif
Packit f0b94e
Packit f0b94e
configure-files: $(CONFIGURES)
Packit f0b94e
Packit f0b94e
configure-preqs = \
Packit f0b94e
  configure-files \
Packit f0b94e
  $(OBJDIR)/.mozconfig.json \
Packit f0b94e
  $(NULL)
Packit f0b94e
Packit f0b94e
configure:: $(configure-preqs)
Packit f0b94e
	$(call BUILDSTATUS,TIERS configure)
Packit f0b94e
	$(call BUILDSTATUS,TIER_START configure)
Packit f0b94e
	@echo cd $(OBJDIR);
Packit f0b94e
	@echo $(CONFIGURE) $(CONFIGURE_ARGS)
Packit f0b94e
	@cd $(OBJDIR) && $(CONFIGURE_ENV_ARGS) $(CONFIGURE) $(CONFIGURE_ARGS) \
Packit f0b94e
	  || ( echo '*** Fix above errors and then restart with\
Packit f0b94e
               "$(MAKE) -f client.mk build"' && exit 1 )
Packit f0b94e
	@touch $(OBJDIR)/Makefile
Packit f0b94e
	$(call BUILDSTATUS,TIER_FINISH configure)
Packit f0b94e
Packit f0b94e
ifneq (,$(MAKEFILE))
Packit f0b94e
$(OBJDIR)/Makefile: $(OBJDIR)/config.status
Packit f0b94e
Packit f0b94e
$(OBJDIR)/config.status: $(CONFIG_STATUS_DEPS)
Packit f0b94e
else
Packit f0b94e
$(OBJDIR)/Makefile: $(CONFIG_STATUS_DEPS)
Packit f0b94e
endif
Packit f0b94e
	@$(MAKE) -f $(TOPSRCDIR)/client.mk configure
Packit f0b94e
Packit f0b94e
####################################
Packit f0b94e
# Build it
Packit f0b94e
Packit f0b94e
build::  $(OBJDIR)/Makefile $(OBJDIR)/config.status
Packit f0b94e
	+$(MOZ_MAKE)
Packit f0b94e
Packit f0b94e
ifdef MOZ_AUTOMATION
Packit f0b94e
build::
Packit f0b94e
	+$(MOZ_MAKE) automation/build
Packit f0b94e
endif
Packit f0b94e
Packit f0b94e
# This makefile doesn't support parallel execution. It does pass
Packit f0b94e
# MOZ_MAKE_FLAGS to sub-make processes, so they will correctly execute
Packit f0b94e
# in parallel.
Packit f0b94e
.NOTPARALLEL:
Packit f0b94e
Packit f0b94e
.PHONY: \
Packit f0b94e
    build \
Packit f0b94e
    configure