1 #
  2 # Copyright (c) 2014, 2025, 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 include MakeFileStart.gmk
 27 
 28 ################################################################################
 29 
 30 include Modules.gmk
 31 include ZipArchive.gmk
 32 
 33 SRC_ZIP_WORK_DIR := $(SUPPORT_OUTPUTDIR)/src
 34 $(if $(filter $(TOPDIR)/%, $(SUPPORT_OUTPUTDIR)), $(eval SRC_ZIP_BASE := $(TOPDIR)), $(eval SRC_ZIP_BASE := $(SUPPORT_OUTPUTDIR)))
 35 
 36 ################################################################################
 37 # Create the directory structure for src.zip using symlinks.
 38 #   <module>/<package>/<file>.java
 39 # or:
 40 #   <module>/META-INF/preview/<package>/<file>.java
 41 # for preview enabled sources.
 42 #
 43 # Generate the src dirs in the first make invocation and then call this makefile
 44 # again to create src.zip.
 45 
 46 ALL_MODULES := $(FindAllModules)
 47 
 48 # Module source directories ($d) are things like (but not limited to):
 49 # - $TOPDIR/src/<module>/share/classes
 50 # - $SUPPORT_OUTPUTDIR/gensrc/<module>
 51 #
 52 # A symbolic link is created for each directory. For example:
 53 # - $TOPDIR/src/<module>/share/classes
 54 # is linked from:
 55 # - $SRC_ZIP_WORK_DIR/src/<module>/share/classes/<module>
 56 #
 57 # Each link has the form:
 58 # - $SRC_ZIP_WORK_DIR/<link-dir>/<module>
 59 # and always has the name of its module (even if the module already appears in <link-dir>.
 60 #
 61 # Then the contents of all link parent directories are given as ZIP includes:
 62 # - $SRC_ZIP_WORK_DIR/<link-dir>
 63 # results in ZIP file entries starting:
 64 # - <module>/...
 65 # where multiple source links/directories can contribute to the same module's sources.
 66 #
 67 $(foreach m, $(ALL_MODULES), \
 68   $(foreach d, $(call FindModuleSrcDirs, $m), \
 69     $(eval $d_TARGET := $(SRC_ZIP_WORK_DIR)/$(patsubst $(TOPDIR)/%,%,$(patsubst $(SUPPORT_OUTPUTDIR)/%,%,$d))/$m) \
 70     $(if $(SRC_GENERATED), , \
 71       $(eval $$($d_TARGET): $d ; \
 72           $$(if $(filter $(SRC_ZIP_BASE)/%, $d), $$(link-file-relative), $$(link-file-absolute)) \
 73       ) \
 74     ) \
 75     $(eval SRC_ZIP_SRCS += $$($d_TARGET)) \
 76     $(eval SRC_ZIP_SRCS_$m += $$($d_TARGET)) \
 77   ) \
 78 )
 79 
 80 # Preview source directories are currently limited to:
 81 # - $SUPPORT_OUTPUTDIR/gensrc-valueclasses/<module>
 82 # If this is changed, the 'patsubst' rewriting will need updating.
 83 #
 84 # The difficulty with this case is that we need to have a directory of the form:
 85 # - $SRC_ZIP_WORK_DIR/<link-dir>/<module>
 86 # containing (either directly or via symbolic linking) a `META-INF/preview`
 87 # subdirectory which then contains the sources.
 88 #
 89 # The easiest way to achieve this is to symbolically link:
 90 # - $SRC_ZIP_WORK_DIR/<link-dir>/<module>/META-INF/preview
 91 # and then use the parent directory:
 92 # - $SRC_ZIP_WORK_DIR/<link-dir>/<module>
 93 # as the actual target for the ZIP file generation. However, this requires
 94 # an extra rule to associate the symbolic link and the parent directory.
 95 #
 96 $(foreach m, $(ALL_MODULES), \
 97   $(foreach d, $(call FindModuleValueClassSrcDirs, $m), \
 98     $(eval $d_TARGET := $(SRC_ZIP_WORK_DIR)/$(patsubst $(SUPPORT_OUTPUTDIR)/%,%,$d)/$m) \
 99     $(if $(SRC_GENERATED), , \
100       $(eval $$($d_TARGET)/META-INF/preview: $d ; \
101           $$(if $(filter $(SRC_ZIP_BASE)/%, $d), $$(link-file-relative), $$(link-file-absolute)) \
102       ) \
103       $(eval $$($d_TARGET): $$($d_TARGET)/META-INF/preview) \
104     ) \
105     $(eval SRC_ZIP_SRCS += $$($d_TARGET)) \
106     $(eval SRC_ZIP_SRCS_$m += $$($d_TARGET)) \
107   ) \
108 )
109 
110 TARGETS += $(SRC_ZIP_SRCS)
111 
112 ################################################################################
113 # Only evaluate the creation of src.zip in a sub make call when the symlinked
114 # src directory structure has been generated.
115 ifeq ($(SRC_GENERATED), true)
116 
117   # Rewrite the EXCLUDE_TRANSLATIONS locales as exclude patters for java files
118   TRANSLATIONS_PATTERN := $(addprefix %_, $(addsuffix .java, $(EXCLUDE_TRANSLATIONS)))
119 
120   # Add excludes for translations for all modules except jdk.localedata
121   $(foreach s, $(SRC_ZIP_SRCS), \
122     $(if $(filter $(notdir $s), jdk.localedata), , \
123       $(eval BUILD_SRC_ZIP_EXCLUDE_PATTERNS_$(dir $s) := $$(TRANSLATIONS_PATTERN)) \
124     ) \
125   )
126 
127   $(eval $(call SetupZipArchive, BUILD_SRC_ZIP, \
128       SRC := $(dir $(SRC_ZIP_SRCS)), \
129       INCLUDES := $(SRC_ZIP_INCLUDES), \
130       INCLUDE_FILES := $(SRC_ZIP_INCLUDE_FILES), \
131       EXCLUDES := $(SRC_ZIP_EXCLUDES), \
132       EXCLUDE_FILES := $(SRC_ZIP_EXCLUDE_FILES), \
133       SUFFIXES := .java, \
134       ZIP := $(SUPPORT_OUTPUTDIR)/src.zip, \
135       FOLLOW_SYMLINKS := true, \
136   ))
137 
138   do-zip: $(BUILD_SRC_ZIP)
139 
140   .PHONY: do-zip
141 endif
142 
143 zip: $(SRC_ZIP_SRCS)
144 	+$(MAKE) $(MAKE_ARGS) -f ZipSource.gmk do-zip SRC_GENERATED=true
145 
146 TARGETS += zip
147 
148 .PHONY: zip
149 
150 ################################################################################
151 
152 include MakeFileEnd.gmk