1 #
   2 # Copyright (c) 2017, 2020, 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 ################################################################################
  27 # Initial bootstrapping, copied and stripped down from Makefile and Init.gmk
  28 ################################################################################
  29 
  30 # In Cygwin, the MAKE variable gets prepended with the current directory if the
  31 # make executable is called using a Windows mixed path (c:/cygwin/bin/make.exe).
  32 ifneq ($(findstring :, $(MAKE)), )
  33   export MAKE := $(patsubst $(CURDIR)%, %, $(patsubst $(CURDIR)/%, %, $(MAKE)))
  34 endif
  35 
  36 # Locate this Makefile
  37 ifeq ($(filter /%, $(lastword $(MAKEFILE_LIST))),)
  38   makefile_path := $(CURDIR)/$(strip $(lastword $(MAKEFILE_LIST)))
  39 else
  40   makefile_path := $(lastword $(MAKEFILE_LIST))
  41 endif
  42 TOPDIR := $(strip $(patsubst %/make/, %, $(dir $(makefile_path))))
  43 
  44 ################################################################################
  45 # Functions
  46 ################################################################################
  47 
  48 # Setup a required or optional variable, and/or check that it is properly
  49 # given.
  50 # Note: No spaces are allowed around the arguments.
  51 #
  52 # $1: The name of the variable
  53 # $2: The default value, if any, or OPTIONAL (do not provide a default but
  54 #     do not exit if it is missing)
  55 # $3: If NO_CHECK, disable checking for target file/directory existence
  56 #     If MKDIR, create the default directory
  57 define SetupVariable
  58   ifeq ($$($1), )
  59     ifeq ($2, )
  60       $$(info Error: Prebuilt variable $1 is missing, needed for run-tests-prebuilt)
  61       $$(error Cannot continue.)
  62     else ifeq ($2, OPTIONAL)
  63       ifneq ($$(findstring $$(LOG), info debug trace), )
  64         $$(info Prebuilt variable $1 is not provided)
  65       endif
  66     else
  67       ifneq ($$(findstring $$(LOG), info debug trace), )
  68         $$(info Prebuilt variable $1=$2 (default value))
  69       endif
  70       $1:=$2
  71     endif
  72   else
  73     ifneq ($$(findstring $$(LOG), info debug trace), )
  74       $$(info Prebuilt variable $1=$$($1))
  75     endif
  76   endif
  77   # If $1 has a value (is not optional), and $3 is not set (to NO_CHECK),
  78   # and if wildcard is empty, then complain that the file is missing.
  79   ifeq ($3, MKDIR)
  80     ifneq ($$(findstring $$(LOG), info debug trace), )
  81       $$(info Creating directory for $1)
  82     endif
  83     $$(shell mkdir -p $$($1))
  84   else ifneq ($3, NO_CHECK)
  85     ifeq ($$(strip $$(if $$($1), , OPTIONAL) $$(wildcard $$($1))), )
  86       $$(info Error: Prebuilt variable $1 points to missing file/directory:)
  87       $$(info '$$($1)')
  88       $$(error Cannot continue.)
  89     endif
  90   endif
  91 endef
  92 
  93 # Create an ephemeral spec file
  94 #
  95 # $1: The output file name
  96 # $2..$N: The lines to output to the file
  97 define CreateNewSpec
  98   $(if $(strip $(33)), \
  99     $(error Internal makefile error: \
 100       Too many arguments to macro, please update CreateNewSpec in RunTestsPrebuilt.gmk) \
 101   ) \
 102   $(shell $(RM) $1) \
 103   $(foreach i, $(call sequence, 2, 32), \
 104     $(if $(strip $($i)), \
 105       $(call AppendFile, $(strip $($i)), $1) \
 106     ) \
 107   )
 108 endef
 109 
 110 ################################################################################
 111 # Check input and setup basic buildsystem support
 112 ################################################################################
 113 
 114 # Verify that user has given correct additional input.
 115 
 116 # These variables are absolutely necessary
 117 $(eval $(call SetupVariable,OUTPUTDIR,$(TOPDIR)/build/run-test-prebuilt,MKDIR))
 118 $(eval $(call SetupVariable,BOOT_JDK))
 119 $(eval $(call SetupVariable,JT_HOME))
 120 
 121 # These can have default values based on the ones above
 122 $(eval $(call SetupVariable,JDK_IMAGE_DIR,$(OUTPUTDIR)/images/jdk))
 123 $(eval $(call SetupVariable,TEST_IMAGE_DIR,$(OUTPUTDIR)/images/test))
 124 $(eval $(call SetupVariable,SYMBOLS_IMAGE_DIR,$(OUTPUTDIR)/images/symbols,NO_CHECK))
 125 
 126 # Provide default values for tools that we need
 127 $(eval $(call SetupVariable,MAKE,make,NO_CHECK))
 128 $(eval $(call SetupVariable,BASH,bash,NO_CHECK))
 129 
 130 # Check optional variables
 131 $(eval $(call SetupVariable,JIB_JAR,OPTIONAL))
 132 
 133 # Now that we have verified that we have the required variables available, we
 134 # can include the prebuilt spec file ourselves, without an ephemeral spec
 135 # wrapper. This is required so we can include MakeBase which is needed for
 136 # CreateNewSpec.
 137 HAS_SPEC :=
 138 include $(TOPDIR)/make/InitSupport.gmk
 139 
 140 $(eval $(call CheckDeprecatedEnvironment))
 141 $(eval $(call CheckInvalidMakeFlags))
 142 $(eval $(call ParseLogLevel))
 143 
 144 SPEC := $(TOPDIR)/make/RunTestsPrebuiltSpec.gmk
 145 include $(SPEC)
 146 include $(TOPDIR)/make/common/MakeBase.gmk
 147 
 148 ################################################################################
 149 # Determine what platform we're running on
 150 ################################################################################
 151 UNAME := uname
 152 
 153 # Get OS name from uname (Cygwin inexplicably adds _NT-x.x)
 154 UNAME_OS := $(shell $(UNAME) -s | $(CUT) -f1 -d_)
 155 
 156 ifeq ($(UNAME_OS), CYGWIN)
 157   OPENJDK_TARGET_OS := windows
 158   OPENJDK_TARGET_OS_TYPE := windows
 159   OPENJDK_TARGET_OS_ENV := windows.cygwin
 160 else
 161   OPENJDK_TARGET_OS_TYPE:=unix
 162   ifeq ($(UNAME_OS), Linux)
 163     OPENJDK_TARGET_OS := linux
 164   else ifeq ($(UNAME_OS), Darwin)
 165     OPENJDK_TARGET_OS := macosx
 166   else
 167     OPENJDK_TARGET_OS := $(UNAME_OS)
 168   endif
 169   OPENJDK_TARGET_OS_ENV := $(OPENJDK_TARGET_OS)
 170 endif
 171 
 172 # Assume little endian unless otherwise specified
 173 OPENJDK_TARGET_CPU_ENDIAN := little
 174 
 175 UNAME_CPU := $(shell $(UNAME) -m)
 176 ifeq ($(UNAME_CPU), i686)
 177   OPENJDK_TARGET_CPU := x86
 178   OPENJDK_TARGET_CPU_BITS := 32
 179 else
 180   # Assume all others are 64-bit. We use the same CPU name as uname for
 181   # at least x86_64 and aarch64.
 182   OPENJDK_TARGET_CPU := $(UNAME_CPU)
 183   OPENJDK_TARGET_CPU_BITS := 64
 184 endif
 185 
 186 OPENJDK_TARGET_CPU_ARCH := $(OPENJDK_TARGET_CPU)
 187 ifeq ($(OPENJDK_TARGET_CPU), x86_64)
 188   OPENJDK_TARGET_CPU_ARCH := x86
 189 endif
 190 
 191 ifeq ($(OPENJDK_TARGET_OS), windows)
 192   ifeq ($(wildcard $(TEST_IMAGE_DIR)/bin/fixpath.exe), )
 193     $(info Error: fixpath is missing from test image '$(TEST_IMAGE_DIR)')
 194     $(error Cannot continue.)
 195   endif
 196   FIXPATH := $(TEST_IMAGE_DIR)/bin/fixpath.exe -c
 197   PATH_SEP:=;
 198 else
 199   FIXPATH :=
 200   PATH_SEP:=:
 201 endif
 202 
 203 # Check number of cores and memory in MB
 204 ifeq ($(OPENJDK_TARGET_OS), linux)
 205   NUM_CORES := $(shell $(CAT) /proc/cpuinfo  | $(GREP) -c processor)
 206   MEMORY_SIZE := $(shell \
 207       $(EXPR) `$(CAT) /proc/meminfo | $(GREP) MemTotal | $(AWK) '{print $$2}'` / 1024 \
 208   )
 209 else ifeq ($(OPENJDK_TARGET_OS), macosx)
 210   NUM_CORES := $(shell /usr/sbin/sysctl -n hw.ncpu)
 211   MEMORY_SIZE := $(shell $(EXPR) `/usr/sbin/sysctl -n hw.memsize` / 1024 / 1024)
 212 else ifeq ($(OPENJDK_TARGET_OS), windows)
 213   NUM_CORES := $(NUMBER_OF_PROCESSORS)
 214   MEMORY_SIZE := $(shell \
 215       $(EXPR) `wmic computersystem get totalphysicalmemory -value \
 216           | $(GREP) = | $(SED) 's/\\r//g' \
 217           | $(CUT) -d "=" -f 2-` / 1024 / 1024 \
 218   )
 219 endif
 220 ifeq ($(NUM_CORES), )
 221   $(warn Could not find number of CPUs, assuming 1)
 222   NUM_CORES := 1
 223 endif
 224 ifeq ($(MEMORY_SIZE), )
 225   $(warn Could not find memory size, assuming 1024 MB)
 226   MEMORY_SIZE := 1024
 227 endif
 228 
 229 # Setup LD for AOT support
 230 ifneq ($(DEVKIT_HOME), )
 231   ifeq ($(OPENJDK_TARGET_OS), windows)
 232     LD_JAOTC := $(DEVKIT_HOME)/VC/bin/x64/link.exe
 233     LIBRARY_PREFIX :=
 234     SHARED_LIBRARY_SUFFIX := .dll
 235   else ifeq ($(OPENJDK_TARGET_OS), linux)
 236     LD_JAOTC := $(DEVKIT_HOME)/bin/ld
 237     LIBRARY_PREFIX := lib
 238     SHARED_LIBRARY_SUFFIX := .so
 239   else ifeq ($(OPENJDK_TARGET_OS), macosx)
 240     LD_JAOTC := $(DEVKIT_HOME)/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld
 241     LIBRARY_PREFIX := lib
 242     SHARED_LIBRARY_SUFFIX := .dylib
 243   endif
 244 else
 245   LD := ld
 246 endif
 247 
 248 ifneq ($(wildcard $(JDK_IMAGE_DIR)/template.xml), )
 249   TEST_OPTS_JCOV := true
 250   JCOV_IMAGE_DIR := $(JDK_IMAGE_DIR)
 251 else
 252   TEST_OPTS_JCOV := false
 253   JCOV_IMAGE_DIR :=
 254 endif
 255 
 256 ################################################################################
 257 # Generate the ephemeral spec file
 258 ################################################################################
 259 
 260 # Now we can include additional custom support.
 261 # This might define CUSTOM_NEW_SPEC_LINE
 262 ifneq ($(CUSTOM_MAKE_DIR), )
 263   include $(CUSTOM_MAKE_DIR)/RunTestsPrebuilt.gmk
 264 endif
 265 
 266 NEW_SPEC := $(OUTPUTDIR)/run-test-spec.gmk
 267 
 268 $(call CreateNewSpec, $(NEW_SPEC), \
 269     # Generated file -- do not edit!, \
 270     SPEC := $(NEW_SPEC), \
 271     TOPDIR := $(TOPDIR), \
 272     OUTPUTDIR := $(OUTPUTDIR), \
 273     BOOT_JDK := $(BOOT_JDK), \
 274     JT_HOME := $(JT_HOME), \
 275     JDK_IMAGE_DIR := $(JDK_IMAGE_DIR), \
 276     JCOV_IMAGE_DIR := $(JCOV_IMAGE_DIR), \
 277     TEST_IMAGE_DIR := $(TEST_IMAGE_DIR), \
 278     SYMBOLS_IMAGE_DIR := $(SYMBOLS_IMAGE_DIR), \
 279     MAKE := $(MAKE), \
 280     BASH := $(BASH), \
 281     JIB_JAR := $(JIB_JAR), \
 282     FIXPATH := $(FIXPATH), \
 283     PATH_SEP := $(PATH_SEP), \
 284     OPENJDK_TARGET_OS := $(OPENJDK_TARGET_OS), \
 285     OPENJDK_TARGET_OS_TYPE := $(OPENJDK_TARGET_OS_TYPE), \
 286     OPENJDK_TARGET_OS_ENV := $(OPENJDK_TARGET_OS_ENV), \
 287     OPENJDK_TARGET_CPU := $(OPENJDK_TARGET_CPU), \
 288     OPENJDK_TARGET_CPU_ARCH := $(OPENJDK_TARGET_CPU_ARCH), \
 289     OPENJDK_TARGET_CPU_BITS := $(OPENJDK_TARGET_CPU_BITS), \
 290     OPENJDK_TARGET_CPU_ENDIAN := $(OPENJDK_TARGET_CPU_ENDIAN), \
 291     NUM_CORES := $(NUM_CORES), \
 292     MEMORY_SIZE := $(MEMORY_SIZE), \
 293     LD_JAOTC := $(LD_JAOTC), \
 294     LIBRARY_PREFIX := $(LIBRARY_PREFIX), \
 295     SHARED_LIBRARY_SUFFIX := $(SHARED_LIBRARY_SUFFIX), \
 296     include $(TOPDIR)/make/RunTestsPrebuiltSpec.gmk, \
 297     TEST_OPTS_JCOV := $(TEST_OPTS_JCOV), \
 298     $(CUSTOM_NEW_SPEC_LINE), \
 299 )
 300 
 301 ################################################################################
 302 # The run-test-prebuilt target
 303 ################################################################################
 304 
 305 SPEC := $(NEW_SPEC)
 306 
 307 default: all
 308 
 309 test-prebuilt:
 310         # Need to make sure the failure logs output dir exists since
 311         # ExecuteWithLog is called in RunTests.gmk. The PrepareFailureLogs macro
 312         # is unfortunately not available at this point.
 313         $(call MakeDir, $(MAKESUPPORT_OUTPUTDIR)/failure-logs)
 314         @$(RM) -f $(MAKESUPPORT_OUTPUTDIR)/exit-with-error
 315         # The lazy initialization of the cache file in FindTests.gmk does not
 316         # always work with RunTests.gmk. To guarantee that the jtreg test groups
 317         # are always found and parsed, call FindTests.gmk stand alone once
 318         # before calling RunTests.gmk.
 319         @cd $(TOPDIR) && $(MAKE) $(MAKE_ARGS) -f make/common/FindTests.gmk \
 320             SPEC=$(SPEC) FINDTESTS_STAND_ALONE=true
 321         @cd $(TOPDIR) && $(MAKE) $(MAKE_ARGS) -f make/RunTests.gmk run-test \
 322             TEST="$(TEST)"
 323 
 324 all: test-prebuilt
 325 
 326 .PHONY: default all test-prebuilt