Home | History | Annotate | Download | only in tools
      1 #!/bin/sh
      2 #
      3 # Copyright (C) 2013 The Android Open Source Project
      4 #
      5 # Licensed under the Apache License, Version 2.0 (the "License");
      6 # you may not use this file except in compliance with the License.
      7 # You may obtain a copy of the License at
      8 #
      9 #      http://www.apache.org/licenses/LICENSE-2.0
     10 #
     11 # Unless required by applicable law or agreed to in writing, software
     12 # distributed under the License is distributed on an "AS IS" BASIS,
     13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14 # See the License for the specific language governing permissions and
     15 # limitations under the License.
     16 #
     17 # cleanup-headers.sh
     18 #
     19 # This tool is used when we want to generate NDK arch headers.
     20 # It will populate $NDK_DIR/../development/ndk/platforms/android-*/arch-$NEW_ARCH by default.
     21 #
     22 
     23 PROGDIR=`dirname $0`
     24 PROGDIR=`cd $PROGDIR && pwd`
     25 . "$PROGDIR/prebuilt-common.sh"
     26 NDK_DIR=$ANDROID_NDK_ROOT
     27 
     28 DEV_DIR="$NDK_DIR/../development"
     29 register_var_option "--development-dir=<path>" DEV_DIR "Specify where the development dir is"
     30 
     31 PROGRAM_PARAMETERS="<old-arch-name> <new-arch-name>"
     32 PROGRAM_DESCRIPTION=\
     33 "This tool is used when we want to generate NDK arch headers.
     34 It will populate $NDK_DIR/../development/ndk/platforms/android-*/arch-$NEW_ARCH by default."
     35 
     36 extract_parameters "$@"
     37 
     38 set_parameters() {
     39   OLD_ARCH=$1
     40   NEW_ARCH=$2
     41   DEV_NDK_PLATFORM_DIR=$DEV_DIR/ndk/platforms
     42 }
     43 
     44 set_parameters $PARAMETERS
     45 
     46 if [ -z "$OLD_ARCH" ] || [ -z "$NEW_ARCH" ]; then
     47   dump "[Error] Must specify old and new arch names"
     48   exit 1
     49 fi
     50 
     51 if [ -n "`find $DEV_NDK_PLATFORM_DIR -type d | grep arch-$NEW_ARCH`" ]; then
     52   log "[Warning] Already exist new arch headers. Remove it first."
     53   for API in $API_LEVELS; do
     54     rm -rf $DEV_NDK_PLATFORM_DIR/android-$API/arch-$NEW_ARCH
     55   done
     56 fi
     57 
     58 replace() {
     59   local HEADERS_DIR=$1
     60   local OLD=$2
     61   local NEW=$3
     62   FILES="`find $HEADERS_DIR | xargs grep $OLD | awk -F ':' '{print $1}' | sort -u | xargs`"
     63   for FILE in $FILES; do
     64     TMP_FILE=`mktemp`
     65     cp -a $FILE $TMP_FILE
     66     cat $TMP_FILE | sed -e "s/$OLD/$NEW/g" > $FILE
     67     rm -f $TMP_FILE
     68   done
     69 }
     70 
     71 remove() {
     72   local HEADERS_DIR=$1
     73   local PATTERN=$2
     74   local NAME=$3
     75   FILES="`find $HEADERS_DIR | xargs grep $NAME | awk -F ':' '{print $1}' | sort -u | xargs`"
     76   for FILE in $FILES; do
     77     TMP_FILE=`mktemp`
     78     cp -a $FILE $TMP_FILE
     79     cat $TMP_FILE | sed -e "s/.*${PATTERN}.*${NAME}.*//g" > $FILE
     80     rm -f $TMP_FILE
     81   done
     82 }
     83 
     84 OLD_PATTERN=ARM
     85 NEW_PATTERN=MACHINE
     86 TMP_PATTERN=NDKTMPMACHINE
     87 KEEP_NO_RENAME_STUB=
     88 replace_stub_to_temp() {
     89   local COMMAND=$1
     90   if [ "$COMMAND" = "add" ]; then
     91     local NAME=$2
     92     KEEP_NO_RENAME_STUB="$KEEP_NO_RENAME_STUB $NAME"
     93   elif [ "$COMMAND" = "do" ] || [ "$COMMAND" = "revert" ]; then
     94     local DIR=$2
     95     for stub in $KEEP_NO_RENAME_STUB; do
     96       local new_stub=`echo $stub | sed -e "s/$OLD_PATTERN/$TMP_PATTERN/g"`
     97       if [ "$COMMAND" = "do" ]; then
     98         replace $DIR $stub $new_stub
     99       else
    100         replace $DIR $new_stub $stub
    101       fi
    102     done
    103   fi
    104 }
    105 
    106 for API in $API_LEVELS; do
    107   log2 "API: $API"
    108   OLD_PLATFORM_DIR=$DEV_NDK_PLATFORM_DIR/android-$API/arch-$OLD_ARCH
    109   NEW_PLATFORM_DIR=$DEV_NDK_PLATFORM_DIR/android-$API/arch-$NEW_ARCH
    110   if [ -d "$OLD_PLATFORM_DIR/symbols" ]; then
    111     run copy_directory $OLD_PLATFORM_DIR/symbols $NEW_PLATFORM_DIR/symbols
    112   fi
    113   if [ -d "$OLD_PLATFORM_DIR/include" ]; then
    114     run copy_directory $OLD_PLATFORM_DIR/include $NEW_PLATFORM_DIR/include
    115   fi
    116 
    117   PATCH_PLATFORM_DIR=$DEV_NDK_PLATFORM_DIR/android-$API/header-patches
    118   if [ -d "$PATCH_PLATFORM_DIR" ]; then
    119     run rm -rf $NEW_PLATFORM_DIR/include/asm/arch
    120     for asm_header_stem in domain dyntick fpstate glue hardware ide mtd-xip pgtable-hwdef proc-fns procinfo suspend topology vga; do
    121       run rm -f $NEW_PLATFORM_DIR/include/asm/${asm_header_stem}.h
    122     done
    123     for machine_header_stem in cpu-features; do
    124       run rm -f $NEW_PLATFORM_DIR/include/machine/${machine_header_stem}.h
    125     done
    126 
    127     # Some keyword should not be replaced nor droped
    128     replace_stub_to_temp add ARMv6
    129     replace_stub_to_temp add PARMRK
    130     replace_stub_to_temp add __ARM_EABI__
    131     replace_stub_to_temp add __ARMEB__
    132     replace_stub_to_temp add __LINUX_ARM_ARCH__
    133     replace_stub_to_temp do $NEW_PLATFORM_DIR/include
    134 
    135     remove $NEW_PLATFORM_DIR/include "#include" glue.h
    136     remove $NEW_PLATFORM_DIR/include "#include" arch
    137     remove $NEW_PLATFORM_DIR/include "#include" mach
    138     remove $NEW_PLATFORM_DIR/include "#include" domain.h
    139     remove $NEW_PLATFORM_DIR/include "#include" pgtable-hwdef.h
    140     remove $NEW_PLATFORM_DIR/include "#include" proc-fns.h
    141 
    142     remove $NEW_PLATFORM_DIR/include "#define" EM_ARM
    143     remove $NEW_PLATFORM_DIR/include "#define" MODULE_ARCH_VERMAGIC
    144     remove $NEW_PLATFORM_DIR/include "#define" __ARM_NR_BASE
    145     remove $NEW_PLATFORM_DIR/include "#define" __ARM_NR_breakpoint
    146     remove $NEW_PLATFORM_DIR/include "#define" __ARM_NR_cacheflush
    147     remove $NEW_PLATFORM_DIR/include "#define" __ARM_NR_usr26
    148     remove $NEW_PLATFORM_DIR/include "#define" __ARM_NR_usr32
    149     remove $NEW_PLATFORM_DIR/include "#define" __ARM_NR_set_tls
    150 
    151     replace $NEW_PLATFORM_DIR $OLD_PATTERN $NEW_PATTERN
    152     replace_stub_to_temp revert $NEW_PLATFORM_DIR/include
    153 
    154     FILES="`cd $PATCH_PLATFORM_DIR && find include -type f | xargs`"
    155     for FILE in $FILES; do
    156       run mkdir -p $NEW_PLATFORM_DIR/`dirname $FILE`
    157       run cp -a $PATCH_PLATFORM_DIR/$FILE $NEW_PLATFORM_DIR/$FILE
    158     done
    159 
    160     PATCH_FILE=$PATCH_PLATFORM_DIR/headers.patch
    161     if [ -f "$PATCH_FILE" ]; then
    162       cd $NEW_PLATFORM_DIR && patch -p1 -s < $PATCH_FILE
    163     fi
    164   fi
    165 done
    166