diff --git a/.hgignore b/.hgignore index 9aab81ce35d..023de87e688 100644 --- a/.hgignore +++ b/.hgignore @@ -3,8 +3,7 @@ ^.idea/ nbproject/private/ ^webrev -^.hgtip -^.bridge2 +^.src-rev$ ^.jib/ .DS_Store .metadata/ diff --git a/make/CreateHgtipFiles.gmk b/make/CreateHgtipFiles.gmk deleted file mode 100644 index 61e7be17ac5..00000000000 --- a/make/CreateHgtipFiles.gmk +++ /dev/null @@ -1,55 +0,0 @@ -# -# Copyright (c) 2016, 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. -# - -default: all - -include $(SPEC) -include MakeBase.gmk - -define SetupCreateHgtip - - $$(strip $1)/$(HGTIP_FILENAME): FRC - $(HG) tip --repository $$(strip $1) --template '{node|short}\n' > $$@.tmp - if [ ! -f $$@ ] || [ "`$(CAT) $$@`" != "`$(CAT) $$@.tmp`" ]; then \ - $(MV) $$@.tmp $$@ ; \ - else \ - $(RM) $$@.tmp ; \ - fi - - TARGETS += $$(strip $1)/$(HGTIP_FILENAME) - -endef - -# Only try to create the tips if finding an actual hg repository. This will be -# false if building from a source bundle. -$(foreach r, $(call FindAllReposAbs), \ - $(if $(wildcard $r/.hg), $(eval $(call SetupCreateHgtip, $r))) \ -) - -all: $(TARGETS) - -FRC: - -.PHONY: all diff --git a/make/Images.gmk b/make/Images.gmk index f9bc0e243d6..bff0f5762a8 100644 --- a/make/Images.gmk +++ b/make/Images.gmk @@ -77,7 +77,7 @@ endef define create-info-file $(if $(JDK_ARCH_ABI_PROP_NAME), \ $(call info-file-item, "SUN_ARCH_ABI", "$(JDK_ARCH_ABI_PROP_NAME)")) - $(call info-file-item, "SOURCE", "$(strip $(ALL_SOURCE_TIPS))") + $(call info-file-item, "SOURCE", "$(strip $(SOURCE_REVISION))") endef # Param 1 - The file containing the MODULES list @@ -95,12 +95,12 @@ endef # Create a variable dependency file common for all release info files. INFO_FILE_VARDEPS := $(call DependOnVariable, create-info-file) -ALL_SOURCE_TIPS = $(shell \ - if [ -f $(SUPPORT_OUTPUTDIR)/source_tips ] ; then \ - $(CAT) $(SUPPORT_OUTPUTDIR)/source_tips ; \ +SOURCE_REVISION = $(shell \ + if [ -f $(SOURCE_REVISION_TRACKER) ] ; then \ + $(CAT) $(SOURCE_REVISION_TRACKER) ; \ fi) -$(BASE_RELEASE_FILE): $(INFO_FILE_VARDEPS) $(SUPPORT_OUTPUTDIR)/source_tips +$(BASE_RELEASE_FILE): $(INFO_FILE_VARDEPS) $(SOURCE_REVISION_TRACKER) $(info-file) ################################################################################ diff --git a/make/Main.gmk b/make/Main.gmk index 60c705d011d..d5d0802d70f 100644 --- a/make/Main.gmk +++ b/make/Main.gmk @@ -284,16 +284,11 @@ ALL_TARGETS += $(JMOD_TARGETS) ################################################################################ # Images targets -# Stores the tips for each repository. This file is be used when constructing -# the jdk image and can be used to track the exact sources used to build that -# image. -source-tips: $(SUPPORT_OUTPUTDIR)/source_tips -$(SUPPORT_OUTPUTDIR)/source_tips: FRC - $(call MakeDir, $(@D)) - $(call GetSourceTips) +store-source-revision: + +($(CD) $(SRC_ROOT)/make && $(MAKE) $(MAKE_ARGS) -f SourceRevision.gmk store-source-revision) -create-hgtip-files: - +($(CD) $(SRC_ROOT)/make && $(MAKE) $(MAKE_ARGS) -f CreateHgtipFiles.gmk) +create-source-revision-tracker: + +($(CD) $(SRC_ROOT)/make && $(MAKE) $(MAKE_ARGS) -f SourceRevision.gmk create-source-revision-tracker) BOOTCYCLE_TARGET := product-images bootcycle-images: @@ -332,7 +327,7 @@ mac-bundles-jdk: exploded-image-optimize: +($(CD) $(SRC_ROOT)/make && $(MAKE) $(MAKE_ARGS) -f ExplodedImageOptimize.gmk) -ALL_TARGETS += source-tips create-hgtip-files bootcycle-images zip-security \ +ALL_TARGETS += store-source-revision create-source-revision-tracker bootcycle-images zip-security \ zip-source jrtfs-jar jdk-image jre-image \ symbols-image profiles mac-bundles-jdk \ exploded-image-optimize @@ -684,10 +679,11 @@ else java.base-jmod jdk-image jre-image: generate-link-opt-data endif - jdk-image: jmods zip-source source-tips demos samples jrtfs-jar - jre-image: jmods source-tips jrtfs-jar + jdk-image: jmods zip-source create-source-revision-tracker demos samples \ + jrtfs-jar + jre-image: jmods create-source-revision-tracker jrtfs-jar - profiles: jmods zip-source source-tips jrtfs-jar + profiles: jmods zip-source create-source-revision-tracker jrtfs-jar mac-bundles-jdk: jdk-image jre-image diff --git a/make/SourceRevision.gmk b/make/SourceRevision.gmk new file mode 100644 index 00000000000..bcc5dd6aa57 --- /dev/null +++ b/make/SourceRevision.gmk @@ -0,0 +1,132 @@ +# +# Copyright (c) 2016, 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. +# + +default: all + +include $(SPEC) +include MakeBase.gmk + +################################################################################ +# Keep track of what source revision is used to create the build, by creating +# a tracker file in the output directory. This tracker file is included in the +# image, and can be used to recreate the source revision used. +# +# We're either building directly from a mercurial forest, and if so, use the +# current revision from mercurial. Otherwise, we are building from a source +# bundle. As a part of creating this source bundle, the current mercurial +# revisions of all repos will be stored in a file in the top dir, which is then +# used when creating the tracker file. + +STORED_SOURCE_REVISION := $(TOPDIR)/.src-rev + +# Are we using mercurial? +ifneq ($(and $(HG), $(wildcard $(TOPDIR)/.hg)), ) + + # Verify that the entire forest is consistent + $(foreach repo, $(call FindAllReposRel), \ + $(if $(wildcard $(TOPDIR)/$(repo)/.hg),, \ + $(error Inconsistent revision control: $(repo) is missing .hg directory)) \ + ) + + # Replace "." with "_top" and "/" with "-" + MakeFilenameFromRepo = \ + $(strip $(subst .,top, $(subst /,-, $1))) + + ################################################################################ + # SetupGetRevisionForRepo defines a make rule for creating a file containing + # the name of the repository and the output of "hg id" for that repository. + # Argument 1 is the relative path to the repository from the top dir. + # + SetupGetRevisionForRepo = $(NamedParamsMacroTemplate) + define SetupGetRevisionForRepoBody + $1_REPO_PATH := $$(TOPDIR)/$$(strip $1) + $1_FILENAME := $$(call MakeFilenameFromRepo, $1) + + $$(SUPPORT_OUTPUTDIR)/src-rev/$$($1_FILENAME): FRC + $(call MakeDir $$(@D)) + $(ECHO) $$(strip $1):`$(HG) id -i --repository $$($1_REPO_PATH)` > $$@ + + REPO_REVISIONS += $$(SUPPORT_OUTPUTDIR)/src-rev/$$($1_FILENAME) + endef + + # Setup rules for all repos. This makes sure all the "hg id" calls are made + # in parallel. + $(foreach repo, $(call FindAllReposRel), \ + $(eval $(call SetupGetRevisionForRepo, $(repo))) \ + ) + + # Create a complete source revision output file from all repos + # Param 1: The output file + define CreateSourceRevisionFile + $1: $$(REPO_REVISIONS) + $(call MakeDir $$(@D)) + $$(ECHO) `$$(CAT) $$(REPO_REVISIONS)` > $$@.tmp + if [ ! -f $$@ ] || [ "`$$(CAT) $$@`" != "`$$(CAT) $$@.tmp`" ]; then \ + $$(MV) $$@.tmp $$@ ; \ + else \ + $$(RM) $$@.tmp ; \ + fi + endef + + $(eval $(call CreateSourceRevisionFile, $(STORED_SOURCE_REVISION))) + + store-source-revision: $(STORED_SOURCE_REVISION) + + $(eval $(call CreateSourceRevisionFile, $(SOURCE_REVISION_TRACKER))) + + create-source-revision-tracker: $(SOURCE_REVISION_TRACKER) + +else + # Not using HG + + ifneq ($(wildcard $(STORED_SOURCE_REVISION)), ) + # We have a stored source revision (.src-rev) + + store-source-revision: + $(call LogWarn, Warning: No mercurial configuration present, not updating .src-rev) + + $(SOURCE_REVISION_TRACKER): $(STORED_SOURCE_REVISION) + $(install-file) + + create-source-revision-tracker: $(SOURCE_REVISION_TRACKER) + else + # We don't have a stored source revision. Can't do anything, really. + + store-source-revision: + $(call LogWarn, Error: No mercurial configuration present, cannot create .src-rev) + exit 2 + + create-source-revision-tracker: + $(call LogWarn, Error: No mercurial configuration present and no .src-rev) + exit 2 + endif + +endif + +all: store-source-revision create-source-revision-tracker + +FRC: # Force target + +.PHONY: all store-source-revision create-source-revision-tracker diff --git a/make/common/MakeBase.gmk b/make/common/MakeBase.gmk index 9c2a3f135d1..c1e5022567d 100644 --- a/make/common/MakeBase.gmk +++ b/make/common/MakeBase.gmk @@ -337,44 +337,21 @@ else # HAS_FILE_FUNCTION = false endif # HAS_FILE_FUNCTION ################################################################################ -# The source tips can come from the Mercurial repository, or in the files -# $(HGTIP_FILENAME) which contains the tip but is also positioned in the same -# directory as the original .hg directory. The hgtip files are created in -# CreateHgtipFiles.gmk. -HGTIP_FILENAME := .hgtip + +# A file containing a way to uniquely identify the source code revision that +# the build was created from +SOURCE_REVISION_TRACKER := $(SUPPORT_OUTPUTDIR)/src-rev/source-revision-tracker + +# Locate all hg repositories included in the forest, as absolute paths FindAllReposAbs = \ $(strip $(sort $(dir $(filter-out $(SRC_ROOT)/build/%, $(wildcard \ - $(addprefix $(SRC_ROOT)/, \ - .hg */.hg */*/.hg */*/.hg */*/*/.hg \ - .hgtip */.hgtip */*/.hgtip */*/.hgtip */*/*/.hgtip \ - ) \ + $(addprefix $(SRC_ROOT)/, .hg */.hg */*/.hg */*/*/.hg) \ ))))) +# Locate all hg repositories included in the forest, as relative paths FindAllReposRel = \ $(strip $(subst $(SRC_ROOT)/,.,$(patsubst $(SRC_ROOT)/%/, %, $(FindAllReposAbs)))) -# Emit the repo:tip pairs to $@, but only if they changed since last time -define GetSourceTips - $(CD) $(SRC_ROOT) ; \ - for i in $(FindAllReposRel) IGNORE ; do \ - if [ "$${i}" = "IGNORE" ] ; then \ - continue; \ - elif [ -d $${i}/.hg -a "$(HG)" != "" ] ; then \ - $(PRINTF) " %s:%s" \ - "$${i}" `$(HG) tip --repository $${i} --template '{node|short}\n'` ; \ - elif [ -f $${i}/$(HGTIP_FILENAME) ] ; then \ - $(PRINTF) " %s:%s" \ - "$${i}" `$(CAT) $${i}/$(HGTIP_FILENAME)` ; \ - fi; \ - done > $@.tmp - $(PRINTF) "\n" >> $@.tmp - if [ ! -f $@ ] || [ "`$(CAT) $@`" != "`$(CAT) $@.tmp`" ]; then \ - $(MV) $@.tmp $@ ; \ - else \ - $(RM) $@.tmp ; \ - fi -endef - ################################################################################ define SetupLogging