15fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#!/bin/bash
25fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#
35fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# Copyright (C) 2009 The Android Open Source Project
45fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#
55fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# Licensed under the Apache License, Version 2.0 (the "License");
65fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# you may not use this file except in compliance with the License.
75fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# You may obtain a copy of the License at
85fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#
95fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#      http://www.apache.org/licenses/LICENSE-2.0
105fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#
115fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# Unless required by applicable law or agreed to in writing, software
125fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# distributed under the License is distributed on an "AS IS" BASIS,
135fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# See the License for the specific language governing permissions and
155fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# limitations under the License.
165fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#
175fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
185fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#
195fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# This script imports new versions of scrypt (http://www.tarsnap.com/scrypt/) into the
205fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# Android source tree.  To run, (1) fetch the appropriate tarball from the scrypt repository,
215fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# (2) check the gpg/pgp signature, and then (3) run:
225fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#   ./import_scrypt.sh import scrypt-*.tar.gz
235fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#
245fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# IMPORTANT: See README.android for additional details.
255fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
265fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# turn on exit on error as well as a warning when it happens
275fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootset -e
285fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootset -x
295fd6d3161cc7407718c7e230f94db421543273b8Kenny Roottrap  "echo WARNING: Exiting on non-zero subprocess exit code" ERR;
305fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
315fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# Ensure consistent sorting order / tool output.
325fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootexport LANG=C
335fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootexport LC_ALL=C
345fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
355fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootexport DIRNAME=$(dirname $0)
365fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
375fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootfunction die() {
385fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  declare -r message=$1
395fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
405fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  echo $message
415fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  exit 1
425fd6d3161cc7407718c7e230f94db421543273b8Kenny Root}
435fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
445fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootfunction usage() {
455fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  declare -r message=$1
465fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
475fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  if [ ! "$message" = "" ]; then
485fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    echo $message
495fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  fi
505fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  echo "Usage:"
515fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  echo "  ./import_scrypt.sh import </path/to/scrypt-*.tar.gz>"
525fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  echo "  ./import_scrypt.sh regenerate <patch/*.patch>"
535fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  echo "  ./import_scrypt.sh generate <patch/*.patch> </path/to/scrypt-*.tar.gz>"
545fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  exit 1
555fd6d3161cc7407718c7e230f94db421543273b8Kenny Root}
565fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
575fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootfunction main() {
585fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  if [ ! -d patches ]; then
595fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    die "scrypt patch directory patches/ not found"
605fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  fi
615fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
625fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  if [ ! -f scrypt.version ]; then
635fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    die "scrypt.version not found"
645fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  fi
655fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
665fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  source $DIRNAME/scrypt.version
675fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  if [ "$SCRYPT_VERSION" == "" ]; then
685fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    die "Invalid scrypt.version; see README.android for more information"
695fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  fi
705fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
715fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  SCRYPT_DIR=scrypt-$SCRYPT_VERSION
725fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  SCRYPT_DIR_ORIG=$SCRYPT_DIR.orig
735fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
745fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  if [ ! -f scrypt.config ]; then
755fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    die "scrypt.config not found"
765fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  fi
775fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
785fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  source $DIRNAME/scrypt.config
795fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  if [ "$CONFIGURE_ARGS" == "" -o "$UNNEEDED_SOURCES" == "" -o "$NEEDED_SOURCES" == "" ]; then
805fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    die "Invalid scrypt.config; see README.android for more information"
815fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  fi
825fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
835fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  declare -r command=$1
845fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  shift || usage "No command specified. Try import, regenerate, or generate."
855fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  if [ "$command" = "import" ]; then
865fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    declare -r tar=$1
875fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    shift || usage "No tar file specified."
885fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    import $tar
895fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  elif [ "$command" = "regenerate" ]; then
905fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    declare -r patch=$1
915fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    shift || usage "No patch file specified."
925fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    [ -d $SCRYPT_DIR ] || usage "$SCRYPT_DIR not found, did you mean to use generate?"
935fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    [ -d $SCRYPT_DIR_ORIG_ORIG ] || usage "$SCRYPT_DIR_ORIG not found, did you mean to use generate?"
945fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    regenerate $patch
955fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  elif [ "$command" = "generate" ]; then
965fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    declare -r patch=$1
975fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    shift || usage "No patch file specified."
985fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    declare -r tar=$1
995fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    shift || usage "No tar file specified."
1005fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    generate $patch $tar
1015fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  else
1025fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    usage "Unknown command specified $command. Try import, regenerate, or generate."
1035fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  fi
1045fd6d3161cc7407718c7e230f94db421543273b8Kenny Root}
1055fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
1065fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# Compute the name of an assembly source file generated by one of the
1075fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# gen_asm_xxxx() functions below. The logic is the following:
1085fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# - if "$2" is not empty, output it directly
1095fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# - otherwise, change the file extension of $1 from .pl to .S and output
1105fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#   it.
1115fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# Usage: default_asm_file "$1" "$2"
1125fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#     or default_asm_file "$@"
1135fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#
1145fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# $1: generator path (perl script)
1155fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# $2: optional output file name.
1165fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootfunction default_asm_file () {
1175fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  if [ "$2" ]; then
1185fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    echo "$2"
1195fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  else
1205fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    echo "${1%%.pl}.S"
1215fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  fi
1225fd6d3161cc7407718c7e230f94db421543273b8Kenny Root}
1235fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
1245fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# Generate an ARM assembly file.
1255fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# $1: generator (perl script)
1265fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# $2: [optional] output file name
1275fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootfunction gen_asm_arm () {
1285fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  local OUT
1295fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  OUT=$(default_asm_file "$@")
1305fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  perl "$1" > "$OUT"
1315fd6d3161cc7407718c7e230f94db421543273b8Kenny Root}
1325fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
1335fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootfunction gen_asm_mips () {
1345fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  local OUT
1355fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  OUT=$(default_asm_file "$@")
1365fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  # The perl scripts expect to run the target compiler as $CC to determine
1375fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  # the endianess of the target. Setting CC to true is a hack that forces the scripts
1385fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  # to generate little endian output
1395fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  CC=true perl "$1" o32 > "$OUT"
1405fd6d3161cc7407718c7e230f94db421543273b8Kenny Root}
1415fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
1425fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootfunction gen_asm_x86 () {
1435fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  local OUT
1445fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  OUT=$(default_asm_file "$@")
1455fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  perl "$1" elf -fPIC > "$OUT"
1465fd6d3161cc7407718c7e230f94db421543273b8Kenny Root}
1475fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
1485fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootfunction gen_asm_x86_64 () {
1495fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  local OUT
1505fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  OUT=$(default_asm_file "$@")
1515fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  perl "$1" elf "$OUT" > "$OUT"
1525fd6d3161cc7407718c7e230f94db421543273b8Kenny Root}
1535fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
1545fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
1555fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# Filter all items in a list that match a given pattern.
1565fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# $1: space-separated list
1575fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# $2: egrep pattern.
1585fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# Out: items in $1 that match $2
1595fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootfunction filter_by_egrep() {
1605fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  declare -r pattern=$1
1615fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  shift
1625fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  echo "$@" | tr ' ' '\n' | grep -e "$pattern" | tr '\n' ' '
1635fd6d3161cc7407718c7e230f94db421543273b8Kenny Root}
1645fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
1655fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# Sort and remove duplicates in a space-separated list
1665fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# $1: space-separated list
1675fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# Out: new space-separated list
1685fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootfunction uniq_sort () {
1695fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  echo "$@" | tr ' ' '\n' | sort -u | tr '\n' ' '
1705fd6d3161cc7407718c7e230f94db421543273b8Kenny Root}
1715fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
1725fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootfunction print_autogenerated_header() {
1735fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  echo "# Auto-generated - DO NOT EDIT!"
1745fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  echo "# To regenerate, edit scrypt.config, then run:"
1755fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  echo "#     ./import_scrypt.sh import /path/to/scrypt-$SCRYPT_VERSION.tar.gz"
1765fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  echo "#"
1775fd6d3161cc7407718c7e230f94db421543273b8Kenny Root}
1785fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
1795fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootfunction generate_build_config_mk() {
1805fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  ./configure $CONFIGURE_ARGS
1815fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  #rm -f apps/CA.pl.bak crypto/scryptconf.h.bak
1825fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
1835fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  declare -r tmpfile=$(mktemp)
1845fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  (grep -e -D Makefile | grep -v CONFIGURE_ARGS= | grep -v OPTIONS=) > $tmpfile
1855fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
1865fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  declare -r cflags=$(filter_by_egrep "^-D" $(grep -e "^CFLAG=" $tmpfile))
1875fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  declare -r depflags=$(filter_by_egrep "^-D" $(grep -e "^DEPFLAG=" $tmpfile))
1885fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  rm -f $tmpfile
1895fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
1905fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  echo "Generating $(basename $1)"
1915fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  (
1925fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    print_autogenerated_header
1935fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
1945fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    echo "scrypt_cflags := \\"
1955fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    for cflag in $cflags $depflags; do
1965fd6d3161cc7407718c7e230f94db421543273b8Kenny Root      echo "  $cflag \\"
1975fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    done
1985fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    echo ""
1995fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  ) > $1
2005fd6d3161cc7407718c7e230f94db421543273b8Kenny Root}
2015fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
2025fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# Return the value of a computed variable name.
2035fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# E.g.:
2045fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#   FOO=foo
2055fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#   BAR=bar
2065fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#   echo $(var_value FOO_$BAR)   -> prints the value of ${FOO_bar}
2075fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# $1: Variable name
2085fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# Out: variable value
2095fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootvar_value() {
2105fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  # Note: don't use 'echo' here, because it's sensitive to values
2115fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  #       that begin with an underscore (e.g. "-n")
2125fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  eval printf \"%s\\n\" \$$1
2135fd6d3161cc7407718c7e230f94db421543273b8Kenny Root}
2145fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
2155fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# Same as var_value, but returns sorted output without duplicates.
2165fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# $1: Variable name
2175fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# Out: variable value (if space-separated list, sorted with no duplicates)
2185fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootvar_sorted_value() {
2195fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  uniq_sort $(var_value $1)
2205fd6d3161cc7407718c7e230f94db421543273b8Kenny Root}
2215fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
2225fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# Print the definition of a given variable in a GNU Make build file.
2235fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# $1: Variable name (e.g. common_src_files)
2245fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# $2+: Variable value (e.g. list of sources)
2255fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootprint_vardef_in_mk() {
2265fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  declare -r varname=$1
2275fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  shift
2285fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  if [ -z "$1" ]; then
2295fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    echo "$varname :="
2305fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  else
2315fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    echo "$varname := \\"
2325fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    for src; do
2335fd6d3161cc7407718c7e230f94db421543273b8Kenny Root      echo "  $src \\"
2345fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    done
2355fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  fi
2365fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  echo ""
2375fd6d3161cc7407718c7e230f94db421543273b8Kenny Root}
2385fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
2395fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# Same as print_vardef_in_mk, but print a CFLAGS definition from
2405fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# a list of compiler defines.
2415fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# $1: Variable name (e.g. common_c_flags)
2425fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# $2: List of defines (e.g. SCRYPT_NO_DONKEYS ...)
2435fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootprint_defines_in_mk() {
2445fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  declare -r varname=$1
2455fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  shift
2465fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  if [ -z "$1" ]; then
2475fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    echo "$varname :="
2485fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  else
2495fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    echo "$varname := \\"
2505fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    for def; do
2515fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    echo "  -D$def \\"
2525fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    done
2535fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  fi
2545fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  echo ""
2555fd6d3161cc7407718c7e230f94db421543273b8Kenny Root}
2565fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
2575fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# Generate a configuration file like Scrypt-config.mk
2585fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# This uses variable definitions from scrypt.config to build a config
2595fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# file that can compute the list of target- and host-specific sources /
2605fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# compiler flags for a given component.
2615fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#
2625fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# $1: Target file name.  (e.g. Scrypt-config.mk)
2635fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootfunction generate_config_mk() {
2645fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  declare -r output="$1"
2655a43d1928da29b4ec7b911fe865ed78ee3c2ca26Kenny Root  declare -r all_archs="arm arm_neon x86 x86_64 mips"
2665fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
2675fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  echo "Generating $(basename $output)"
2685fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  (
2695fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    print_autogenerated_header
2705fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    echo \
2715fd6d3161cc7407718c7e230f94db421543273b8Kenny Root"# Before including this file, the local Android.mk must define the following
2725fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# variables:
2735fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#
2745fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#    local_c_flags
2755fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#    local_c_includes
2765fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#    local_additional_dependencies
2775fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#
2785fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# This script will define the following variables:
2795fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#
2805fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#    target_c_flags
2815fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#    target_c_includes
2825fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#    target_src_files
2835fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#
2845fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#    host_c_flags
2855fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#    host_c_includes
2865fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#    host_src_files
2875fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#
2885fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
2895fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# Ensure these are empty.
2905fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootunknown_arch_c_flags :=
2915fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootunknown_arch_src_files :=
2925fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootunknown_arch_exclude_files :=
2935fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
2945fd6d3161cc7407718c7e230f94db421543273b8Kenny Root"
2955fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    common_defines=$(var_sorted_value SCRYPT_DEFINES)
2965fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    print_defines_in_mk common_c_flags $common_defines
2975fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
2985fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    common_sources=$(var_sorted_value SCRYPT_SOURCES)
2995fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    print_vardef_in_mk common_src_files $common_sources
3005fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
3015fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    common_includes=$(var_sorted_value SCRYPT_INCLUDES)
3025fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    print_vardef_in_mk common_c_includes $common_includes
3035fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
3045fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    for arch in $all_archs; do
3055fd6d3161cc7407718c7e230f94db421543273b8Kenny Root      arch_defines=$(var_sorted_value SCRYPT_DEFINES_${arch})
3065fd6d3161cc7407718c7e230f94db421543273b8Kenny Root      print_defines_in_mk ${arch}_c_flags $arch_defines
3075fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
3085fd6d3161cc7407718c7e230f94db421543273b8Kenny Root      arch_sources=$(var_sorted_value SCRYPT_SOURCES_${arch})
3095fd6d3161cc7407718c7e230f94db421543273b8Kenny Root      print_vardef_in_mk ${arch}_src_files $arch_sources
3105fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
3115fd6d3161cc7407718c7e230f94db421543273b8Kenny Root      arch_exclude_sources=$(var_sorted_value SCRYPT_SOURCES_EXCLUDES_${arch})
3125fd6d3161cc7407718c7e230f94db421543273b8Kenny Root      print_vardef_in_mk ${arch}_exclude_files $arch_exclude_sources
3135fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
3145fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    done
3155fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
3165fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    echo "\
3175fd6d3161cc7407718c7e230f94db421543273b8Kenny Roottarget_arch := \$(TARGET_ARCH)
3185fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootifeq (\$(target_arch)-\$(TARGET_HAS_BIGENDIAN),mips-true)
3195fd6d3161cc7407718c7e230f94db421543273b8Kenny Roottarget_arch := unknown_arch
3205fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootendif
3215fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
3225fd6d3161cc7407718c7e230f94db421543273b8Kenny Roottarget_c_flags    := \$(common_c_flags) \$(\$(target_arch)_c_flags) \$(local_c_flags)
3235fd6d3161cc7407718c7e230f94db421543273b8Kenny Roottarget_c_includes := \$(addprefix external/scrypt/,\$(common_c_includes)) \$(local_c_includes)
3245fd6d3161cc7407718c7e230f94db421543273b8Kenny Roottarget_src_files  := \$(common_src_files) \$(\$(target_arch)_src_files)
3255fd6d3161cc7407718c7e230f94db421543273b8Kenny Roottarget_src_files  := \$(filter-out \$(\$(target_arch)_exclude_files), \$(target_src_files))
3265fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
3275a43d1928da29b4ec7b911fe865ed78ee3c2ca26Kenny Root# Hacks for ARM NEON support
3285a43d1928da29b4ec7b911fe865ed78ee3c2ca26Kenny Rootifeq (\$(target_arch),arm)
3295a43d1928da29b4ec7b911fe865ed78ee3c2ca26Kenny Rootifeq (\$(ARCH_ARM_HAVE_NEON),true)
3305a43d1928da29b4ec7b911fe865ed78ee3c2ca26Kenny Roottarget_c_flags   += \$(arm_neon_c_flags)
3315a43d1928da29b4ec7b911fe865ed78ee3c2ca26Kenny Roottarget_src_files += \$(arm_neon_src_files)
3325a43d1928da29b4ec7b911fe865ed78ee3c2ca26Kenny Roottarget_src_files := \$(filter-out \$(arm_neon_exclude_files), \$(target_src_files))
3335a43d1928da29b4ec7b911fe865ed78ee3c2ca26Kenny Rootendif
3345a43d1928da29b4ec7b911fe865ed78ee3c2ca26Kenny Rootendif
3355a43d1928da29b4ec7b911fe865ed78ee3c2ca26Kenny Root
3365fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootifeq (\$(HOST_OS)-\$(HOST_ARCH),linux-x86)
3375fd6d3161cc7407718c7e230f94db421543273b8Kenny Roothost_arch := x86
3385fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootelse
3395fd6d3161cc7407718c7e230f94db421543273b8Kenny Roothost_arch := unknown_arch
3405fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootendif
3415fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
3425fd6d3161cc7407718c7e230f94db421543273b8Kenny Roothost_c_flags    := \$(common_c_flags) \$(\$(host_arch)_c_flags) \$(local_c_flags)
3435fd6d3161cc7407718c7e230f94db421543273b8Kenny Roothost_c_includes := \$(addprefix external/scrypt/,\$(common_c_includes)) \$(local_c_includes)
3445fd6d3161cc7407718c7e230f94db421543273b8Kenny Roothost_src_files  := \$(common_src_files) \$(\$(host_arch)_src_files)
3455fd6d3161cc7407718c7e230f94db421543273b8Kenny Roothost_src_files  := \$(filter-out \$(\$(host_arch)_exclude_files), \$(host_src_files))
3465fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
3475fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootlocal_additional_dependencies += \$(LOCAL_PATH)/$(basename $output)
3485fd6d3161cc7407718c7e230f94db421543273b8Kenny Root"
3495fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
3505fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  ) > "$output"
3515fd6d3161cc7407718c7e230f94db421543273b8Kenny Root}
3525fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
3535fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootfunction import() {
3545fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  declare -r SCRYPT_SOURCE=$1
3555fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
3565fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  untar $SCRYPT_SOURCE readonly
3575fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  applypatches $SCRYPT_DIR
3585fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
3595fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  cd $SCRYPT_DIR
3605fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
3615fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  generate_build_config_mk ../build-config.mk
3625fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
3635fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  touch ../MODULE_LICENSE_BSD_LIKE
3645fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
3655fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  cd ..
3665fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
3675fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  generate_config_mk Scrypt-config.mk
3685fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
3695fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  # Prune unnecessary sources
3705fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  prune
3715fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
3725fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  NEEDED_SOURCES="$NEEDED_SOURCES"
3735fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  for i in $NEEDED_SOURCES; do
3745fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    echo "Updating $i"
3755fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    rm -r $i
3765fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    mv $SCRYPT_DIR/$i .
3775fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  done
3785fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
3795fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  cleantar
3805fd6d3161cc7407718c7e230f94db421543273b8Kenny Root}
3815fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
3825fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootfunction regenerate() {
3835fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  declare -r patch=$1
3845fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
3855fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  generatepatch $patch
3865fd6d3161cc7407718c7e230f94db421543273b8Kenny Root}
3875fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
3885fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootfunction generate() {
3895fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  declare -r patch=$1
3905fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  declare -r SCRYPT_SOURCE=$2
3915fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
3925fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  untar $SCRYPT_SOURCE
3935fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  applypatches $SCRYPT_DIR_ORIG $patch
3945fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  prune
3955fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
3965fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  for i in $NEEDED_SOURCES; do
3975fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    echo "Restoring $i"
3985fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    rm -r $SCRYPT_DIR/$i
3995fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    cp -rf $i $SCRYPT_DIR/$i
4005fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  done
4015fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
4025fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  generatepatch $patch
4035fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  cleantar
4045fd6d3161cc7407718c7e230f94db421543273b8Kenny Root}
4055fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
4065fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# Find all files in a sub-directory that are encoded in ISO-8859
4075fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# $1: Directory.
4085fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# Out: list of files in $1 that are encoded as ISO-8859.
4095fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootfunction find_iso8859_files() {
4105fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  find $1 -type f -print0 | xargs -0 file | fgrep "ISO-8859" | cut -d: -f1
4115fd6d3161cc7407718c7e230f94db421543273b8Kenny Root}
4125fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
4135fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# Convert all ISO-8859 files in a given subdirectory to UTF-8
4145fd6d3161cc7407718c7e230f94db421543273b8Kenny Root# $1: Directory name
4155fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootfunction convert_iso8859_to_utf8() {
4165fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  declare -r iso_files=$(find_iso8859_files "$1")
4175fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  for iso_file in $iso_files; do
4185fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    iconv --from-code iso-8859-1 --to-code utf-8 $iso_file > $iso_file.tmp
4195fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    rm -f $iso_file
4205fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    mv $iso_file.tmp $iso_file
4215fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  done
4225fd6d3161cc7407718c7e230f94db421543273b8Kenny Root}
4235fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
4245fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootfunction untar() {
4255fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  declare -r SCRYPT_SOURCE=$1
4265fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  declare -r readonly=$2
4275fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
4285fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  # Remove old source
4295fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  cleantar
4305fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
4315fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  # Process new source
4325fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  tar -zxf $SCRYPT_SOURCE
4335fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  convert_iso8859_to_utf8 $SCRYPT_DIR
4345fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  cp -rfP $SCRYPT_DIR $SCRYPT_DIR_ORIG
4355fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  if [ ! -z $readonly ]; then
4365fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    find $SCRYPT_DIR_ORIG -type f -print0 | xargs -0 chmod a-w
4375fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  fi
4385fd6d3161cc7407718c7e230f94db421543273b8Kenny Root}
4395fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
4405fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootfunction prune() {
4415fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  echo "Removing $UNNEEDED_SOURCES"
4425fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  (cd $SCRYPT_DIR_ORIG && rm -rf $UNNEEDED_SOURCES)
4435fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  (cd $SCRYPT_DIR      && rm -r  $UNNEEDED_SOURCES)
4445fd6d3161cc7407718c7e230f94db421543273b8Kenny Root}
4455fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
4465fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootfunction cleantar() {
4475fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  rm -rf $SCRYPT_DIR_ORIG
4485fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  rm -rf $SCRYPT_DIR
4495fd6d3161cc7407718c7e230f94db421543273b8Kenny Root}
4505fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
4515fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootfunction applypatches () {
4525fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  declare -r dir=$1
4535fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  declare -r skip_patch=$2
4545fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
4555fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  cd $dir
4565fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
4575fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  # Apply appropriate patches
4585fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  for i in $SCRYPT_PATCHES; do
4595fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    if [ ! "$skip_patch" = "patches/$i" ]; then
4605fd6d3161cc7407718c7e230f94db421543273b8Kenny Root      echo "Applying patch $i"
4615fd6d3161cc7407718c7e230f94db421543273b8Kenny Root      patch -p1 --merge < ../patches/$i || die "Could not apply patches/$i. Fix source and run: $0 regenerate patches/$i"
4625fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    else
4635fd6d3161cc7407718c7e230f94db421543273b8Kenny Root      echo "Skiping patch $i"
4645fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    fi
4655fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
4665fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  done
4675fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
4685fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  # Cleanup patch output
4695fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  find . \( -type f -o -type l \) -name "*.orig" -print0 | xargs -0 rm -f
4705fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
4715fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  cd ..
4725fd6d3161cc7407718c7e230f94db421543273b8Kenny Root}
4735fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
4745fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootfunction generatepatch() {
4755fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  declare -r patch=$1
4765fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
4775fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  # Cleanup stray files before generating patch
4785fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  find $SCRYPT_DIR -type f -name "*.orig" -print0 | xargs -0 rm -f
4795fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  find $SCRYPT_DIR -type f -name "*~" -print0 | xargs -0 rm -f
4805fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
4815fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  declare -r variable_name=SCRYPT_PATCHES_`basename $patch .patch | sed s/-/_/`_SOURCES
4825fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  # http://tldp.org/LDP/abs/html/ivr.html
4835fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  eval declare -r sources=\$$variable_name
4845fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  rm -f $patch
4855fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  touch $patch
4865fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  for i in $sources; do
4875fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    LC_ALL=C TZ=UTC0 diff -aup $SCRYPT_DIR_ORIG/$i $SCRYPT_DIR/$i >> $patch && die "ERROR: No diff for patch $path in file $i"
4885fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  done
4895fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  echo "Generated patch $patch"
4905fd6d3161cc7407718c7e230f94db421543273b8Kenny Root  echo "NOTE To make sure there are not unwanted changes from conflicting patches, be sure to review the generated patch."
4915fd6d3161cc7407718c7e230f94db421543273b8Kenny Root}
4925fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
4935fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootmain $@
494