#!/usr/bin/env bash ############################################################################### # # Copyright (C) 2009-2013 Nintendo. All rights reserved. # # These coded instructions, statements, and computer programs contain # proprietary information of Nintendo of America Inc. and/or Nintendo # Company Ltd., and are protected by Federal copyright law. They may # not be disclosed to third parties or copied or duplicated in any form, # in whole or in part, without the prior written consent of Nintendo. # ############################################################################### TOOL_DIR=`dirname "$0"` TOOL_DIR=`cygpath -w -a "$TOOL_DIR"` source "$TOOL_DIR/masteringfunctions.sh" if [ "$DO_NOT_USE_MAKECFMASTER" != "1" ] then makecfmaster.exe archive $@ exit $? fi ############################################################################### # update_boot_logos ############################################################################### update_boot_logos() { local FILE_DEST="$1" # Src files local BOOT_MOVIE_H264="$CAFE_ROOT/system/bin/ghs/cafe/meta/bootMovie.h264" local BOOT_LOGO_TEX_TGA="$CAFE_ROOT/system/bin/ghs/cafe/meta/bootLogoTex.tga" local ICON_TEX_TGA="$CAFE_ROOT/system/bin/ghs/cafe/meta/iconTex.tga" local BOOT_TV_TGA="$CAFE_ROOT/system/bin/ghs/cafe/meta/bootTvTex.tga" local BOOT_DRC_TGA="$CAFE_ROOT/system/bin/ghs/cafe/meta/bootDrcTex.tga" local BOOT_SOUND_BTSND="$CAFE_ROOT/system/bin/ghs/cafe/meta/bootSound.btsnd" local MANUAL_BFMA="$CAFE_ROOT/system/bin/ghs/cafe/meta/Manual.bfma" # Dest files local DEST_BOOT_MOVIE_H264="$FILE_DEST/bootMovie.h264" local DEST_BOOT_LOGO_TEX_TGA="$FILE_DEST/bootLogoTex.tga" local DEST_ICON_TEX_TGA="$FILE_DEST/iconTex.tga" local DEST_BOOT_TV_TGA="$FILE_DEST/bootTvTex.tga" local DEST_BOOT_DRC_TGA="$FILE_DEST/bootDrcTex.tga" local DEST_BOOT_SOUND_BTSND="$FILE_DEST/bootSound.btsnd" local DEST_MANUAL_BFMA="$FILE_DEST/Manual.bfma" # Boot Logo should be updated cp -u "$BOOT_MOVIE_H264" "$DEST_BOOT_MOVIE_H264" cp -u "$BOOT_LOGO_TEX_TGA" "$DEST_BOOT_LOGO_TEX_TGA" # Applicaion Boot Textures should be copy if files do not exist if [ ! -f "$DEST_ICON_TEX_TGA" ] then cp -u "$ICON_TEX_TGA" "$DEST_ICON_TEX_TGA" fi if [ ! -f "$DEST_BOOT_TV_TGA" ] then cp -u "$BOOT_TV_TGA" "$DEST_BOOT_TV_TGA" fi if [ ! -f "$DEST_BOOT_DRC_TGA" ] then cp -u "$BOOT_DRC_TGA" "$DEST_BOOT_DRC_TGA" fi # Copy default boot sound if not exist and the app is game if [ ! -f "$DEST_BOOT_SOUND_BTSND" ] then local APP_TYPE=`sed -n 's|.*\(.*\)|\1|p' "$APP_XML_FILE"` if [ "$APP_TYPE" == "80000000" ] then cp -u "$BOOT_SOUND_BTSND" "$DEST_BOOT_SOUND_BTSND" fi fi # Copy default manual (dummy file) if not exist and the app is game if [ ! -f "$DEST_MANUAL_BFMA" ] then local APP_TYPE=`sed -n 's|.*\(.*\)|\1|p' "$APP_XML_FILE"` if [ "$APP_TYPE" == "80000000" ] then cp -u "$MANUAL_BFMA" "$DEST_MANUAL_BFMA" echo "User masterinfo : $USER_MASTERINFO_XML" sed -i -e "//{; :loop; N; /<\emanual-info>/! b loop; s|\(\)\(.*\)\(\)|\1WUP-X-XXXX\3|p; d} p; d" "$USER_MASTERINFO_XML" fi fi } ############################################################################### # check_invalid_files ############################################################################### check_invalid_files() { local ICON_TEX="$CAFE_META_DIR/iconTex.tga" local BOOT_TV_TEX="$CAFE_META_DIR/bootTvTex.tga" local BOOT_DRC_TEX="$CAFE_META_DIR/bootDrcTex.tga" local BOOT_SOUND="$CAFE_META_DIR/bootSound.btsnd" local BOOT_MOVIE="$CAFE_META_DIR/bootMovie.h264" local BOOT_LOGO_TEX="$CAFE_META_DIR/bootLogoTex.tga" local MANUAL="$CAFE_META_DIR/Manual.bfma" local RESULT if [ -e "$ICON_TEX" ]; then # Invalid iconTex.tga in AppConfig 20120914 add_msg_if_match "$ICON_TEX" "11024550b6b5287ae16860e30147e6db" \ "Error: A invalid file is used for iconTex.tga." add_msg_if_match "$ICON_TEX" "65da4cd20374d1ef409a86d1a9422aac" \ "Error: A invalid file is used for iconTex.tga." # Default iconTex.tga in SDK 2.08.01 add_msg_if_match "$ICON_TEX" "bf22cf854dd2cfb4d78cfb6f7990fb7b" \ "Warning: A dummy file is used for iconTex.tga." else add_msg "Warning: iconTex.tga is not found." fi if [ -e "$BOOT_TV_TEX" ]; then # Invalid bootTvTex.tga in AppConfig 20120914 add_msg_if_match "$BOOT_TV_TEX" "bb25cd114fcd740192b528a464f91f05" \ "Error: A invalid file is used for bootTvTex.tga." add_msg_if_match "$BOOT_TV_TEX" "2ee539eea0601ee24cf75cbd2451ac3c" \ "Error: A invalid file is used for bootTvTex.tga." # Default bootTvTex.tga in SDK 2.08.01 add_msg_if_match "$BOOT_TV_TEX" "3bd512ba4e82a5ab76a24b339471206e" \ "Warning: A dummy file is used for bootTvTex.tga." else add_msg "Warning: bootTvTex.tga is not found." fi if [ -e "$BOOT_DRC_TEX" ]; then # Invalid bootDrcTex.tga in AppConfig 20120914 add_msg_if_match "$BOOT_DRC_TEX" "fc84aa7eab1cef0f9567d07ab6051116" \ "Error: A invalid file is used for bootDrcTex.tga." add_msg_if_match "$BOOT_DRC_TEX" "74bd2d8c3ad4f9373512d7aed1965dcc" \ "Error: A invalid file is used for bootDrcTex.tga." # Default bootDrcTex.tga in SDK 2.08.0111 add_msg_if_match "$BOOT_DRC_TEX" "9ccca540b6e2a857c04f4badf518b50a" \ "Warning: A dummy file is used for bootDrcTex.tga." else add_msg "Warning: bootDrcTex.tga is not found." fi if [ -e "$BOOT_SOUND" ]; then # Invalid bootSound.btsnd in AppConfig 20120914 add_msg_if_match "$BOOT_SOUND" "1650322dea3c2125b100de1679a5d9cd" \ "Error: A invalid file is used for bootSound.btsnd." # Default bootSound.btsnd in SDK 2.08.01 add_msg_if_match "$BOOT_SOUND" "a3a38bc784c553d5efc256a46c72f2e5" \ "Info: A default file is used for bootSound.btsnd." else add_msg "Warning: bootSound.btsnd is not found." fi if [ -e "$BOOT_MOVIE" ]; then # Default bootMovie.h264 in SDK 2.08.01 add_msg_if_not_match "$BOOT_MOVIE" "ca0dac3e3c5654209c754357ef5a2507" \ "Warning: An unexpected file is used for bootMovie.h264." else add_msg "Warning: bootMovie.h264 is not found." fi if [ -e "$BOOT_LOGO_TEX" ]; then # Default bootLogoTex.tga in SDK 2.08.01 add_msg_if_not_match "$BOOT_LOGO_TEX" "67b312145ecb70514d5bd36fcaae0193" \ "Warning: An unexpected file is used for bootLogoTex.tga." else add_msg "Warning: bootLogoTex.tga is not found." fi if [ -e "$MANUAL" ]; then # Invalid Manual.bfma in AppConfig 20120914 add_msg_if_match "$MANUAL" "48768235ea7527ee2bf9dace0fb35643" \ "Error: A invalid file is used for Manual.bfma." # Default Manual.bfma in SDK 2.08.01 add_msg_if_match "$MANUAL" "be805c3079b87ccce315ca0604527721" \ "Warning: A dummy file is used for Manual.bfma." else add_msg "Warning: Manual.bfma is not found." fi } ############################################################################### # update masterinfo.xml ############################################################################### update_masterinfo () { local FILE_DEFAULT="$1" local FILE_DEST="$2" local DATE="$3" local META_XML="$4" local APP_XML="$5" local COS_XML="$6" local TMP_FILE="$7" local DDF_FILE="$8" local CHECK local RESULT local UNQID local VAR local CTGID local CMN_SIZE local ACC_SIZE # if $FILE_DEST does not exist, $FILE_DEFAULT is copied. check_xml_version "$FILE_DEST" "$FILE_DEFAULT" "copy_default_if_mismatch" check_appconf_version $FILE_DEST if [ -f "$FILE_DEST" ] then # Set mastering date sed -i -e "s|\(\)\(.*\)\(\)|\1$DATE\3|" "$FILE_DEST" #echo "Mastering date $DATE stamped into masterinfo.xml" CHECK=`sed -n 's|.*\(.*\)|\1|p' "$FILE_DEST"` #echo "mastering-date2 : $CHECK" CHECK=`sed -n 's|.*\(.*\)|\1|p' "$META_XML"` if [ $MAKE_PATCH -eq 1 ]; then # change form-code to "U" (patch) CHECK=${CHECK%%-*}-U-${CHECK##*-} sed -i -e "s|\(\)\(.*\)\(\)|\1U\3|" "$FILE_DEST" fi #echo "product_code : $CHECK" #sed -i -e "s|\(\)\(.*\)\(\)|\1$CHECK\3|" "$FILE_DEST" sed -i -e "//{; :loop; N; /<\/emanual-info>/! b loop; p; d} //{s|\(\)\(.*\)\(\)|\1$CHECK\3|} p; d" "$FILE_DEST" RESULT=`echo $CHECK | sed -e "s/\(......\)\(....\)/\2/"` #echo "initial-code : $RESULT" sed -i -e "s|\(\)\(.*\)\(\)|\1$RESULT\3|" "$FILE_DEST" CHECK=`sed -n 's|.*\(.*\)|\1|p' "$META_XML"` #echo "company_code : $CHECK" sed -i -e "s|\(\)\(.*\)\(\)|\1$CHECK\3|" "$FILE_DEST" CHECK=`sed -n 's|.*\(.*\)|\1|p' "$META_XML"` RESULT=$(printf "0x%x" $CHECK) #echo "boss_id : $RESULT" sed -i -e "s|\(\)\(.*\)\(\)|\1$RESULT\3|" "$FILE_DEST" UNQID=`echo $CHECK | sed -e "s/\(....\)\(..\)\(..\)\(.\)\(.....\)\(..\)/\5/"` RESULT=$(printf "0x%s" $UNQID) #echo "boss-unique_id : $RESULT" sed -i -e "s|\(\)\(.*\)\(\)|\1$RESULT\3|" "$FILE_DEST" CHECK=`sed -n 's|.*\(.*\)|\1|p' "$META_XML"` #echo "logo_type : $CHECK" sed -i -e "s|\(\)\(.*\)\(\)|\1$CHECK\3|" "$FILE_DEST" CHECK=`sed -n 's|.*\(.*\)|\1|p' "$META_XML"` RESULT=$(printf "0x%s" $CHECK) #echo "app_launch_type : $RESULT" sed -i -e "s|\(\)\(.*\)\(\)|\1$RESULT\3|" "$FILE_DEST" CHECK=`sed -n 's|.*\(.*\)|\1|p' "$META_XML"` RESULT=$(printf "0x%s" $CHECK) #echo "invisible_flag : $RESULT" sed -i -e "s|\(\)\(.*\)\(\)|\1$RESULT\3|" "$FILE_DEST" CHECK=`sed -n 's|.*\(.*\)|\1|p' "$META_XML"` RESULT=$(printf "0x%s" $CHECK) #echo "no_managed_flag : $RESULT" sed -i -e "s|\(\)\(.*\)\(\)|\1$RESULT\3|" "$FILE_DEST" CHECK=`sed -n 's|.*\(.*\)|\1|p' "$META_XML"` RESULT=$(printf "0x%s" $CHECK) #echo "no_event_log : $RESULT" sed -i -e "s|\(\)\(.*\)\(\)|\1$RESULT\3|" "$FILE_DEST" CHECK=`sed -n 's|.*\(.*\)|\1|p' "$META_XML"` RESULT=$(printf "0x%s" $CHECK) #echo "no_icon_database : $RESULT" sed -i -e "s|\(\)\(.*\)\(\)|\1$RESULT\3|" "$FILE_DEST" CHECK=`sed -n 's|.*\(.*\)|\1|p' "$META_XML"` RESULT=$(printf "0x%s" $CHECK) #echo "launching_flag : $RESULT" sed -i -e "s|\(\)\(.*\)\(\)|\1$RESULT\3|" "$FILE_DEST" CHECK=`sed -n 's|.*\(.*\)|\1|p' "$META_XML"` RESULT=$(printf "0x%s" $CHECK) #echo "install_flag : $TRESULT" sed -i -e "s|\(\)\(.*\)\(\)|\1$RESULT\3|" "$FILE_DEST" CHECK=`sed -n 's|.*\(.*\)|\1|p' "$META_XML"` #echo "closing_msg : $CHECK" sed -i -e "s|\(\)\(.*\)\(\)|\1$CHECK\3|" "$FILE_DEST" CHECK=`sed -n 's|.*\(.*\)|\1|p' "$META_XML"` RESULT=$(printf "0x%s" $CHECK) #echo "app_size : $RESULT" sed -i -e "s|\(\)\(.*\)\(\)|\1$RESULT\3|" "$FILE_DEST" CHECK=`sed -n 's|.*\(.*\)|\1|p' "$META_XML"` RESULT=$(printf "0x%s" $CHECK) #echo "join_game_id : $RESULT" sed -i -e "s|\(\)\(.*\)\(\)|\1$RESULT\3|" "$FILE_DEST" CHECK=`sed -n 's|.*\(.*\)|\1|p' "$META_XML"` RESULT=$(printf "0x%s" $CHECK) #echo "join_game_mode_mask : $RESULT" sed -i -e "s|\(\)\(.*\)\(\)|\1$RESULT\3|" "$FILE_DEST" CHECK=`sed -n 's|.*\(.*\)|\1|p' "$META_XML"` #echo "bg_daemon_enable : $CHECK" sed -i -e "s|\(\)\(.*\)\(\)|\1$CHECK\3|" "$FILE_DEST" CHECK=`sed -n 's|.*\(.*\)|\1|p' "$META_XML"` #echo "olv_accesskey : $CHECK" sed -i -e "s|\(\)\(.*\)\(\)|\1$CHECK\3|" "$FILE_DEST" CHECK=`sed -n 's|.*\(.*\)|\1|p' "$META_XML"` #echo "wood_tin : $CHECK" sed -i -e "s|\(\)\(.*\)\(\)|\1$CHECK\3|" "$FILE_DEST" CHECK=`sed -n 's|.*\(.*\)|\1|p' "$META_XML"` #echo "e_manual : $CHECK" sed -i -e "s|\(\)\(.*\)\(\)|\1$CHECK\3|" "$FILE_DEST" CHECK=`sed -n 's|.*\(.*\)|\1|p' "$META_XML"` #echo "e_manual_versionl : $CHECK" sed -i -e "s|\(\)\(.*\)\(\)|\1$CHECK\3|" "$FILE_DEST" CMN_SIZE=`sed -n 's|.*\(.*\)|\1|p' "$META_XML"` RESULT=$(printf "0x%s" $CMN_SIZE) #echo "common_save_size : $RESULT" sed -i -e "s|\(\)\(.*\)\(\)|\1$RESULT\3|" "$FILE_DEST" ACC_SIZE=`sed -n 's|.*\(.*\)|\1|p' "$META_XML"` RESULT=$(printf "0x%s" $ACC_SIZE) #echo "account_save_size : $RESULT" sed -i -e "s|\(\)\(.*\)\(\)|\1$RESULT\3|" "$FILE_DEST" CMN_SIZE=$(printf "%d" 0x$CMN_SIZE) ACC_SIZE=$(printf "%d" 0x$ACC_SIZE) if [ "$CMN_SIZE" -gt 0 ] && [ "$ACC_SIZE" -gt 0 ] ; then CHECK="both" elif [ "$CMN_SIZE" -gt 0 ] then CHECK="common" elif [ "$ACC_SIZE" -gt 0 ] then CHECK="account" else CHECK="none" fi #echo "save_type : $CHECK" sed -i -e "s|\(\)\(.*\)\(\)|\1$CHECK\3|" "$FILE_DEST" CHECK=`sed -n 's|.*\(.*\)|\1|p' "$META_XML"` #echo "save_no_rollback : $CHECK" sed -i -e "s|\(\)\(.*\)\(\)|\1$CHECK\3|" "$FILE_DEST" CHECK=`sed -n 's|.*\(.*\)|\1|p' "$META_XML"` RESULT=$(printf "0x%s" $CHECK) #echo "common_boss_size : $RESULT" sed -i -e "s|\(\)\(.*\)\(\)|\1$RESULT\3|" "$FILE_DEST" CHECK=`sed -n 's|.*\(.*\)|\1|p' "$META_XML"` RESULT=$(printf "0x%s" $CHECK) #echo "account_boss_size : $RESULT" sed -i -e "s|\(\)\(.*\)\(\)|\1$RESULT\3|" "$FILE_DEST" CHECK=`sed -n 's|.*\(.*\)|\1|p' "$META_XML"` RESULT=$(printf "0x%s" $CHECK) #echo "region : $RESULT" sed -i -e "s|\(\)\(.*\)\(\)|\1$RESULT\3|" "$FILE_DEST" CHECK=`sed -n 's|.*\(.*\)|\1|p' "$APP_XML"` RESULT=$(printf "0x%s" $CHECK) #echo "title_version : $RESULT" sed -i -e "s|\(\)\(.*\)\(\)|\1$RESULT\3|" "$FILE_DEST" CHECK=`sed -n 's|.*\(.*\)|\1|p' "$APP_XML"` RESULT=$(printf "0x%s" $CHECK) #echo "title_id : $RESULT" sed -i -e "s|\(\)\(.*\)\(\)|\1$RESULT\3|" "$FILE_DEST" UNQID=`echo $CHECK | sed -e "s/\(....\)\(..\)\(..\)\(.\)\(.....\)\(..\)/\5/"` RESULT=$(printf "0x%s" $UNQID) #echo "unique_id : $RESULT" sed -i -e "s|\(\)\(.*\)\(\)|\1$RESULT\3|" "$FILE_DEST" VAR=`echo $CHECK | sed -e "s/\(....\)\(..\)\(..\)\(.\)\(.....\)\(..\)/\6/"` RESULT=$(printf "0x%s" $VAR) #echo "variation : $RESULT" sed -i -e "s|\(\)\(.*\)\(\)|\1$RESULT\3|" "$FILE_DEST" CTGID=`echo $CHECK | sed -e "s/\(....\)\(..\)\(..\)\(.\)\(.....\)\(..\)/\3/"` RESULT=$(printf "0x%s" $CTGID) #echo "category-id : $RESULT" sed -i -e "s|\(\)\(.*\)\(\)|\1$RESULT\3|" "$FILE_DEST" CHECK=`sed -n 's|.*\(.*\)|\1|p' "$APP_XML"` RESULT=$(printf "0x%s" $CHECK) #echo "group_id : $RESULT" sed -i -e "s|\(\)\(.*\)\(\)|\1$RESULT\3|" "$FILE_DEST" CHECK=`sed -n 's|.*\(.*\)|\1|p' "$APP_XML"` RESULT=$(printf "0x%s" $CHECK) #echo "os_version : $RESULT" sed -i -e "s|\(\)\(.*\)\(\)|\1$RESULT\3|" "$FILE_DEST" CHECK=`sed -n 's|.*\(.*\)|\1|p' "$APP_XML"` RESULT=$(printf "0x%s" $CHECK) #echo "os_version : $RESULT" sed -i -e "s|\(\)\(.*\)\(\)|\1$RESULT\3|" "$FILE_DEST" CHECK=`sed -n 's|.*\(.*\)|\1|p' "$COS_XML"` RESULT=$(printf "0x%s" $CHECK) #echo "max_codesize : $RESULT" sed -i -e "s|\(\)\(.*\)\(\)|\1$RESULT\3|" "$FILE_DEST" CHECK=`sed -n 's|.*\(.*\)|\1|p' "$COS_XML"` RESULT=$(printf "0x%s" $CHECK) #echo "max_size : $RESULT" sed -i -e "s|\(\)\(.*\)\(\)|\1$RESULT\3|" "$FILE_DEST" if [ -z "$G_APP_BUILD_TYPE" ] then add_msg "Warning: G_APP_BUILD_TYPE is NULL" # Not error if G_APP_BUILD_TYPE is NULL elif [ $G_APP_BUILD_TYPE == "NDEBUG" ]; then RESULT="NODEBUG" sed -i -e "s|\(\)\(.*\)\(\)|\1$RESULT\3|" "$FILE_DEST" elif [ $G_APP_BUILD_TYPE == "DEBUG" ]; then RESULT="DEBUG" sed -i -e "s|\(\)\(.*\)\(\)|\1$RESULT\3|" "$FILE_DEST" fi #echo "build-type : $RESULT" if [ $MAKE_PATCH -eq 1 ]; then sed -i -e "s|\(\)\(.*\)\(\)|\1GP\3|" "$FILE_DEST" else sed -i -e "s|\(\)\(.*\)\(\)|\1GM\3|" "$FILE_DEST" fi if [ -e "$DDF_FILE" ]; then embed_ddf_info_to_masterinfo "$DDF_FILE" "$FILE_DEST" fi embed_sdk_version_to_masterinfo "$FILE_DEST" embed_tool_version_to_masterinfo "$FILE_DEST" embed_mastering_sdk_version "$FILE_DEST" reset_mastering_flag "$FILE_DEST" "$META_XML" fi } ############################################################################### # erase temporary items ############################################################################### erase_work () { export CAFERUN_OPTION_USE_DVDFS= export CAFERUN_WORK_DIR= export CAFE_CODE_DIR= export CAFE_SYSTEM_DIR= export CAFERUN_OPTION_USE_ATFS= export INCLUDE_SYSTEM_DIR= rm -Rf "$TEMP_WORK_DIR" } ############################################################################### # print usage help message ############################################################################### usage () { cat < options: -r : RPX file to generate mastering image. If omitted, the application previously executed by caferun/ cafediscrun will be used. -o : Output file name without extension. Extension '.wumad' is automatically added. If omitted, use RPX file name with the extension .wumad at the current work dir. -w : Temporary directory for mastering. If omitted, create temporary directory at the current work dir. -u : Include system update partition on master image. Update partition is effective on optical disc only. -a : Make an add-on content master archive from content files under . The content files should exist under /content/XXXX. /code/.ddf is used as the individual ddf file, if exists. -p : Make a patch master archive from and the current application indicated by -r . When creating the first patch, use the original disc master archive as . When creating the second or later patch, use the previously submitted patch master archive as . EOF } ############################################################################### # main ############################################################################### SKIP_COPY_DEFAULT_FILES=0 EXPAND_FST_MAX_SIZE=0 CAFE_SYSTEM_DIR="`cygpath -a $CAFE_SLC_DIR`/sys" SYS_XML_FILE="`cygpath -a $CAFE_SLC_DIR`/sys/config/system.xml" DEFAULT_MASTERINFO_XML="$CAFE_ROOT/system/bin/tool/mastering/resources/masterinfo.xml" USER_MASTERINFO_XML= RPX_FILE="" OUTPUT_FILE_NOEXT="" INCLUDE_SYSTEM_DIR=0 INCLUDE_UPDATE_PARTITION=0 VERBOSE=1 MAKE_ADD_ON_CONTENT=0 MAKE_PATCH=0 MAKE_PATCH_OPTION="" EXPAND_SECTION_SIZE_RANGE=0 CAFEMAKEDLF_OPTION="" KIOSK_DEFAULT_DDF="" PAST_WUMAD="" DO_MAKEDISCIMAGE=0 DO_MAKEDOWNLOADIMAGE=0 SKIP_UNIQUE_ID_CHECK=0 SECTION_ENTRY_HASH_OPTION="-filename_addhash" rval=0 # mastering date DATE=$(date '+%Y-%m-%d %T') echo "Mastering date to be stamped: $DATE" while getopts ":r:w:o:usfvap:icenm:k:dzS" opt; do case $opt in r ) RPX_FILE="`cygpath -a $OPTARG`" ;; w ) TEMP_WORK_DIR="`cygpath -a $OPTARG`" ;; o ) OUTPUT_FILE_NOEXT="`cygpath -a $OPTARG`" ;; u ) INCLUDE_UPDATE_PARTITION=1 ;; s ) INCLUDE_SYSTEM_DIR=1 ;; f ) DO_MAKEDISCIMAGE=1 ;; # do makediscimage in one shot v ) VERBOSE=1 ;; a ) MAKE_ADD_ON_CONTENT=1 ;; p ) PAST_WUMAD="`cygpath -a $OPTARG`" MAKE_PATCH=1 ;; i ) G_IGNORE_ERROR=1 ;; c ) SKIP_COPY_DEFAULT_FILES=1 ;; e ) EXPAND_FST_MAX_SIZE=1 ;; n ) MAKE_PATCH_OPTION="$MAKE_PATCH_OPTION -ignoreversion" ;; m ) EXPAND_SECTION_SIZE_RANGE=1 CAFEMAKEDLF_OPTION="$CAFEMAKEDLF_OPTION -mss=$OPTARG" ;; k ) CAFEMAKEDLF_OPTION="$CAFEMAKEDLF_OPTION -v" KIOSK_DEFAULT_DDF="$OPTARG" G_METARATING_DISABLED=1 if [ ! -e "$KIOSK_DEFAULT_DDF" ]; then add_msg "Error: Kiosk ddf does not exist." usage exit 1 fi ;; d ) DO_MAKEDOWNLOADIMAGE=1 ;; # do makecfdownloadimage in one shot z ) SKIP_UNIQUE_ID_CHECK=1 ;; S ) SECTION_ENTRY_HASH_OPTION="" add_msg "Disable Section Entry Hash." ;; \? ) usage exit 1 ;; esac done if [ "$MAKE_ADD_ON_CONTENT" -eq 1 ] then shift `expr "$OPTIND" - 1` "$MAKEAOC" "$@" exit "$?" fi if [ -z "$CAFE_TEMP" ] then CAFERUN_WORK_DIR=`cygpath -a "$CYGWIN_PATH/tmp/${SESSION_PATH_PREFIX}caferun"` else CAFERUN_WORK_DIR=`cygpath -a "$CAFE_TEMP/${SESSION_PATH_PREFIX}caferun"` fi # If rpx name is omitted, get info from previous launched info if [ -z "$RPX_FILE" ] then if [ "$VERBOSE" -eq 1 ] then echo "*** Using previously launched application ***" fi PREV_LAUNCH_XML_FILE="$CAFERUN_WORK_DIR/previous_launch_info.xml" if [ ! -f "$PREV_LAUNCH_XML_FILE" ] then echo "$(basename $0) failed: Please run any application by caferun/cafediscrun." exit 2 fi RPX_DIR=`sed -n 's|.*\(.*\)|\1|p' "$PREV_LAUNCH_XML_FILE"` APP_XML_FILE="$RPX_DIR/app.xml" COS_XML_FILE="$RPX_DIR/cos.xml" TMP_FILE="$RPX_DIR/temp.txt" RPX_FILE=`sed -n 's|.*\(.*\)|\1|p' "$COS_XML_FILE"` RPX_FILE=(`echo "$RPX_FILE" | grep -Eo "[^ ]*\.rpx"`) RPX_FILE="$RPX_DIR/${RPX_FILE[0]}" RPX_DIR="`cygpath -m -a $RPX_DIR`" else if [ "$SESSION_MANAGER" == "1" ] then # Repoint the RPX_FILE to the one in the CAFE_DATA_TMP folder RPX_FILE_SRC_DIR="$(dirname "$RPX_FILE")" TMP_SUB_DIR=`basename "$RPX_FILE" ".rpx"` RPX_FILE="$CAFE_DATA_TMP/$TMP_SUB_DIR/`basename "$RPX_FILE"`" echo "$(basename $0): Repointing RPX file for multi-devkit environment." fi RPX_DIR="`cygpath -m -a $RPX_FILE`" RPX_DIR="`dirname $RPX_DIR`" APP_XML_FILE="`dirname $RPX_FILE`/app.xml" COS_XML_FILE="`dirname $RPX_FILE`/cos.xml" fi # we can't use quotations for wildcard RPL_FILE=`dirname $RPX_FILE`/*.rpl if [ ! -f "$RPX_FILE" ] then echo "$(basename $0) failed: rpx file name is not found." usage exit 3 fi if [ ! ${RPX_FILE:(-4)} == ".rpx" ] then echo "$(basename $0) failed: Please specify rpx file with -r option." usage exit 4 fi if [ -z "$OUTPUT_FILE_NOEXT" ] then if [ $MAKE_PATCH -eq 1 ] then OUTPUT_FILE_NOEXT="patch"`date +%Y%m%d%H%M%S`"_"`basename "${RPX_FILE%.*}"` else # Use file name only in order to output at current work directory OUTPUT_FILE_NOEXT=`basename "${RPX_FILE%.*}"` fi fi if [ -z "$TEMP_WORK_DIR" ] then TEMP_WORK_DIR="`basename "${OUTPUT_FILE_NOEXT%.*}"`_tmp" else if [ -e "$TEMP_WORK_DIR" ] then TEMP_WORK_SUBDIR="`basename "${OUTPUT_FILE_NOEXT%.*}"`_tmp" TEMP_WORK_DIR="$TEMP_WORK_DIR/$TEMP_WORK_SUBDIR" fi fi dir_check "$TEMP_WORK_DIR" 1 rval=$? if [ $rval -ne 0 ] then erase_work exit 7 fi if [ ! -e "$TEMP_WORK_DIR" ] then echo "$(basename $0): Creating $TEMP_WORK_DIR." mkdir -m 777 -p "$TEMP_WORK_DIR" fi if [ "$INCLUDE_SYSTEM_DIR" -eq 1 ] then if [ ! -f "$SYS_XML_FILE" ] then echo "$(basename $0) failed: Cannot find $SYS_XML_FILE" echo " Please caferun before creating master data." exit 6 fi fi if [ ! -f "$APP_XML_FILE" ] then echo "$(basename $0) failed: Cannot find $APP_XML_FILE" echo " Please caferun before creating master data." exit 7 fi if [ ! -f "$COS_XML_FILE" ] then echo "$(basename $0) failed: Cannot find $COS_XML_FILE" echo " Please caferun before creating master data." exit 8 fi if [ "$SKIP_UNIQUE_ID_CHECK" -eq 1 ] then add_msg "Warning: Skipped unique id check." else check_unique_id "$APP_XML_FILE" fi RPX_PATH_WIN=`cygpath -w -a "$RPX_FILE"` # warn if individual ddf not found INDIVIDUAL_DDF_FILE="${RPX_PATH_WIN%.*}.ddf" INDIVIDUAL_DDF_HAS_METARATING="$G_READONLY_FILE_NOT_FOUND" if [ ! -e "$INDIVIDUAL_DDF_FILE" ] then add_msg "Warning: $INDIVIDUAL_DDF_FILE is not found. Use Application Configuration Tool to create a ddf file." else ddf_has_metarating "$INDIVIDUAL_DDF_FILE" INDIVIDUAL_DDF_HAS_METARATING=$? fi USER_MASTERINFO_XML="$RPX_DIR/masterinfo.xml" if [ -e "$KIOSK_DEFAULT_DDF" ]; then if [ "$INDIVIDUAL_DDF_HAS_METARATING" -eq "$G_READONLY_DDF_METARATING_ON" ]; then add_msg "Error: In KIOSK mode, METARATING section must not exist in the individual ddf file." fi elif [ "$MAKE_PATCH" -eq 1 ]; then EXTRACTFILE_OUT_DIR=`cygpath -w -a "$TEMP_WORK_DIR"` PAST_WUMAD_WIN=`cygpath -w "$PAST_WUMAD"` $EXTRACTFILE -v -nc "-od=$EXTRACTFILE_OUT_DIR" "$PAST_WUMAD_WIN" "masterinfo.xml" PAST_MASTERINFO="$EXTRACTFILE_OUT_DIR\pastmasterinfo.bin" mv "$EXTRACTFILE_OUT_DIR\masterinfo.xml" "$PAST_MASTERINFO" masterinfo_get_metarating_flag "$PAST_MASTERINFO" PAST_MASTERINFO_METARATING=$? if [ "$PAST_MASTERINFO_METARATING" -eq "$G_READONLY_MASTERINFO_METARATING_ON" ]; then if [ "$INDIVIDUAL_DDF_HAS_METARATING" -eq "$G_READONLY_DDF_METARATING_OFF" ]; then add_msg "Error: Past Wumad has METARATING section, but the ddf doesn't. Please check $INDIVIDUAL_DDF_FILE. Use Application Configuration Tool ver 1.3.10 or later." fi echo "Create a patch with METARATING section." G_METARATING_DISABLED=0 masterinfo_set_metarating_flag "$USER_MASTERINFO_XML" "$G_READONLY_MASTERINFO_METARATING_ON" copy_past_rating_image_files "$PAST_WUMAD_WIN" "$EXTRACTFILE_OUT_DIR" else # METARATING does not exist in the past wumad. if [ "$INDIVIDUAL_DDF_HAS_METARATING" -eq "$G_READONLY_DDF_METARATING_ON" ]; then echo "Disable METARATING section as the past wumad does not have it." fi echo "Create a patch without METARATING section." DEFAULT_MASTERINFO_XML="$CAFE_ROOT/system/bin/tool/mastering/resources/masterinfo_nometarating.xml" G_METARATING_DISABLED=1 masterinfo_set_metarating_flag "$USER_MASTERINFO_XML" "$G_READONLY_MASTERINFO_METARATING_OFF" fi else if [ "$INDIVIDUAL_DDF_HAS_METARATING" -ne "$G_READONLY_DDF_METARATING_ON" ]; then # not to affect SDK apps, do not add METARATING section unless individual ddf is provided. masterinfo_get_metarating_use "$USER_MASTERINFO_XML" MASTERINFO_METARATING_USE=$? if [ $MASTERINFO_METARATING_USE -eq "$G_READONLY_MASTERINFO_METARATING_OFF" ]; then # 0 means this is set by appconf_sysapp. so no warning. echo "Create a wumad without METARATING section" else add_msg "Warning: Create a wumad without METARATING section. Use Application Configuration Tool ver 1.3.10 or later." fi DEFAULT_MASTERINFO_XML="$CAFE_ROOT/system/bin/tool/mastering/resources/masterinfo_nometarating.xml" G_METARATING_DISABLED=1 masterinfo_set_metarating_flag "$USER_MASTERINFO_XML" "$G_READONLY_MASTERINFO_METARATING_OFF" else echo "Create a wumad with METARATING section" G_METARATING_DISABLED=0 masterinfo_set_metarating_flag "$USER_MASTERINFO_XML" "$G_READONLY_MASTERINFO_METARATING_ON" copy_dummy_rating_files fi fi # Make a summary of output file names if [ "$DO_MAKEDISCIMAGE" -eq 1 ] then OUTPUT_FILE_SUMMARY="$OUTPUT_FILE_NOEXT.wumad, $OUTPUT_FILE_NOEXT.wum" else OUTPUT_FILE_SUMMARY="$OUTPUT_FILE_NOEXT.wumad" fi # Echo settings (if -v specified) if [ "$VERBOSE" -eq 1 ] then echo "======== $(basename $0) parameters ========" if [ "$INCLUDE_UPDATE_PARTITION" -eq 1 ] then echo "*** System update partition is to be merged ***" fi if [ "$INCLUDE_SYSTEM_DIR" -eq 1 ] then echo "*** Create image with /sys included ***" fi if [ "$MAKE_PATCH" -eq 1 ] then echo "*** Create patch master archive ***" echo "Past WUMAD : $PAST_WUMAD" fi echo "Output : $OUTPUT_FILE_SUMMARY" echo "RPX File : $RPX_FILE" echo "RPX Dir : $RPX_DIR" echo "---------------------------------------------" if [ "$INCLUDE_SYSTEM_DIR" -eq 1 ] then echo "Sys XML : $SYS_XML_FILE" fi echo "App XML : $APP_XML_FILE" echo "Cos XML : $COS_XML_FILE" echo "---------------------------------------------" echo "Temp dir : $TEMP_WORK_DIR" echo "Code dir : $RPX_DIR" echo "Content dir : $CAFE_CONTENT_DIR" echo "Meta dir : $CAFE_META_DIR" if [ "$INCLUDE_SYSTEM_DIR" -eq 1 ] then echo "System dir : $CAFE_SYSTEM_DIR" fi echo "" fi # Generate dlf file and binaries (disc header, volume header, FST) RPX_PATH=`cygpath -m -a "$RPX_FILE"` RPX_PATH_WIN=`cygpath -w -a "$RPX_FILE"` # Export settings export CAFERUN_WORK_DIR="$CAFERUN_WORK_DIR" export CAFE_CODE_DIR="$RPX_DIR" export CAFE_SYSTEM_DIR="$CAFE_SYSTEM_DIR" export CAFERUN_OPTION_USE_ATFS=1 export INCLUDE_SYSTEM_DIR="$INCLUDE_SYSTEM_DIR" export CAFERUN_OPTION_USE_DVDFS=0 # extract info from $RPX_FILE extract_info_from_app_rpx "$RPX_FILE" "$APP_XML_FILE" # update app.xml update_app_xml "$APP_XML_FILE" # update meta.xml update_meta_xml "$CAFE_META_DIR/meta.xml" # update cos.xml update_cos_xml "$RPX_DIR/cos.xml" # update boot logos (if not exist, use default dummy data) if [ "$SKIP_COPY_DEFAULT_FILES" -eq 1 ] then add_msg "Warning: Skipped copying default files." else update_boot_logos "$CAFE_META_DIR" fi # check if boot logos or other resource files are invalid data or not check_invalid_files MAKE_DLF_CONFIG_DEST="$CAFE_ROOT/system/bin/tool/mastering/cafemakedlf.exe.config" MAKE_DLF_CONFIG_EXPAND="$CAFE_ROOT/system/bin/tool/mastering/config/cafemakedlf.exe.config_fst_expanded" MAKE_DLF_CONFIG_SSRANGE_EXPAND="$CAFE_ROOT/system/bin/tool/mastering/config/cafemakedlf.exe.config_section_size_range_expanded" # restore original config file if [ -e "$MAKE_DLF_CONFIG_DEST" ]; then echo "[Restore] The interuption may occured in the previous operation." echo "[Restore] Restore cafemakedlf configuration to the original state." echo "[Restore] rm -f $MAKE_DLF_CONFIG_DEST" rm -f "$MAKE_DLF_CONFIG_DEST" fi if [ "$EXPAND_FST_MAX_SIZE" -eq 1 ]; then echo "[Expand FST] Expand FST Max Size to 32MiB." echo "[Expand FST] Change cafemakedlf configuration in order to expand FST Max Size to 32MiB." echo "[Expand FST] cp -f $MAKE_DLF_CONFIG_EXPAND $MAKE_DLF_CONFIG_DEST" cp -f "$MAKE_DLF_CONFIG_EXPAND" "$MAKE_DLF_CONFIG_DEST" add_msg "Warning: FST Max Size is temporarily expanded." fi if [ "$EXPAND_SECTION_SIZE_RANGE" -eq 1 ]; then echo "[Expand Section Size Range] Change cafemakedlf configuration in order to expand Section Size Range to 32-4024MiB." echo "[Expand Section Size Range] cp -f $MAKE_DLF_CONFIG_EXPAND $MAKE_DLF_CONFIG_DEST" cp -f "$MAKE_DLF_CONFIG_SSRANGE_EXPAND" "$MAKE_DLF_CONFIG_DEST" echo "[Expand Section Size Range] Call cafemakedlf.exe with option$CAFEMAKEDLF_OPTION." add_msg "Warning: Section Size Range is temporarily expanded." add_msg "Warning: cafemakedlf.exe is called with option$CAFEMAKEDLF_OPTION." fi # Set Section Entry Hash Flag check_section_entry_hash CAFEMAKEDLF_OPTION+=" $SECTION_ENTRY_HASH_OPTION" cafedevrun.sh $RPX_PATH_WIN $MAKE_PATCH "$CAFEMAKEDLF_OPTION" "$KIOSK_DEFAULT_DDF" "$G_METARATING_DISABLED" rval=$? if [ "$EXPAND_SECTION_SIZE_RANGE" -eq 1 ]; then echo "[Expand Section Size Range] Restore cafemakedlf configuration to the original state." echo "[Expand Section Size Range] rm -f $MAKE_DLF_CONFIG_DEST" rm -f "$MAKE_DLF_CONFIG_DEST" fi if [ "$EXPAND_FST_MAX_SIZE" -eq 1 ]; then echo "[Expand FST] Restore cafemakedlf configuration to the original state." echo "[Expand FST] rm -f $MAKE_DLF_CONFIG_DEST" rm -f "$MAKE_DLF_CONFIG_DEST" fi if [ $rval -ne 0 ] then erase_work exit $rval fi FST_FILE="${RPX_FILE%.*}.fst.bin" if [ -f $FST_FILE ]; then FST_FILE_SIZE=(`du -b $FST_FILE`) FST_FILE_SIZE=${FST_FILE_SIZE[0]} readonly FST_MAX_SIZE=2883584 readonly FST_LIMIT_SIZE=2621440 # workaround readonly FST_OLD_MAX_SIZE=1048576 # max size in old OS echo "FST file size is ${FST_FILE_SIZE}." if ((FST_FILE_SIZE >= FST_LIMIT_SIZE && FST_FILE_SIZE <= FST_MAX_SIZE)); then add_msg "Error: FST file size is in between $FST_LIMIT_SIZE and $FST_MAX_SIZE byte." fi else add_msg "Warning: FST file $FST_FILE not found." fi # Set dlf path DLF_PATH="${RPX_PATH/%${RPX_PATH:(-4)}}.dlf" # install and update masterinfo.xml # update_masterinfo "$DEFAULT_MASTERINFO_XML" "$USER_MASTERINFO_XML" "$DATE" update_masterinfo "$DEFAULT_MASTERINFO_XML" "$USER_MASTERINFO_XML" "$DATE" "$CAFE_META_DIR/meta.xml" "$APP_XML_FILE" "$COS_XML_FILE" "$TMP_FILE" "$INDIVIDUAL_DDF_FILE" rval=$? if [ $rval -ne 0 ] then erase_work exit $rval fi MAKEMASTER_WORK_DIR=`cygpath -w -a "$TEMP_WORK_DIR"` MAKEMASTER_TOOL_ROOT=`cygpath -w -a "$CAFE_ROOT/system/bin/tool/mastering/resources"` MAKEMASTER_OUTPUT=`cygpath -w -a "$OUTPUT_FILE_NOEXT"` MAKEMASTER_MASTERINFO_XML=`cygpath -w -a "$USER_MASTERINFO_XML"` MAKEIDBE_CAFE_META_DIR=`cygpath -w -a "$CAFE_META_DIR"` METARATING_RL_ARGS=`make_metarating_rl_args_for_mastering` # Make pre-master data (archived) echo "======== Creating master archive file ========" "$MAKEIDBE" "$MAKEMASTER_MASTERINFO_XML" "$MAKEIDBE_CAFE_META_DIR/iconTex.tga" "$RPX_DIR/icon.db" update_xml_flag_section_entry_hash "$MAKEMASTER_MASTERINFO_XML" "$CAFE_META_DIR/meta.xml" if [ $MAKE_PATCH -eq 1 ] then PAST_WUMAD_WIN=`cygpath -w "$PAST_WUMAD"` # Extract past patchref.bin $EXTRACTFILE -v -nc "-od=$EXTRACTFILE_OUT_DIR" "$PAST_WUMAD_WIN" "p01.res.patchref.bin" PAST_PATCHREF="$EXTRACTFILE_OUT_DIR\pastpatchref.bin" mv "$EXTRACTFILE_OUT_DIR\p01.res.patchref.bin" "$PAST_PATCHREF" # masterinfo.xml is already extracted to check METARATING section. PAST_TITLE_KEY=$(sed -n 's|.*0x\(.*\)|\1|p' "$PAST_MASTERINFO") if [ -z "$PAST_TITLE_KEY" ]; then add_msg "Error: title key not found in ${PAST_WUMAD_WIN}." fi PAST_RATING_IMG_FLAG=$(sed -n 's|.*0x\(.*\)|\1|p' "$PAST_MASTERINFO") CURRENT_RATING_IMG_FLAG=$(sed -n 's|.*\(.*\)|\1|p' "$CAFE_META_DIR/meta.xml") if [ "$PAST_RATING_IMG_FLAG" != "$CURRENT_RATING_IMG_FLAG" ]; then add_msg "Warning: there is(are) missing/additional rating image(s) from the original wumad." fi "$MAKEPATCH" -v -nc "-wd=$MAKEMASTER_WORK_DIR" "-k=$PAST_TITLE_KEY" "$PAST_WUMAD_WIN" "$MAKEMASTER_TOOL_ROOT\\masterheader_base.bin" "$DLF_PATH" "$MAKEMASTER_MASTERINFO_XML" "$MAKEMASTER_OUTPUT".wumad "$MAKEMASTER_OUTPUT".diff "-rl=$RPX_DIR/icon.db" "-rl=$PAST_PATCHREF" $MAKE_PATCH_OPTION $METARATING_RL_ARGS "$SECTION_ENTRY_HASH_OPTION" else "$MAKEMASTER" -v -nc "-wd=$MAKEMASTER_WORK_DIR" "$DLF_PATH" "$MAKEMASTER_TOOL_ROOT\\masterheader_base.bin" "$MAKEMASTER_MASTERINFO_XML" "$MAKEMASTER_OUTPUT.wumad" "-rl=$RPX_DIR/icon.db" $METARATING_RL_ARGS "$SECTION_ENTRY_HASH_OPTION" fi rval=$? if [ $rval -ne 0 ] then erase_work exit $rval fi # Merge update partition to mastered image if [ "$INCLUDE_UPDATE_PARTITION" -eq 1 ] then echo "======== Merging system update partition ========" UPP_MASTER=`cygpath -w -a "$CAFE_ROOT/system/bin/ghs/cafe/boot/upp.wumad"` mv "$OUTPUT_FILE_NOEXT.wumad" "$TEMP_WORK_DIR/tmp.wumad" "$MAKEMASTER" -m -v -nc "-wd=$MAKEMASTER_WORK_DIR" "$MAKEMASTER_WORK_DIR\\tmp.wumad" "$UPP_MASTER" "$MAKEMASTER_OUTPUT.wumad" fi # Make full master imge if [ "$DO_MAKEDISCIMAGE" -eq 1 ] then echo "======== Creating full disc image of the master ========" "$MAKEDISCIMAGE" -v -nc "-wd=$MAKEMASTER_WORK_DIR" "$MAKEMASTER_OUTPUT.wumad" "$MAKEMASTER_OUTPUT.wum" fi # Make download image if [ "$DO_MAKEDOWNLOADIMAGE" -eq 1 ] then echo "======== Creating download image of the master ========" OUTPUT_DIR=`dirname $OUTPUT_FILE_NOEXT` "$MAKEDOWNLOADIMAGE" -i "$MAKEMASTER_OUTPUT.wumad" -w "$MAKEMASTER_WORK_DIR" -o "$OUTPUT_DIR" -z fi # Show messages show_msg # Erase settings erase_work