| # |
| # Copyright (c) 2012, 2025, Oracle and/or its affiliates. All rights reserved. |
| # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| # |
| # This code is free software; you can redistribute it and/or modify it |
| # under the terms of the GNU General Public License version 2 only, as |
| # published by the Free Software Foundation. Oracle designates this |
| # particular file as subject to the "Classpath" exception as provided |
| # by Oracle in the LICENSE file that accompanied this code. |
| # |
| # This code 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 |
| # version 2 for more details (a copy is included in the LICENSE file that |
| # accompanied this code). |
| # |
| # You should have received a copy of the GNU General Public License version |
| # 2 along with this work; if not, write to the Free Software Foundation, |
| # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| # |
| # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
| # or visit www.oracle.com if you need additional information or have any |
| # questions. |
| # |
| |
| include MakeFileStart.gmk |
| |
| ################################################################################ |
| # Init.gmk sits between PreInit.gmk and Main.gmk when bootstrapping the build. |
| # It is called from PreInit.gmk, and its main responsibility is to launch |
| # Main.gmk with the proper make and the proper make arguments. |
| # PreMain.gmk has provided us with a proper SPEC. This allows us to use the |
| # value of $(MAKE) for all further make calls. |
| ################################################################################ |
| |
| # Our helper functions. |
| include $(TOPDIR)/make/InitSupport.gmk |
| include LogUtils.gmk |
| |
| # Inclusion of this pseudo-target will cause make to execute this file |
| # serially, regardless of -j. |
| .NOTPARALLEL: |
| |
| # Parse COMPARE_BUILD (for makefile development) |
| $(eval $(call ParseCompareBuild)) |
| |
| # Setup reproducible build environment |
| $(eval $(call SetupReproducibleBuild)) |
| |
| # If no LOG= was given on command line, but we have a non-standard default |
| # value, use that instead and re-parse log level. |
| ifeq ($(LOG), ) |
| ifneq ($(DEFAULT_LOG), ) |
| override LOG := $(DEFAULT_LOG) |
| $(eval $(call ParseLogLevel)) |
| endif |
| endif |
| |
| ifeq ($(LOG_NOFILE), true) |
| # Disable build log if LOG=[level,]nofile was given |
| override BUILD_LOG_PIPE := |
| override BUILD_LOG_PIPE_SIMPLE := |
| endif |
| |
| ifeq ($(filter dist-clean, $(SEQUENTIAL_TARGETS)), dist-clean) |
| # We can't have a log file if we're about to remove it. |
| override BUILD_LOG_PIPE := |
| override BUILD_LOG_PIPE_SIMPLE := |
| endif |
| |
| ifeq ($(OUTPUT_SYNC_SUPPORTED), true) |
| OUTPUT_SYNC_FLAG := -O$(OUTPUT_SYNC) |
| endif |
| |
| ############################################################################## |
| # Init targets. These are handled fully, here and now. |
| ############################################################################## |
| |
| print-modules: |
| ( cd $(TOPDIR) && \ |
| $(MAKE) $(MAKE_ARGS) -j 1 -f make/Main.gmk $(USER_MAKE_VARS) \ |
| NO_RECIPES=true print-modules ) |
| |
| print-targets: |
| ( cd $(TOPDIR) && \ |
| $(MAKE) $(MAKE_ARGS) -j 1 -f make/Main.gmk $(USER_MAKE_VARS) \ |
| NO_RECIPES=true print-targets ) |
| |
| print-tests: |
| ( cd $(TOPDIR) && \ |
| $(MAKE) $(MAKE_ARGS) -j 1 -f make/Main.gmk $(USER_MAKE_VARS) \ |
| NO_RECIPES=true print-tests ) |
| |
| print-configuration: |
| $(ECHO) $(CONFIGURE_COMMAND_LINE) |
| |
| reconfigure: |
| ifneq ($(REAL_CONFIGURE_COMMAND_EXEC_FULL), ) |
| $(ECHO) "Re-running configure using original command line '$(REAL_CONFIGURE_COMMAND_EXEC_SHORT) $(REAL_CONFIGURE_COMMAND_LINE)'" |
| $(eval RECONFIGURE_COMMAND := $(REAL_CONFIGURE_COMMAND_EXEC_FULL) $(REAL_CONFIGURE_COMMAND_LINE)) |
| else ifneq ($(CONFIGURE_COMMAND_LINE), ) |
| $(ECHO) "Re-running configure using arguments '$(CONFIGURE_COMMAND_LINE)'" |
| $(eval RECONFIGURE_COMMAND := $(BASH) $(TOPDIR)/configure $(CONFIGURE_COMMAND_LINE)) |
| else |
| $(ECHO) "Re-running configure using default settings" |
| $(eval RECONFIGURE_COMMAND := $(BASH) $(TOPDIR)/configure) |
| endif |
| ( cd $(CONFIGURE_START_DIR) && PATH="$(ORIGINAL_PATH)" AUTOCONF="$(AUTOCONF)" \ |
| CUSTOM_ROOT="$(CUSTOM_ROOT)" \ |
| CUSTOM_CONFIG_DIR="$(CUSTOM_CONFIG_DIR)" \ |
| $(RECONFIGURE_COMMAND) ) |
| |
| # Create files that are needed to run most targets in Main.gmk |
| create-make-helpers: |
| ( cd $(TOPDIR) && \ |
| $(MAKE) $(MAKE_ARGS) -j 1 -f make/GenerateFindTests.gmk \ |
| $(USER_MAKE_VARS) ) |
| ( cd $(TOPDIR) && \ |
| $(MAKE) $(MAKE_ARGS) -j 1 -f make/Main.gmk $(USER_MAKE_VARS) \ |
| UPDATE_MODULE_DEPS=true NO_RECIPES=true \ |
| create-main-targets-include ) |
| |
| .PHONY: print-modules print-targets print-tests print-configuration \ |
| reconfigure create-make-helpers |
| |
| ############################################################################## |
| # The main target. This will delegate all other targets into Main.gmk. |
| ############################################################################## |
| |
| MAIN_TARGETS := $(SEQUENTIAL_TARGETS) $(PARALLEL_TARGETS) $(COMPARE_BUILD_MAKE) |
| # If building the default target, add what they are to the description. |
| DESCRIPTION_TARGETS := $(strip $(MAIN_TARGETS)) |
| ifeq ($(DESCRIPTION_TARGETS), default) |
| DESCRIPTION_TARGETS += ($(DEFAULT_MAKE_TARGET)) |
| endif |
| TARGET_DESCRIPTION := target$(if $(word 2, $(MAIN_TARGETS)),s) \ |
| '$(strip $(DESCRIPTION_TARGETS))' in configuration '$(CONF_NAME)' |
| |
| # MAKEOVERRIDES is automatically set and propagated by Make to sub-Make calls. |
| # We need to clear it of the init-specific variables. The user-specified |
| # variables are explicitly propagated using $(USER_MAKE_VARS). |
| main: MAKEOVERRIDES := |
| |
| main: $(INIT_TARGETS) create-make-helpers |
| ifneq ($(SEQUENTIAL_TARGETS)$(PARALLEL_TARGETS), ) |
| $(call RotateLogFiles) |
| $(ECHO) "Building $(TARGET_DESCRIPTION)" $(BUILD_LOG_PIPE_SIMPLE) |
| ifneq ($(SEQUENTIAL_TARGETS), ) |
| # Don't touch build output dir since we might be cleaning. That |
| # means no log pipe. |
| ( cd $(TOPDIR) && \ |
| $(MAKE) $(MAKE_ARGS) -j 1 -f make/Main.gmk $(USER_MAKE_VARS) \ |
| $(SEQUENTIAL_TARGETS) ) |
| # We might have cleaned away essential files, recreate them. |
| ( cd $(TOPDIR) && \ |
| $(MAKE) $(MAKE_ARGS) -j 1 -f make/Init.gmk create-make-helpers ) |
| endif |
| ifneq ($(PARALLEL_TARGETS), ) |
| $(call PrepareFailureLogs) |
| $(call StartGlobalTimer) |
| $(call PrepareJavacServer) |
| # JOBS will only be empty for a bootcycle-images recursive call |
| # or if specified via a make argument directly. In those cases |
| # treat it as NOT using jobs at all. |
| ( cd $(TOPDIR) && \ |
| $(NICE) $(MAKE) $(MAKE_ARGS) $(OUTPUT_SYNC_FLAG) \ |
| $(if $(JOBS), -j $(JOBS)) \ |
| -f make/Main.gmk $(USER_MAKE_VARS) \ |
| $(PARALLEL_TARGETS) $(COMPARE_BUILD_MAKE) $(BUILD_LOG_PIPE) || \ |
| ( exitcode=$$? && \ |
| $(ECHO) "" $(BUILD_LOG_PIPE_SIMPLE) && \ |
| $(ECHO) "ERROR: Build failed for $(TARGET_DESCRIPTION) (exit code $$exitcode)" \ |
| $(BUILD_LOG_PIPE_SIMPLE) && \ |
| cd $(TOPDIR) && $(MAKE) $(MAKE_ARGS) -j 1 -f make/Init.gmk \ |
| on-failure ; \ |
| exit $$exitcode ) ) |
| $(call CleanupJavacServer) |
| $(call StopGlobalTimer) |
| $(call ReportBuildTimes) |
| endif |
| if test -f $(MAKESUPPORT_OUTPUTDIR)/exit-with-error ; then \ |
| exit 1 ; \ |
| fi |
| $(ECHO) "Finished building $(TARGET_DESCRIPTION)" $(BUILD_LOG_PIPE_SIMPLE) |
| $(call ReportProfileTimes) |
| endif |
| |
| on-failure: |
| $(call CleanupJavacServer) |
| $(call StopGlobalTimer) |
| $(call ReportBuildTimes) |
| $(call PrintFailureReports) |
| $(call PrintBuildLogFailures) |
| $(call ReportProfileTimes) |
| $(ECHO) "HELP: Run 'make doctor' to diagnose build problems." |
| $(ECHO) "" |
| ifneq ($(COMPARE_BUILD), ) |
| $(call CleanupCompareBuild) |
| endif |
| |
| # Support targets for COMPARE_BUILD, used for makefile development |
| pre-compare-build: |
| $(call WaitForJavacServerFinish) |
| $(call PrepareCompareBuild) |
| |
| post-compare-build: |
| $(call WaitForJavacServerFinish) |
| $(call CleanupCompareBuild) |
| $(call CompareBuildDoComparison) |
| |
| .PHONY: main on-failure pre-compare-build post-compare-build |
| |
| ################################################################################ |
| |
| include MakeFileEnd.gmk |