|
| 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 |
0 commit comments