1 # 2 # Copyright (c) 2025, 2026, 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 MakeIncludeStart.gmk 27 ifeq ($(INCLUDE), true) 28 29 ################################################################################ 30 # This file defines macros that sets up rules for running the spp.Spp build tool 31 ################################################################################ 32 33 include Execute.gmk 34 include $(TOPDIR)/make/ToolsJdk.gmk 35 36 NON_BYTE_INTEGER_TYPES := char short int long 37 NON_BYTE_NUMBER_TYPES := $(NON_BYTE_INTEGER_TYPES) float double 38 NUMBER_TYPES := byte $(NON_BYTE_NUMBER_TYPES) 39 INTEGER_NUMBER_TYPES := byte $(NON_BYTE_INTEGER_TYPES) 40 PRIMITIVE_TYPES := boolean $(NUMBER_TYPES) 41 BITWISE_PRIMITIVE_TYPES := boolean $(INTEGER_NUMBER_TYPES) 42 43 ################################################################################ 44 # The Conv function converts a type given as first argument (as a normal Java 45 # native type name), into one of several corresponding strings, depending on 46 # the aspect given in the second argument 47 # 48 # The implementation dispatches the call to one of several Conv_<aspect> macros. 49 # 50 # arg $1: the type to convert 51 # arg $2: the aspect to convert for 52 # arg $3: byte order (only needed for certain aspects) 53 # 54 Conv = \ 55 $(strip $(call Conv_$(strip $2),$(strip $1),$(strip $3))) 56 57 ################################################################################ 58 # Conv_<aspect> implementations 59 60 # Return a single letter representing the type (lowercase first letter) 61 Conv_x = \ 62 $(call firstchar, $1) 63 64 # Return capitalized type name 65 Conv_Type = \ 66 $(call titlecase, $1) 67 68 # Return the full descriptive name of the type, e.g. int -> integer 69 Conv_fulltype = \ 70 $(if $(filter char, $1), \ 71 character, \ 72 $(if $(filter int, $1), \ 73 integer, \ 74 $1 \ 75 ) \ 76 ) 77 78 # Return the capitalized full descriptive name of the type, e.g. int -> Integer 79 Conv_Fulltype = \ 80 $(call titlecase, $(call Conv_fulltype, $1)) 81 82 # Return log2 bits per value (0-3) 83 Conv_LBPV = \ 84 $(if $(filter byte, $1), \ 85 0, \ 86 $(if $(filter char short, $1), \ 87 1, \ 88 $(if $(filter int float, $1), \ 89 2, \ 90 $(if $(filter long double, $1), \ 91 3)))) 92 93 # Return float or int category 94 Conv_category = \ 95 $(if $(filter float double, $1), \ 96 floatingPointType, \ 97 integralType \ 98 ) 99 100 # Return stream information for char 101 Conv_streams = \ 102 $(if $(filter char, $1), streamableType) 103 104 # Return stream type information for char 105 Conv_streamtype = \ 106 $(if $(filter char, $1), int) 107 108 # Return capitalized stream type information for char 109 Conv_Streamtype = \ 110 $(if $(filter char, $1), Int) 111 112 # Return article to use for type in English text 113 Conv_a = \ 114 $(if $(filter int, $1), an, a) 115 116 # Return capitalized article to use for type in English text 117 Conv_A = \ 118 $(if $(filter int, $1), An, A) 119 120 # Return integer type with same size as the type 121 Conv_memtype = \ 122 $(if $(filter float, $1), int, $(if $(filter double, $1), long, $1)) 123 124 # Return capitalized integer type with same size as the type 125 Conv_Memtype = \ 126 $(call titlecase, $(call Conv, $1, memtype)) 127 128 # Return capitalized full descriptive name for integer type with same size as the type 129 Conv_FullMemtype = \ 130 $(call Conv, $(call Conv, $1, memtype), Fulltype) 131 132 # Return Type or Memtype depending on byte order 133 # arg $2: BYTE_ORDER 134 Conv_Swaptype = \ 135 $(if $(filter U, $2), \ 136 $(call Conv, $1, Type), \ 137 $(call Conv, $1, Memtype)) 138 139 # Return fromBits method name for floating types, depending on byte order 140 # arg $2: BYTE_ORDER 141 Conv_fromBits = \ 142 $(if $(filter float double, $1), \ 143 $(if $(filter U, $2), , \ 144 $(call Conv, $1, Type).$(call Conv, $1, memtype)BitsTo$(call Conv, $1, Type))) 145 146 # Return toBits method name for floating types, depending on byte order 147 # arg $2: BYTE_ORDER 148 Conv_toBits = \ 149 $(if $(filter float double, $1), \ 150 $(if $(filter U, $2), , \ 151 $(call Conv, $1, Type).$1ToRaw$(call Conv, $(call Conv, $1, memtype), Type)Bits)) 152 153 # Return swap method name, depending on byte order 154 # arg $2: BYTE_ORDER 155 Conv_swap = \ 156 $(if $(filter S, $2), Bits.swap) 157 158 # Return word describing the number of bytes required by type 159 Conv_nbytes = \ 160 $(if $(filter 0, $(call Conv, $1, LBPV)), one, \ 161 $(if $(filter 1, $(call Conv, $1, LBPV)), two, \ 162 $(if $(filter 2, $(call Conv, $1, LBPV)), four, \ 163 $(if $(filter 3, $(call Conv, $1, LBPV)), eight)))) 164 165 # Return word describing the number of bytes required by type, minus one 166 Conv_nbytesButOne = \ 167 $(if $(filter 0, $(call Conv, $1, LBPV)), zero, \ 168 $(if $(filter 1, $(call Conv, $1, LBPV)), one, \ 169 $(if $(filter 2, $(call Conv, $1, LBPV)), three, \ 170 $(if $(filter 3, $(call Conv, $1, LBPV)), seven)))) 171 172 ################################################################################ 173 # Setup make rules that runs the spp.Spp build tool on an input file. 174 # 175 # Parameter 1 is the name of the rule. This name is used as variable prefix, 176 # and the targets generated are listed in a variable by that name. 177 # 178 # Remaining parameters are named arguments. These include: 179 # BEGIN_END Set to true to exclude everything outside #begin/#end (default: false) 180 # SUBST_EMPTY_LINES Set to false to not generate empty lines for removed lines (default: true) 181 # SOURCE_FILE The input file to process (required) 182 # OUTPUT_FILE The output file (required) 183 # INFO Override default message to print (optional) 184 # KEYS One or more keys to control the generation (optional) 185 # REPLACEMENTS one or more text replacement patterns, using the syntax: 186 # VAR=VALUE [VAR=VALUE] ... 187 # 188 SetupStreamPreProcessing = $(NamedParamsMacroTemplate) 189 define SetupStreamPreProcessingBody 190 # Verify arguments 191 ifeq ($$($1_SOURCE_FILE), ) 192 $$(error Must specify SOURCE_FILE (in $1)) 193 endif 194 ifeq ($$($1_OUTPUT_FILE), ) 195 $$(error Must specify OUTPUT_FILE (in $1)) 196 endif 197 198 $1_COMMAND_LINE := 199 ifeq ($$($1_BEGIN_END), true) 200 $1_COMMAND_LINE += -be 201 endif 202 203 ifeq ($$($1_SUBST_EMPTY_LINES), false) 204 $1_COMMAND_LINE += -nel 205 endif 206 207 $1_COMMAND_LINE += $$(foreach k, $$($1_KEYS), -K$$k) 208 $1_COMMAND_LINE += $$(subst $$$$(SPACE), ,$$(foreach d, $$($1_REPLACEMENTS), -D$$d)) 209 210 $1_COMMAND_LINE += -i$$($1_SOURCE_FILE) -o$$($1_OUTPUT_FILE).tmp 211 212 ifeq ($$($1_INFO), ) 213 $1_INFO := Preprocessing $$(notdir $$($1_SOURCE_FILE)) for $(MODULE) 214 endif 215 216 $$(eval $$(call SetupExecute, RUN_SPP_$1, \ 217 INFO := $$($1_INFO), \ 218 DEPS := $$($1_SOURCE_FILE) $$(BUILD_TOOLS_JDK), \ 219 OUTPUT_FILE := $$($1_OUTPUT_FILE), \ 220 COMMAND := $$(TOOL_SPP) $$($1_COMMAND_LINE), \ 221 PRE_COMMAND := $$(RM) $$($1_OUTPUT_FILE).tmp $$($1_OUTPUT_FILE), \ 222 POST_COMMAND := $$(MV) $$($1_OUTPUT_FILE).tmp $$($1_OUTPUT_FILE), \ 223 )) 224 225 $1 += $$(RUN_SPP_$1) 226 endef 227 228 ################################################################################ 229 230 endif # include guard 231 include MakeIncludeEnd.gmk --- EOF ---