1 #
   2 # Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
   3 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4 #
   5 # This code is free software; you can redistribute it and/or modify it
   6 # under the terms of the GNU General Public License version 2 only, as
   7 # published by the Free Software Foundation.  Oracle designates this
   8 # particular file as subject to the "Classpath" exception as provided
   9 # by Oracle in the LICENSE file that accompanied this code.
  10 #
  11 # This code is distributed in the hope that it will be useful, but WITHOUT
  12 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13 # FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14 # version 2 for more details (a copy is included in the LICENSE file that
  15 # accompanied this code).
  16 #
  17 # You should have received a copy of the GNU General Public License version
  18 # 2 along with this work; if not, write to the Free Software Foundation,
  19 # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20 #
  21 # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22 # or visit www.oracle.com if you need additional information or have any
  23 # questions.
  24 #
  25 
  26 default: all
  27 
  28 include $(SPEC)
  29 include MakeBase.gmk
  30 
  31 $(eval $(call IncludeCustomExtension, , SourceRevision.gmk))
  32 
  33 ################################################################################
  34 # Keep track of what source revision is used to create the build, by creating
  35 # a tracker file in the output directory. This tracker file is included in the
  36 # image, and can be used to recreate the source revision used.
  37 #
  38 # We're either building directly from a mercurial forest, and if so, use the
  39 # current revision from mercurial. Otherwise, we are building from a source
  40 # bundle. As a part of creating this source bundle, the current mercurial
  41 # revisions of all repos will be stored in a file in the top dir, which is then
  42 # used when creating the tracker file.
  43 
  44 STORED_SOURCE_REVISION := $(TOPDIR)/.src-rev
  45 
  46 # Are we using mercurial?
  47 ifneq ($(and $(HG), $(wildcard $(TOPDIR)/.hg)), )
  48 
  49   # Verify that the entire forest is consistent
  50   $(foreach repo, $(call FindAllReposRel), \
  51     $(if $(wildcard $(TOPDIR)/$(repo)/.hg),, \
  52         $(error Inconsistent revision control: $(repo) is missing .hg directory)) \
  53   )
  54 
  55   # Replace "." with "_top" and "/" with "-"
  56   MakeFilenameFromRepo = \
  57       $(strip $(subst .,top, $(subst /,-, $1)))
  58 
  59   ################################################################################
  60   # SetupGetRevisionForRepo defines a make rule for creating a file containing
  61   # the name of the repository and the output of "hg id" for that repository.
  62   # Argument 1 is the relative path to the repository from the top dir.
  63   #
  64   SetupGetRevisionForRepo = $(NamedParamsMacroTemplate)
  65   define SetupGetRevisionForRepoBody
  66     $1_REPO_PATH :=  $$(TOPDIR)/$$(strip $1)
  67     $1_FILENAME := $$(call MakeFilenameFromRepo, $1)
  68 
  69     $$(SUPPORT_OUTPUTDIR)/src-rev/$$($1_FILENAME): FRC
  70         $$(call MakeDir, $$(@D))
  71         $$(ECHO) $$(strip $1):`$$(HG) id -i --repository $$($1_REPO_PATH)` > $$@
  72 
  73     REPO_REVISIONS += $$(SUPPORT_OUTPUTDIR)/src-rev/$$($1_FILENAME)
  74   endef
  75 
  76   # Setup rules for all repos. This makes sure all the "hg id" calls are made
  77   # in parallel.
  78   $(foreach repo, $(call FindAllReposRel), \
  79     $(eval $(call SetupGetRevisionForRepo, $(repo))) \
  80   )
  81 
  82   # Create a complete source revision output file from all repos
  83   # Param 1: The output file
  84   define CreateSourceRevisionFile
  85     $1: $$(REPO_REVISIONS)
  86         $$(call MakeDir, $$(@D))
  87         $$(ECHO) `$$(CAT) $$(REPO_REVISIONS)` > $$@.tmp
  88         if [ ! -f $$@ ] || [ "`$$(CAT) $$@`" != "`$$(CAT) $$@.tmp`" ]; then \
  89           $$(MV) $$@.tmp $$@ ; \
  90         else \
  91           $$(RM) $$@.tmp ; \
  92         fi
  93   endef
  94 
  95   $(eval $(call CreateSourceRevisionFile, $(STORED_SOURCE_REVISION)))
  96 
  97   store-source-revision: $(STORED_SOURCE_REVISION)
  98 
  99   $(eval $(call CreateSourceRevisionFile, $(SOURCE_REVISION_TRACKER)))
 100 
 101   create-source-revision-tracker: $(SOURCE_REVISION_TRACKER)
 102 
 103 else
 104   # Not using HG
 105 
 106   ifneq ($(wildcard $(STORED_SOURCE_REVISION)), )
 107     # We have a stored source revision (.src-rev)
 108 
 109     store-source-revision:
 110         $(call LogInfo, No mercurial configuration present$(COMMA) not updating .src-rev)
 111 
 112     $(SOURCE_REVISION_TRACKER): $(STORED_SOURCE_REVISION)
 113         $(install-file)
 114 
 115     create-source-revision-tracker: $(SOURCE_REVISION_TRACKER)
 116   else
 117     # We don't have a stored source revision. Can't do anything, really.
 118 
 119     store-source-revision:
 120         $(call LogWarn, Error: No mercurial configuration present$(COMMA) cannot create .src-rev)
 121         exit 2
 122 
 123     create-source-revision-tracker:
 124         $(call LogWarn, Warning: No mercurial configuration present and no .src-rev)
 125   endif
 126 
 127 endif
 128 
 129 all: store-source-revision create-source-revision-tracker
 130 
 131 FRC: # Force target
 132 
 133 .PHONY: all store-source-revision create-source-revision-tracker