blob: fd84484b72a453e3f8bcb6b29c2787806bc9b8da [file] [log] [blame]
#!/bin/sh
#
# Copyright (C) 2013 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# cleanup-headers.sh
#
# This tool is used when we want to generate NDK arch headers.
# It will populate $NDK_DIR/../development/ndk/platforms/android-*/arch-$NEW_ARCH by default.
#
PROGDIR=`dirname $0`
PROGDIR=`cd $PROGDIR && pwd`
. "$PROGDIR/prebuilt-common.sh"
NDK_DIR=$ANDROID_NDK_ROOT
DEV_DIR="$NDK_DIR/../development"
register_var_option "--development-dir=<path>" DEV_DIR "Specify where the development dir is"
PROGRAM_PARAMETERS="<old-arch-name> <new-arch-name>"
PROGRAM_DESCRIPTION=\
"This tool is used when we want to generate NDK arch headers.
It will populate $NDK_DIR/../development/ndk/platforms/android-*/arch-$NEW_ARCH by default."
extract_parameters "$@"
set_parameters() {
OLD_ARCH=$1
NEW_ARCH=$2
DEV_NDK_PLATFORM_DIR=$DEV_DIR/ndk/platforms
}
set_parameters $PARAMETERS
if [ -z "$OLD_ARCH" ] || [ -z "$NEW_ARCH" ]; then
dump "[Error] Must specify old and new arch names"
exit 1
fi
if [ -n "`find $DEV_NDK_PLATFORM_DIR -type d | grep arch-$NEW_ARCH`" ]; then
log "[Warning] Already exist new arch headers. Remove it first."
for API in $API_LEVELS; do
rm -rf $DEV_NDK_PLATFORM_DIR/android-$API/arch-$NEW_ARCH
done
fi
replace() {
local HEADERS_DIR=$1
local OLD=$2
local NEW=$3
FILES="`find $HEADERS_DIR | xargs grep $OLD | awk -F ':' '{print $1}' | sort -u | xargs`"
for FILE in $FILES; do
TMP_FILE=`mktemp`
cp -a $FILE $TMP_FILE
cat $TMP_FILE | sed -e "s/$OLD/$NEW/g" > $FILE
rm -f $TMP_FILE
done
}
remove() {
local HEADERS_DIR=$1
local PATTERN=$2
local NAME=$3
FILES="`find $HEADERS_DIR | xargs grep $NAME | awk -F ':' '{print $1}' | sort -u | xargs`"
for FILE in $FILES; do
TMP_FILE=`mktemp`
cp -a $FILE $TMP_FILE
cat $TMP_FILE | sed -e "s/.*${PATTERN}.*${NAME}.*//g" > $FILE
rm -f $TMP_FILE
done
}
OLD_PATTERN=ARM
NEW_PATTERN=MACHINE
TMP_PATTERN=NDKTMPMACHINE
KEEP_NO_RENAME_STUB=
replace_stub_to_temp() {
local COMMAND=$1
if [ "$COMMAND" = "add" ]; then
local NAME=$2
KEEP_NO_RENAME_STUB="$KEEP_NO_RENAME_STUB $NAME"
elif [ "$COMMAND" = "do" ] || [ "$COMMAND" = "revert" ]; then
local DIR=$2
for stub in $KEEP_NO_RENAME_STUB; do
local new_stub=`echo $stub | sed -e "s/$OLD_PATTERN/$TMP_PATTERN/g"`
if [ "$COMMAND" = "do" ]; then
replace $DIR $stub $new_stub
else
replace $DIR $new_stub $stub
fi
done
fi
}
for API in $API_LEVELS; do
log2 "API: $API"
OLD_PLATFORM_DIR=$DEV_NDK_PLATFORM_DIR/android-$API/arch-$OLD_ARCH
NEW_PLATFORM_DIR=$DEV_NDK_PLATFORM_DIR/android-$API/arch-$NEW_ARCH
if [ -d "$OLD_PLATFORM_DIR/symbols" ]; then
run copy_directory $OLD_PLATFORM_DIR/symbols $NEW_PLATFORM_DIR/symbols
fi
if [ -d "$OLD_PLATFORM_DIR/include" ]; then
run copy_directory $OLD_PLATFORM_DIR/include $NEW_PLATFORM_DIR/include
fi
PATCH_PLATFORM_DIR=$DEV_NDK_PLATFORM_DIR/android-$API/header-patches
if [ -d "$PATCH_PLATFORM_DIR" ]; then
run rm -rf $NEW_PLATFORM_DIR/include/asm/arch
for asm_header_stem in domain dyntick fpstate glue hardware ide mtd-xip pgtable-hwdef proc-fns procinfo suspend topology vga; do
run rm -f $NEW_PLATFORM_DIR/include/asm/${asm_header_stem}.h
done
for machine_header_stem in cpu-features; do
run rm -f $NEW_PLATFORM_DIR/include/machine/${machine_header_stem}.h
done
# Some keyword should not be replaced nor droped
replace_stub_to_temp add ARMv6
replace_stub_to_temp add PARMRK
replace_stub_to_temp add __ARM_EABI__
replace_stub_to_temp add __ARMEB__
replace_stub_to_temp add __LINUX_ARM_ARCH__
replace_stub_to_temp do $NEW_PLATFORM_DIR/include
remove $NEW_PLATFORM_DIR/include "#include" glue.h
remove $NEW_PLATFORM_DIR/include "#include" arch
remove $NEW_PLATFORM_DIR/include "#include" mach
remove $NEW_PLATFORM_DIR/include "#include" domain.h
remove $NEW_PLATFORM_DIR/include "#include" pgtable-hwdef.h
remove $NEW_PLATFORM_DIR/include "#include" proc-fns.h
remove $NEW_PLATFORM_DIR/include "#define" EM_ARM
remove $NEW_PLATFORM_DIR/include "#define" MODULE_ARCH_VERMAGIC
remove $NEW_PLATFORM_DIR/include "#define" __ARM_NR_BASE
remove $NEW_PLATFORM_DIR/include "#define" __ARM_NR_breakpoint
remove $NEW_PLATFORM_DIR/include "#define" __ARM_NR_cacheflush
remove $NEW_PLATFORM_DIR/include "#define" __ARM_NR_usr26
remove $NEW_PLATFORM_DIR/include "#define" __ARM_NR_usr32
remove $NEW_PLATFORM_DIR/include "#define" __ARM_NR_set_tls
replace $NEW_PLATFORM_DIR $OLD_PATTERN $NEW_PATTERN
replace_stub_to_temp revert $NEW_PLATFORM_DIR/include
FILES="`cd $PATCH_PLATFORM_DIR && find include -type f | xargs`"
for FILE in $FILES; do
run mkdir -p $NEW_PLATFORM_DIR/`dirname $FILE`
run cp -a $PATCH_PLATFORM_DIR/$FILE $NEW_PLATFORM_DIR/$FILE
done
PATCH_FILE=$PATCH_PLATFORM_DIR/headers.patch
if [ -f "$PATCH_FILE" ]; then
cd $NEW_PLATFORM_DIR && patch -p1 -s < $PATCH_FILE
fi
fi
done