8288396: Always create reproducible builds

Reviewed-by: amenkov, ehelin
This commit is contained in:
Magnus Ihse Bursie 2022-06-28 09:00:45 +00:00
parent 33369719b2
commit b4ab5fe1da
18 changed files with 58 additions and 144 deletions

View File

@ -1,5 +1,5 @@
#
# Copyright (c) 2014, 2021, Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 2014, 2022, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@ -226,13 +226,6 @@ else
JMOD_FLAGS += --exclude '**{_the.*,_*.marker*,*.diz,*.debuginfo,*.dSYM/**,*.dSYM}'
endif
# For reproducible builds specify the jmod --date using SOURCE_DATE in ISO-8601
ifeq ($(ENABLE_REPRODUCIBLE_BUILD), true)
JMOD_SOURCE_DATE := --date $(SOURCE_DATE_ISO_8601)
else
JMOD_SOURCE_DATE :=
endif
# Create jmods in the support dir and then move them into place to keep the
# module path in $(IMAGES_OUTPUTDIR)/jmods valid at all times.
$(eval $(call SetupExecute, create_$(JMOD_FILE), \
@ -244,7 +237,7 @@ $(eval $(call SetupExecute, create_$(JMOD_FILE), \
COMMAND := $(JMOD) create --module-version $(VERSION_SHORT) \
--target-platform '$(OPENJDK_MODULE_TARGET_PLATFORM)' \
--module-path $(JMODS_DIR) $(JMOD_FLAGS) \
$(JMOD_SOURCE_DATE) \
--date $(SOURCE_DATE_ISO_8601) \
$(JMODS_SUPPORT_DIR)/$(JMOD_FILE), \
POST_COMMAND := $(MV) $(JMODS_SUPPORT_DIR)/$(JMOD_FILE) $(JMODS_DIR)/$(JMOD_FILE), \
))

View File

@ -1,6 +1,6 @@
#!/bin/bash
#
# Copyright (c) 2012, 2020, Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 2012, 2022, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@ -92,7 +92,6 @@ if [ "$OPENJDK_TARGET_OS" = "windows" ]; then
export PATH="$PATH:@TOOLCHAIN_PATH@"
fi
export HOTSPOT_BUILD_TIME="@HOTSPOT_BUILD_TIME@"
export USE_PRECOMPILED_HEADER="@USE_PRECOMPILED_HEADER@"
# Now locate the main script and run it.

View File

@ -786,10 +786,8 @@ AC_DEFUN([FLAGS_SETUP_CFLAGS_CPU_DEP],
$1_TOOLCHAIN_CFLAGS="${NO_DELETE_NULL_POINTER_CHECKS_CFLAG}"
fi
if test "x$TOOLCHAIN_TYPE" = xmicrosoft && test "x$ENABLE_REPRODUCIBLE_BUILD" = xtrue; then
# Enabling deterministic creates warnings if __DATE__ or __TIME__ are
# used, and since we are, silence that warning.
REPRODUCIBLE_CFLAGS="-experimental:deterministic -wd5048"
if test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
REPRODUCIBLE_CFLAGS="-experimental:deterministic"
FLAGS_COMPILER_CHECK_ARGUMENTS(ARGUMENT: [${REPRODUCIBLE_CFLAGS}],
PREFIX: $3,
IF_FALSE: [
@ -816,8 +814,7 @@ AC_DEFUN([FLAGS_SETUP_CFLAGS_CPU_DEP],
FILE_MACRO_CFLAGS=
]
)
elif test "x$TOOLCHAIN_TYPE" = xmicrosoft &&
test "x$ENABLE_REPRODUCIBLE_BUILD" = xtrue; then
elif test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
# There is a known issue with the pathmap if the mapping is made to the
# empty string. Add a minimal string "s" as prefix to work around this.
# PATHMAP_FLAGS is also added to LDFLAGS in flags-ldflags.m4.

View File

@ -128,10 +128,13 @@ AC_DEFUN([FLAGS_SETUP_LDFLAGS_HELPER],
fi
fi
if test "x$ENABLE_REPRODUCIBLE_BUILD" = "xtrue"; then
if test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
REPRODUCIBLE_LDFLAGS="-experimental:deterministic"
fi
FLAGS_LINKER_CHECK_ARGUMENTS(ARGUMENT: [$REPRODUCIBLE_LDFLAGS],
IF_FALSE: [
REPRODUCIBLE_LDFLAGS=
]
)
fi
if test "x$ALLOW_ABSOLUTE_PATHS_IN_OUTPUT" = "xfalse"; then

View File

@ -713,30 +713,9 @@ AC_DEFUN_ONCE([JDKOPT_SETUP_REPRODUCIBLE_BUILD],
fi
fi
REPRODUCIBLE_BUILD_DEFAULT=$with_source_date_present
if test "x$OPENJDK_BUILD_OS" = xwindows && \
test "x$ALLOW_ABSOLUTE_PATHS_IN_OUTPUT" = xfalse; then
# To support banning absolute paths on Windows, we must use the -pathmap
# method, which requires reproducible builds.
REPRODUCIBLE_BUILD_DEFAULT=true
fi
UTIL_ARG_ENABLE(NAME: reproducible-build, DEFAULT: $REPRODUCIBLE_BUILD_DEFAULT,
RESULT: ENABLE_REPRODUCIBLE_BUILD,
DESC: [enable reproducible builds (not yet fully functional)],
DEFAULT_DESC: [enabled if --with-source-date is given or on Windows without absolute paths])
if test "x$OPENJDK_BUILD_OS" = xwindows && \
test "x$ALLOW_ABSOLUTE_PATHS_IN_OUTPUT" = xfalse && \
test "x$ENABLE_REPRODUCIBLE_BUILD" = xfalse; then
AC_MSG_NOTICE([On Windows it is not possible to combine --disable-reproducible-build])
AC_MSG_NOTICE([with --disable-absolute-paths-in-output.])
AC_MSG_ERROR([Cannot continue])
fi
AC_SUBST(SOURCE_DATE)
AC_SUBST(ENABLE_REPRODUCIBLE_BUILD)
AC_SUBST(ISO_8601_FORMAT_STRING)
AC_SUBST(SOURCE_DATE_ISO_8601)
UTIL_DEPRECATED_ARG_ENABLE(reproducible-build)
])

View File

@ -129,7 +129,6 @@ RELEASE_FILE_OS_ARCH:=@RELEASE_FILE_OS_ARCH@
RELEASE_FILE_LIBC:=@RELEASE_FILE_LIBC@
SOURCE_DATE := @SOURCE_DATE@
ENABLE_REPRODUCIBLE_BUILD := @ENABLE_REPRODUCIBLE_BUILD@
ISO_8601_FORMAT_STRING := @ISO_8601_FORMAT_STRING@
ifneq ($(SOURCE_DATE), updated)

View File

@ -223,11 +223,9 @@ define SetupJarArchiveBody
# If reproducible build and the boot jdk jar supports --date option
# then specify the --date using SOURCE_DATE in ISO-8601
$1_JAR_OPTIONS :=
ifeq ($$(ENABLE_REPRODUCIBLE_BUILD), true)
ifeq ($$(BOOT_JDK_JAR_SUPPORTS_DATE), true)
$1_JAR_OPTIONS += --date $(SOURCE_DATE_ISO_8601)
endif
endif
ifneq (,$$($1_CHECK_COMPRESS_JAR))
ifneq ($(COMPRESS_JARS), true)
$1_JAR_OPTIONS += --no-compress

View File

@ -406,10 +406,8 @@ define SetupCompileNativeFileBody
# For reproducible builds with gcc and clang ensure random symbol generation is
# seeded deterministically
ifneq ($(findstring $(TOOLCHAIN_TYPE), gcc clang), )
ifeq ($$(ENABLE_REPRODUCIBLE_BUILD), true)
$1_COMPILE_OPTIONS += -frandom-seed="$$($1_FILENAME)"
endif
endif
$$($1_OBJ_JSON): $$($1_OBJ_DEPS)
$$(call WriteCompileCommandsFragment, $$@, $$(PWD), $$($1_SRC_FILE), \

View File

@ -1,5 +1,5 @@
#
# Copyright (c) 2011, 2021, Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 2011, 2022, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@ -54,7 +54,7 @@ endif
# FOLLOW_SYMLINKS - Set to explicitly follow symlinks. Affects performance of
# finding files.
# ZIP_OPTIONS extra options to pass to zip
# REPRODUCIBLE override ENABLE_REPRODUCIBLE_BUILD (to make zip reproducible or not)
# REPRODUCIBLE set to false to disable the step that makes zip reproducible
SetupZipArchive = $(NamedParamsMacroTemplate)
define SetupZipArchiveBody
@ -130,7 +130,7 @@ define SetupZipArchiveBody
)
ifeq ($$($1_REPRODUCIBLE), )
$1_REPRODUCIBLE := $$(ENABLE_REPRODUCIBLE_BUILD)
$1_REPRODUCIBLE := true
endif
# Use a slightly shorter name for logging, but with enough path to identify this zip.

View File

@ -66,6 +66,10 @@ ifeq ($(VERSION_BUILD), )
VERSION_BUILD := 0
endif
ifeq ($(HOTSPOT_BUILD_TIME), )
HOTSPOT_BUILD_TIME := $(call EpochToISO8601, $(shell $(DATE) +"%s"))
endif
CFLAGS_VM_VERSION := \
$(VERSION_CFLAGS) \
-DHOTSPOT_VERSION_STRING='"$(VERSION_STRING)"' \
@ -73,12 +77,9 @@ CFLAGS_VM_VERSION := \
-DHOTSPOT_BUILD_USER='"$(USERNAME)"' \
-DHOTSPOT_VM_DISTRO='"$(HOTSPOT_VM_DISTRO)"' \
-DCPU='"$(OPENJDK_TARGET_CPU_VM_VERSION)"' \
-DHOTSPOT_BUILD_TIME='"$(HOTSPOT_BUILD_TIME)"' \
#
ifneq ($(HOTSPOT_BUILD_TIME), )
CFLAGS_VM_VERSION += -DHOTSPOT_BUILD_TIME='"$(HOTSPOT_BUILD_TIME)"'
endif
################################################################################
# Disabled warnings

View File

@ -29,16 +29,10 @@ include LibCommon.gmk
ifeq ($(call isTargetOs, windows), true)
CFLAGS_LIBDT_SHMEM := $(CFLAGS_JDKLIB)
ifneq ($(HOTSPOT_BUILD_TIME), )
CFLAGS_LIBDT_SHMEM += -DSHMEM_BUILD_TIME='"$(HOTSPOT_BUILD_TIME)"'
endif
$(eval $(call SetupJdkLibrary, BUILD_LIBDT_SHMEM, \
NAME := dt_shmem, \
OPTIMIZATION := LOW, \
CFLAGS := $(CFLAGS_LIBDT_SHMEM), \
CFLAGS := $(CFLAGS_JDKLIB), \
EXTRA_HEADER_DIRS := \
jdk.jdwp.agent:include \
jdk.jdwp.agent:libjdwp/export, \

View File

@ -1,6 +1,6 @@
#!/bin/bash
#
# Copyright (c) 2012, 2020, Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 2012, 2022, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@ -36,7 +36,7 @@ fi
# Diff exceptions
if [ "$OPENJDK_TARGET_OS" = "linux" ]; then
if [ "$HOTSPOT_BUILD_TIME" = "" -o "$USE_PRECOMPILED_HEADER" = "true" ]; then
if [ "$USE_PRECOMPILED_HEADER" = "true" ]; then
ACCEPTED_BIN_DIFF="
./lib/server/libjvm.so
./hotspot/gtest/server/libjvm.so

View File

@ -74,6 +74,10 @@ VirtualizationType Abstract_VM_Version::_detected_virtualization = NoDetectedVir
#error DEBUG_LEVEL must be defined
#endif
#ifndef HOTSPOT_BUILD_TIME
#error HOTSPOT_BUILD_TIME must be defined
#endif
#define VM_RELEASE HOTSPOT_VERSION_STRING
// HOTSPOT_VERSION_STRING equals the JDK VERSION_STRING (unless overridden
@ -267,10 +271,6 @@ const char* Abstract_VM_Version::internal_vm_info_string() {
#define LIBC_STR ""
#endif
#ifndef HOTSPOT_BUILD_TIME
#define HOTSPOT_BUILD_TIME __DATE__ " " __TIME__
#endif
#define INTERNAL_VERSION_SUFFIX VM_RELEASE ")" \
" for " OS "-" CPU FLOAT_ARCH_STR LIBC_STR \
" JRE (" VERSION_STRING "), built on " HOTSPOT_BUILD_TIME \

View File

@ -1257,14 +1257,14 @@ shmemBase_getlasterror(char *msg, jint size) {
void
exitTransportWithError(char *message, char *fileName,
char *date, int lineNumber)
int lineNumber)
{
JNIEnv *env;
jint error;
char buffer[500];
sprintf(buffer, "Shared Memory Transport \"%s\" (%s), line %d: %s\n",
fileName, date, lineNumber, message);
sprintf(buffer, "Shared Memory Transport \"%s\", line %d: %s\n",
fileName, lineNumber, message);
error = (*jvm)->GetEnv(jvm, (void **)&env, JNI_VERSION_1_2);
if (error != JNI_OK) {
/*

View File

@ -28,7 +28,7 @@
#define JAVASOFT_SHMEMBASE_H
void exitTransportWithError(char *msg, char *fileName,
char *date, int lineNumber);
int lineNumber);
typedef struct SharedMemoryConnection SharedMemoryConnection;
typedef struct SharedMemoryTransport SharedMemoryTransport;
@ -49,15 +49,11 @@ jint shmemBase_receivePacket(SharedMemoryConnection *, jdwpPacket *packet);
jint shmemBase_name(SharedMemoryTransport *, char **name);
jint shmemBase_getlasterror(char *msg, jint size);
#ifndef SHMEM_BUILD_TIME
#define SHMEM_BUILD_TIME __DATE__
#endif
#ifdef DEBUG
#define SHMEM_ASSERT(expression) \
do { \
if (!(expression)) { \
exitTransportWithError("assertion failed", __FILE__, SHMEM_BUILD_TIME, __LINE__); \
exitTransportWithError("assertion failed", __FILE__, __LINE__); \
} \
} while (0)
#else
@ -67,7 +63,7 @@ do { \
#define SHMEM_GUARANTEE(expression) \
do { \
if (!(expression)) { \
exitTransportWithError("assertion failed", __FILE__, SHMEM_BUILD_TIME, __LINE__); \
exitTransportWithError("assertion failed", __FILE__, __LINE__); \
} \
} while (0)

View File

@ -28,7 +28,7 @@
#include "shmem_md.h"
#include "sysShmem.h"
#include "shmemBase.h" /* for exitTransportWithError */
#include "shmemBase.h" /* for SHMEM_ASSERT */
/*
* These functions are not completely universal. For now, they are used
@ -39,22 +39,6 @@
static HANDLE memHandle = NULL;
#ifndef SHMEM_BUILD_TIME
#define SHMEM_BUILD_TIME __DATE__
#endif
#ifdef DEBUG
#define sysAssert(expression) { \
if (!(expression)) { \
exitTransportWithError \
("\"%s\", line %d: assertion failure\n", \
__FILE__, SHMEM_BUILD_TIME, __LINE__); \
} \
}
#else
#define sysAssert(expression) ((void) 0)
#endif
int
sysSharedMemCreate(const char *name, int length,
sys_shmem_t *mem, void **buffer)
@ -62,9 +46,9 @@ sysSharedMemCreate(const char *name, int length,
void *mappedMemory;
HANDLE memHandle;
sysAssert(buffer);
sysAssert(name);
sysAssert(length > 0);
SHMEM_ASSERT(buffer);
SHMEM_ASSERT(name);
SHMEM_ASSERT(length > 0);
memHandle =
CreateFileMapping(INVALID_HANDLE_VALUE, /* backed by page file */
@ -103,8 +87,8 @@ sysSharedMemOpen(const char *name, sys_shmem_t *mem, void **buffer)
void *mappedMemory;
HANDLE memHandle;
sysAssert(name);
sysAssert(buffer);
SHMEM_ASSERT(name);
SHMEM_ASSERT(buffer);
memHandle =
OpenFileMapping(FILE_MAP_WRITE, /* read/write */
@ -151,8 +135,8 @@ sysIPMutexCreate(const char *name, sys_ipmutex_t *mutexPtr)
{
HANDLE mutex;
sysAssert(mutexPtr);
sysAssert(name);
SHMEM_ASSERT(mutexPtr);
SHMEM_ASSERT(name);
mutex = CreateMutex(NULL, /* no inheritance */
FALSE, /* no initial owner */
@ -174,8 +158,8 @@ sysIPMutexOpen(const char *name, sys_ipmutex_t *mutexPtr)
{
HANDLE mutex;
sysAssert(mutexPtr);
sysAssert(name);
SHMEM_ASSERT(mutexPtr);
SHMEM_ASSERT(name);
mutex = OpenMutex(SYNCHRONIZE, /* able to wait/release */
FALSE, /* no inheritance */
@ -195,7 +179,7 @@ sysIPMutexEnter(sys_ipmutex_t mutex, sys_event_t event)
int count = event == NULL ? 1 : 2;
DWORD rc;
sysAssert(mutex);
SHMEM_ASSERT(mutex);
rc = WaitForMultipleObjects(count, handles,
FALSE, /* wait for either, not both */
INFINITE); /* infinite timeout */
@ -205,7 +189,7 @@ sysIPMutexEnter(sys_ipmutex_t mutex, sys_event_t event)
int
sysIPMutexExit(sys_ipmutex_t mutex)
{
sysAssert(mutex);
SHMEM_ASSERT(mutex);
return ReleaseMutex(mutex) ? SYS_OK : SYS_ERR;
}
@ -221,7 +205,7 @@ sysEventCreate(const char *name, sys_event_t *eventPtr, jboolean manualReset)
HANDLE event;
BOOL reset = (manualReset == JNI_TRUE) ? TRUE : FALSE;
sysAssert(eventPtr);
SHMEM_ASSERT(eventPtr);
event = CreateEvent(NULL, /* no inheritance */
reset, /* manual reset */
@ -244,8 +228,8 @@ sysEventOpen(const char *name, sys_event_t *eventPtr)
{
HANDLE event;
sysAssert(eventPtr);
sysAssert(name);
SHMEM_ASSERT(eventPtr);
SHMEM_ASSERT(name);
event = OpenEvent(SYNCHRONIZE | EVENT_MODIFY_STATE,
/* able to wait/signal */
@ -271,7 +255,7 @@ sysEventWait(sys_process_t otherProcess, sys_event_t event, long timeout)
* If the signalling process is specified, and it dies while we wait,
* detect it and return an error.
*/
sysAssert(event);
SHMEM_ASSERT(event);
handles[0] = event;
handles[1] = otherProcess;
@ -297,7 +281,7 @@ sysEventWait(sys_process_t otherProcess, sys_event_t event, long timeout)
int
sysEventSignal(sys_event_t event)
{
sysAssert(event);
SHMEM_ASSERT(event);
return SetEvent(event) ? SYS_OK : SYS_ERR;
}
@ -318,7 +302,7 @@ sysProcessOpen(jlong processID, sys_process_t *processPtr)
{
HANDLE process;
sysAssert(processPtr);
SHMEM_ASSERT(processPtr);
process = OpenProcess(SYNCHRONIZE, /* able to wait on death */
FALSE, /* no inheritance */

View File

@ -1,26 +0,0 @@
/*
* Copyright (c) 1998, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
void exitTransportWithError(char *msg, char *fileName,
char *date, int lineNumber);

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998, 2021, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1998, 2022, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -27,7 +27,6 @@
#include <ws2tcpip.h>
#include "sysSocket.h"
#include "socketTransport.h"
typedef jboolean bool_t;