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