diff --git a/test/system/reproducibleCompare/build.xml b/test/system/reproducibleCompare/build.xml index 015fbacad..75db0f1d9 100644 --- a/test/system/reproducibleCompare/build.xml +++ b/test/system/reproducibleCompare/build.xml @@ -65,6 +65,7 @@ + diff --git a/test/system/reproducibleCompare/playlist.xml b/test/system/reproducibleCompare/playlist.xml index c3c61ba26..9fd60ce40 100644 --- a/test/system/reproducibleCompare/playlist.xml +++ b/test/system/reproducibleCompare/playlist.xml @@ -60,4 +60,25 @@ os.win + + Rebuild_Same_JDK_Reproducibility_Test_Mac + unset SPEC;\ + ls -l $(TEST_ROOT)$(D)system$(D)reproducibleCompare$(D);\ + $(TEST_ROOT)$(D)system$(D)reproducibleCompare$(D)macos_repro_build_compare.sh $(SBOM_FILE) $(JDK_FILE) $(REPORTDIR); \ + $(TEST_STATUS) + + + dev + + + system + + + eclipse + + + 21+ + + os.osx,arch.aarch64 + \ No newline at end of file diff --git a/test/system/reproducibleCompare/reproducible.mk b/test/system/reproducibleCompare/reproducible.mk index 34b3b0342..e6fbfb2a1 100644 --- a/test/system/reproducibleCompare/reproducible.mk +++ b/test/system/reproducibleCompare/reproducible.mk @@ -16,6 +16,7 @@ ifndef SBOM_FILE SBOM_FILE := $(TEST_ROOT)/../jdkbinary/$(SBOM_FILE) endif ifndef JDK_FILE + JDK_FILE := $(shell find $(TEST_ROOT)/../jdkbinary/ -type f -name '*-jdk_*.tar.gz') ifneq (,$(findstring win,$(SPEC))) JDK_FILE := $(shell find $(TEST_ROOT)/../jdkbinary/ -type f -name '*-jdk_*.zip') endif diff --git a/tooling/reproducible/macos_repro_build_compare.sh b/tooling/reproducible/macos_repro_build_compare.sh index edf0f7562..c856ba006 100755 --- a/tooling/reproducible/macos_repro_build_compare.sh +++ b/tooling/reproducible/macos_repro_build_compare.sh @@ -46,16 +46,11 @@ REPORT_DIR="$3" # The Defaults Below Are Suitable For An Adoptium Mac OS X Build Environment # Which Has Been Created Via The Ansible Infrastructure Playbooks -WORK_DIR=~/comp-jdk-build +WORK_DIR=$(realpath "$(dirname "$0")")/comp-jdk-build MAC_COMPILER_BASE=/Applications MAC_COMPILER_APP_PREFIX=Xcode MAC_SDK_LOCATION=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk -# These 3 variables dictate which parameters passed to makejdk_any_platform.sh are config arguments, build arguments or should be ignored. -CONFIG_ARGS=("--disable-warnings-as-errors" "--openjdk-target" "--with-sysroot" "--with-extra-cxxflags='" "--enable-dtrace" "--with-version-opt") -NOTUSE_ARGS=("--assemble-exploded-image" "--configure-args") -FINAL_ARG=("--build-variant") - # These variables relate to the pre-requisite ant installation ANT_VERSION="1.10.5" ANT_CONTRIB_VERSION="1.0b3" @@ -441,118 +436,22 @@ Prepare_Env_For_Build() { echo "Setting Variables" export BOOTJDK_HOME=$WORK_DIR/jdk-${bootJDK}/Contents/Home - echo "Parsing Make JDK Any Platform ARGS For Build" - # Split the string into an array of words - IFS=' ' read -ra words <<< "$buildArgs" - - # Add The Build Time Stamp In Case It Wasnt In The SBOM ARGS - words+=( " --build-reproducible-date \"$buildStamp\"" ) - - # Initialize variables - param="" - value="" - params=() - - # Loop through the words - for word in "${words[@]}"; do - # Check if the word starts with '--' - if [[ $word == --* ]] || [[ $word == -b* ]]; then - # If a parameter already exists, store it in the params array - if [[ -n $param ]]; then - params+=("$param $value") - fi - # Reset variables for the new parameter - param="$word" - value="" - else - value+=" $word" - fi - done - - # Add the last parameter to the array - params+=("$param $value") - - # Loop Through The Parameters And Reformat Appropriately - export fixed_param="" - export fixed_value="" - export fixed_params=() - export new_params="" - CONFIG_ARRAY=() - BUILD_ARRAY=() - FINAL_ARRAY=() - for element in "${params[@]}"; do - IFS=' ' read -ra parts <<< "$element" - prepped_part0=${parts[0]} - prepped_part1=${parts[1]} - prepped_part2=${parts[2]} - - fixed_param="$prepped_part0" - fixed_value="$prepped_part1 $prepped_part2" - - # Handle Special Parameters ( overrides and = seperated ) - if [ "$fixed_param" == "--jdk-boot-dir" ]; then fixed_value=" $BOOTJDK_HOME " ; fi - if [[ "$fixed_param" == "--with-sysroot="* ]]; then - IFS='=' read -r split_param split_value <<< "$fixed_param" - fixed_param="$split_param" - fixed_value="=$MAC_SDK_LOCATION " ; - fi - if [[ "$fixed_param" == "--openjdk-target="* ]]; then - IFS='=' read -r split_param split_value <<< "$fixed_param" - fixed_param="$split_param" - fixed_value="=$split_value " - fi - if [[ "$fixed_param" == "--with-version-opt="* ]]; then - IFS='=' read -r split_param split_value <<< "$fixed_param" - fixed_param="$split_param" - fixed_value="=$split_value" - fi - if [ "$fixed_param" == "--tag" ]; then fixed_param="-b" fixed_value=" $fixed_value" ; fi - if [ "$fixed_param" == "--target-file-name" ]; then - target_file="$(echo -e "${fixed_value}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')" - fixed_value=" $fixed_value" - fi - if [ "$fixed_param" == "--freetype-dir" ]; then fixed_value=" $fixed_value" ; fi - if [ "$fixed_param" == "--user-openjdk-build-root-directory" ]; then fixed_value=" $WORK_DIR/temurin-build/workspace/build/openjdkbuild/ " ; fi - if [ "$fixed_param" == "--build-variant" ]; then fixed_value=" $fixed_value " ; fi - if [ "$fixed_param" == "--build-reproducible-date" ]; then fixed_value=" $fixed_value" ; fi - - if containsElement "$fixed_param" "${CONFIG_ARGS[@]}"; then - # Check if fixed_param is in CONFIG_ARGS - STRINGTOADD="$fixed_param$fixed_value" - CONFIG_ARRAY+=("$STRINGTOADD") - elif containsElement "$fixed_param" "${NOTUSE_ARGS[@]}"; then - # Check if fixed_param is in NOTUSE_ARGS - STRINGTOADD="$fixed_param$fixed_value" - IGNORED_ARRAY+=("$STRINGTOADD") - elif containsElement "$fixed_param" "${FINAL_ARG[@]}"; then - # Check if parameter should be at the end, usually just version & variant - STRINGTOADD="$fixed_param$fixed_value" - FINAL_ARRAY+=("$STRINGTOADD") - else - # Neither Config Or Ignore, so Build - STRINGTOADD="$fixed_param$fixed_value" - BUILD_ARRAY+=("$STRINGTOADD") - fi - done - - # Construct Final Parameter String - for element in "${BUILD_ARRAY[@]}"; do - build_string+="$element" - done - - for element in "${CONFIG_ARRAY[@]}"; do - config_string+="$element" - done - - for element in "${FINAL_ARRAY[@]}"; do - final_string+="$element" - done - - final_params="$build_string --configure-args \"$config_string\" $final_string" + # set --build-reproducible-date if not yet + if [[ "${buildArgs}" != *"--build-reproducible-date"* ]]; then + buildArgs="--build-reproducible-date \"${buildStamp}\" ${buildArgs}" + fi + # reset --jdk-boot-dir + # shellcheck disable=SC2001 + buildArgs="$(echo "$buildArgs" | sed -e "s|--jdk-boot-dir [^ ]*|--jdk-boot-dir ${BOOTJDK_HOME}|")" + buildArgs="$(echo "$buildArgs" | sed -e "s|--with-sysroot=[^ ]*|--with-sysroot=${MAC_SDK_LOCATION}|")" + buildArgs="$(echo "$buildArgs" | sed -e "s|--user-openjdk-build-root-directory [^ ]*|--user-openjdk-build-root-directory ${WORK_DIR}/temurin-build/workspace/build/openjdkbuild/|")" + # remove ingored options + buildArgs=${buildArgs/--assemble-exploded-image /} + buildArgs=${buildArgs/--enable-sbom-strace /} -echo "" + echo "" echo "Make JDK Any Platform Argument List = " - echo "$final_params" + echo "$buildArgs" echo "" echo "Parameters Parsed Successfully" } @@ -562,79 +461,58 @@ Build_JDK() { # Trigger Build cd "$WORK_DIR" - echo "cd temurin-build && ./makejdk-any-platform.sh $final_params 2>&1 | tee build.$$.log" | sh + echo "cd temurin-build && ./makejdk-any-platform.sh $buildArgs 2>&1 | tee build.$$.log" | sh # Copy The Built JDK To The Working Directory - cp $WORK_DIR/temurin-build/workspace/target/"$target_file" $WORK_DIR/reproJDK.tar.gz + cp "$WORK_DIR"/temurin-build/workspace/target/OpenJDK*-jdk_*tar.gz $WORK_DIR/reproJDK.tar.gz } Compare_JDK() { echo "Comparing JDKs" echo "" mkdir "$WORK_DIR/compare" - cp $WORK_DIR/src_jdk_dist.tar.gz $WORK_DIR/compare - cp $WORK_DIR/reproJDK.tar.gz $WORK_DIR/compare - - - # Check The Comparison Scripts Are Present And Copy To The Working Directory + cp "$WORK_DIR"/src_jdk_dist.tar.gz "$WORK_DIR"/compare + cp "$WORK_DIR"/reproJDK.tar.gz "$WORK_DIR"/compare + cp "$(dirname "$0")"/repro_*.sh "$WORK_DIR"/compare/ - if [ -f ./repro_common.sh ]; then - cp ./repro_common.sh $WORK_DIR/compare/repro_common.sh - else - wget -O "$WORK_DIR/compare/repro_common.sh" "https://raw.githubusercontent.com/adoptium/temurin-build/master/tooling/reproducible/repro_common.sh" - fi - if [ -f ./repro_compare.sh ]; then - cp ./repro_compare.sh $WORK_DIR/compare/repro_compare.sh - else - wget -O "$WORK_DIR/compare/repro_compare.sh" "https://raw.githubusercontent.com/adoptium/temurin-build/master/tooling/reproducible/repro_compare.sh" - fi - if [ -f ./repro_process.sh ]; then - cp ./repro_process.sh $WORK_DIR/compare/repro_process.sh - else - wget -O "$WORK_DIR/compare/repro_process.sh" "https://raw.githubusercontent.com/adoptium/temurin-build/master/tooling/reproducible/repro_process.sh" - fi - # Set Permissions chmod +x "$WORK_DIR/compare/"*sh cd "$WORK_DIR/compare" # Unzip And Rename The Source JDK echo "Unzip Source" - tar xvfz src_jdk_dist.tar.gz + tar xfz src_jdk_dist.tar.gz original_directory_name=$(find . -maxdepth 1 -type d | tail -1) mv "$original_directory_name" src_jdk #Unzip And Rename The Target JDK echo "Unzip Target" - tar xvfz reproJDK.tar.gz + tar xfz reproJDK.tar.gz original_directory_name=$(find . -maxdepth 1 -type d | grep -v src_jdk | tail -1) mv "$original_directory_name" tar_jdk # Ensure Java Home Is Set export JAVA_HOME=$BOOTJDK_HOME export PATH=$JAVA_HOME/bin:$PATH - echo "cd $WORK_DIR/compare && ./repro_compare.sh temurin src_jdk/Contents/Home temurin tar_jdk/Contents/Home Darwin 2>&1" | sh & - wait - rc=$? - set -e + rc=0 + ./repro_compare.sh temurin src_jdk/Contents/Home temurin tar_jdk/Contents/Home Darwin 2>&1 || rc=$? cd "$WORK_DIR" - # Display The Content Of reprotest.diff - echo "" - echo "---------------------------------------------" - echo "Output From JDK Comparison Script" - echo "---------------------------------------------" - cat $WORK_DIR/compare/reprotest.diff - echo "" - echo "---------------------------------------------" - echo "Copying Output To $(dirname "$0")" - cp $WORK_DIR/compare/reprotest.diff $WORK_DIR/reprotest.diff - + + if [ $rc -eq 0 ]; then + echo "Compare identical !" + else + echo "Differences found..., logged in: reprotest.diff" + fi + if [ -n "$REPORT_DIR" ]; then echo "Copying Output To $REPORT_DIR" - cp $WORK_DIR/compare/reprotest.diff "$REPORT_DIR" - cp $WORK_DIR/reproJDK.tar.gz "$REPORT_DIR" + cp "$WORK_DIR"/compare/reprotest.diff "$REPORT_DIR" + cp "$WORK_DIR"/reproJDK.tar.gz "$REPORT_DIR" fi + exit $rc + } + # Clean_Up_Everything() { # Remove Working Directorys diff --git a/tooling/reproducible/repro_common.sh b/tooling/reproducible/repro_common.sh index 8f7ca2942..84fb521d6 100755 --- a/tooling/reproducible/repro_common.sh +++ b/tooling/reproducible/repro_common.sh @@ -89,8 +89,8 @@ function removeSystemModulesHashBuilderParams() { moduleHashesFunction="// Method jdk/internal/module/ModuleHashes\$Builder.hashForModule:(Ljava/lang/String;[B)Ljdk/internal/module/ModuleHashes\$Builder;" moduleString="// String " virtualFunction="invokevirtual" - local JDK_DIR="$1" systemModules="SystemModules\$0.class SystemModules\$all.class SystemModules\$default.class" + local JDK_DIR="$1" for systemModule in $systemModules do FILES=$(find "${JDK_DIR}" -type f -name "$systemModule") @@ -101,11 +101,11 @@ function removeSystemModulesHashBuilderParams() { else ff=$f fi - javap -v -sysinfo -l -p -c -s -constants "$ff" > "$f.javap.tmp" + "${JDK_DIR}"/bin/javap -v -sysinfo -l -p -c -s -constants "$ff" > "$f.javap.tmp" rm "$f" # Remove "instruction number:" prefix, so we can just match code - if [[ $(uname) =~ Darwin* ]]; then + if [[ "$OS" =~ Darwin* ]]; then sed -i "" -E 's/^[[:space:]]+[0-9]+:(.*)/\1/' "$f.javap.tmp" else sed -i -E 's/^[[:space:]]+[0-9]+:(.*)/\1/' "$f.javap.tmp" @@ -153,7 +153,6 @@ function removeSystemModulesHashBuilderParams() { # reprohex - A hex UUID to identify the binary version, again generated from binary content function removeWindowsNonComparableData() { echo "Removing EXE/DLL timestamps, CRC and debug repro hex from ${JDK_DIR}" - # We need to do this for all executables if patching VS_VERSION_INFO if [[ "$PATCH_VS_VERSION_INFO" = true ]]; then FILES=$(find "${JDK_DIR}" -type f -path '*.exe' && find "${JDK_DIR}" -type f -path '*.dll') @@ -191,13 +190,13 @@ function removeWindowsNonComparableData() { hexstr="00000000" timestamphex=${hexstr:0:-${#timestamp}}$timestamp timestamphexLE="${timestamphex:6:2}:${timestamphex:4:2}:${timestamphex:2:2}:${timestamphex:0:2}" - if ! java "$TEMURIN_TOOLS_BINREPL" --inFile "$f" --outFile "$f" --hex "${timestamphexLE}-AA:AA:AA:AA"; then - echo " FAILED ==> java $TEMURIN_TOOLS_BINREPL --inFile \"$f\" --outFile \"$f\" --hex \"${timestamphexLE}-AA:AA:AA:AA\"" + if ! $java "$TEMURIN_TOOLS_BINREPL" --inFile "$f" --outFile "$f" --hex "${timestamphexLE}-AA:AA:AA:AA"; then + echo " FAILED ==> $work_JAVA $TEMURIN_TOOLS_BINREPL --inFile \"$f\" --outFile \"$f\" --hex \"${timestamphexLE}-AA:AA:AA:AA\"" exit 1 fi if [ -n "$reprohexhalf" ]; then - if ! java "$TEMURIN_TOOLS_BINREPL" --inFile "$f" --outFile "$f" --hex "${reprohexhalf}-AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA"; then - echo " FAILED ==> java $TEMURIN_TOOLS_BINREPL --inFile \"$f\" --outFile \"$f\" --hex \"${reprohexhalf}-AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA\"" + if ! $java "$TEMURIN_TOOLS_BINREPL" --inFile "$f" --outFile "$f" --hex "${reprohexhalf}-AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA"; then + echo " FAILED ==> $work_JAVA $TEMURIN_TOOLS_BINREPL --inFile \"$f\" --outFile \"$f\" --hex \"${reprohexhalf}-AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA\"" exit 1 fi fi @@ -208,7 +207,7 @@ function removeWindowsNonComparableData() { checksumhex=${hexstr:0:-${#checksum}}$checksum checksumhexLE="${checksumhex:6:2}:${checksumhex:4:2}:${checksumhex:2:2}:${checksumhex:0:2}" if ! java "$TEMURIN_TOOLS_BINREPL" --inFile "$f" --outFile "$f" --hex "${checksumhexLE}-AA:AA:AA:AA" --firstOnly --32bitBoundaryOnly; then - echo " FAILED ==> java $TEMURIN_TOOLS_BINREPL --inFile \"$f\" --outFile \"$f\" --hex \"${checksumhexLE}-AA:AA:AA:AA\" --firstOnly --32bitBoundaryOnly" + echo " FAILED ==> $work_JAVA $TEMURIN_TOOLS_BINREPL --inFile \"$f\" --outFile \"$f\" --hex \"${checksumhexLE}-AA:AA:AA:AA\" --firstOnly --32bitBoundaryOnly" exit 1 fi done @@ -223,7 +222,7 @@ function removeWindowsNonComparableData() { # See https://github.com/adoptium/temurin-build/issues/2899#issuecomment-1153757419 function removeMacOSNonComparableData() { echo "Removing MacOS dylib non-comparable UUID from ${JDK_DIR}" - + MAC_JDK_ROOT="${JDK_DIR}/../../Contents" FILES=$(find "${MAC_JDK_ROOT}" \( -type f -and -path '*.dylib' -or -path '*/bin/*' -or -path '*/lib/jspawnhelper' -not -path '*/modules_extracted/*' -or -path '*/jpackageapplauncher*' \)) for f in $FILES do @@ -234,8 +233,8 @@ function removeMacOSNonComparableData() { else # Format uuid for BINREPL uuidhex="${uuid:0:2}:${uuid:2:2}:${uuid:4:2}:${uuid:6:2}:${uuid:8:2}:${uuid:10:2}:${uuid:12:2}:${uuid:14:2}:${uuid:16:2}:${uuid:18:2}:${uuid:20:2}:${uuid:22:2}:${uuid:24:2}:${uuid:26:2}:${uuid:28:2}:${uuid:30:2}" - if ! java "$TEMURIN_TOOLS_BINREPL" --inFile "$f" --outFile "$f" --hex "${uuidhex}-AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA" --firstOnly; then - echo " FAILED ==> java \"$TEMURIN_TOOLS_BINREPL\" --inFile \"$f\" --outFile \"$f\" --hex \"${uuidhex}-AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA\" --firstOnly" + if java "$TEMURIN_TOOLS_BINREPL" --inFile "$f" --outFile "$f" --hex "${uuidhex}-AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA" --firstOnly; then + echo " FAILED ==> $work_JAVA \"$TEMURIN_TOOLS_BINREPL\" --inFile \"$f\" --outFile \"$f\" --hex \"${uuidhex}-AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA\" --firstOnly" exit 1 fi fi @@ -251,6 +250,7 @@ function removeMacOSNonComparableData() { # java.base also requires the dependent module "hash:" values to be excluded # as they differ due to the Signatures function processModuleInfo() { + echo "process Module Info from ${JDK_DIR}" if [[ "$OS" =~ CYGWIN* ]] || [[ "$OS" =~ Darwin* ]]; then echo "Normalizing ModuleAttributes order in module-info.class, converting to javap" @@ -264,7 +264,7 @@ function processModuleInfo() { else ff=$f fi - javap -v -sysinfo -l -p -c -s -constants "$ff" > "$f.javap.tmp" + "${JDK_DIR}"/bin/javap -v -sysinfo -l -p -c -s -constants "$ff" > "$f.javap.tmp" rm "$f" cc=99 diff --git a/tooling/reproducible/repro_compare.sh b/tooling/reproducible/repro_compare.sh index dd707fa87..691b8de24 100755 --- a/tooling/reproducible/repro_compare.sh +++ b/tooling/reproducible/repro_compare.sh @@ -13,7 +13,7 @@ # ******************************************************************************** # shellcheck disable=SC1091 -source repro_common.sh +source $(dirname "$0")/repro_common.sh BLD_TYPE1="$1" JDK_DIR1="$2" @@ -32,7 +32,7 @@ do echo "Pre-processing ${JDK_DIR}" rc=0 - source ./repro_process.sh "${JDK_DIR}" "${OS}" || rc=$? + source $(dirname "$0")/repro_process.sh "${JDK_DIR}" "${OS}" || rc=$? if [ $rc != 0 ]; then echo "Pre-process of ${JDK_DIR} ${OS} failed" exit 1 @@ -46,7 +46,7 @@ do cleanTemurinBuildInfo "${JDK_DIR}" if [[ "$OS" =~ CYGWIN* ]] || [[ "$OS" =~ Darwin* ]]; then - removeSystemModulesHashBuilderParams "${JDK_DIR}" + removeSystemModulesHashBuilderParams "${JDK_DIR}" "${OS}" fi processModuleInfo done diff --git a/tooling/reproducible/repro_process.sh b/tooling/reproducible/repro_process.sh index 92b246f2a..7dbbe6ed4 100755 --- a/tooling/reproducible/repro_process.sh +++ b/tooling/reproducible/repro_process.sh @@ -13,7 +13,7 @@ # ******************************************************************************** # shellcheck disable=SC1091 -source repro_common.sh +source $(dirname "$0")/repro_common.sh JDK_DIR="$1" OS="$2"