Home | History | Annotate | Download | only in tools
      1 #!/bin/sh
      2 #
      3 # Copyright (C) 2010 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 # build-platforms.sh
     18 #
     19 # This tool is used when packaging a new release, or when developing
     20 # the NDK itself. It will populate DST ($NDK/platforms by default)
     21 # with the content of SRC ($NDK/../development/ndk/platforms/ by default).
     22 #
     23 # The idea is that the content of $SRC/android-N/ only contains stuff
     24 # that is relevant to API level N, and not contain anything that is already
     25 # provided by API level N-1, N-2, etc..
     26 #
     27 # More precisely, for each architecture A:
     28 #  $SRC/android-N/include        --> $DST/android-N/arch-A/usr/include
     29 #  $SRC/android-N/arch-A/include --> $DST/android-N/arch-A/usr/include
     30 #  $SRC/android-N/arch-A/lib     --> $DST/android-N/arch-A/usr/lib
     31 #
     32 # For backwards compatibility:
     33 #  $SRC/android-N/arch-A/usr/include --> $DST/android-N/arch-A/usr/include
     34 #  $SRC/android-N/arch-A/usr/lib     --> $DST/android-N/arch-A/usr/lib
     35 #
     36 # Repeat after that for N+1, N+2, etc..
     37 #
     38 
     39 . `dirname $0`/prebuilt-common.sh
     40 
     41 # Return the list of platform supported from $1/platforms
     42 # as a single space-separated list of levels. (e.g. "3 4 5 8 9")
     43 # $1: source directory
     44 extract_platforms_from ()
     45 {
     46     if [ -d "$1" ] ; then
     47         (cd "$1/platforms" && ls -d android-*) | sed -e "s!android-!!" | sort -g | tr '\n' ' '
     48     else
     49         echo ""
     50     fi
     51 }
     52 
     53 SRCDIR="../development/ndk"
     54 DSTDIR="$ANDROID_NDK_ROOT"
     55 
     56 ARCHS="arm"
     57 PLATFORMS=`extract_platforms_from "$SRCDIR"`
     58 
     59 OPTION_HELP=no
     60 OPTION_PLATFORMS=
     61 OPTION_SRCDIR=
     62 OPTION_DSTDIR=
     63 OPTION_NO_SAMPLES=no
     64 OPTION_NO_SYMLINKS=no
     65 OPTION_ARCH=
     66 OPTION_ABI=
     67 
     68 VERBOSE=no
     69 VERBOSE2=no
     70 
     71 for opt do
     72   optarg=`expr "x$opt" : 'x[^=]*=\(.*\)'`
     73   case "$opt" in
     74   --help|-h|-\?) OPTION_HELP=yes
     75   ;;
     76   --verbose)
     77     if [ "$VERBOSE" = "yes" ] ; then
     78         VERBOSE2=yes
     79     else
     80         VERBOSE=yes
     81     fi
     82     ;;
     83   --src-dir=*)
     84     OPTION_SRCDIR="$optarg"
     85     ;;
     86   --dst-dir=*)
     87     OPTION_DSTDIR="$optarg"
     88     ;;
     89   --platform=*)
     90     OPTION_PLATFORM=$optarg
     91     ;;
     92   --arch=*)
     93     OPTION_ARCH=$optarg
     94     ;;
     95   --abi=*)  # We still support this for backwards-compatibility
     96     OPTION_ABI=$optarg
     97     ;;
     98   --no-samples)
     99     OPTION_NO_SAMPLES=yes
    100     ;;
    101   --no-symlinks)
    102     OPTION_NO_SYMLINKS=yes
    103     ;;
    104   *)
    105     echo "unknown option '$opt', use --help"
    106     exit 1
    107   esac
    108 done
    109 
    110 if [ $OPTION_HELP = "yes" ] ; then
    111     echo "Collect files from an Android NDK development tree and assemble"
    112     echo "the platform files appropriately into a final release structure."
    113     echo ""
    114     echo "options:"
    115     echo ""
    116     echo "  --help             Print this message"
    117     echo "  --verbose          Enable verbose messages"
    118     echo "  --src-dir=<path>   Source directory for development platform files [$SRCDIR]"
    119     echo "  --dst-dir=<path>   Destination directory [$DSTDIR]"
    120     echo "  --platform=<list>  List of API levels [$PLATFORMS]"
    121     echo "  --arch=<list>      List of CPU architectures [$ARCHS]"
    122     echo "  --no-samples       Ignore samples"
    123     echo "  --no-symlinks      Don't create symlinks, copy files instead"
    124     echo ""
    125     exit 0
    126 fi
    127 
    128 if [ -n "$OPTION_SRCDIR" ] ; then
    129     SRCDIR="$OPTION_SRCDIR";
    130     if [ ! -d "$SRCDIR" ] ; then
    131         echo "ERROR: Source directory $SRCDIR does not exist !"
    132         exit 1
    133     fi
    134     if [ ! -d "$SRCDIR/platforms/android-3" ] ; then
    135         echo "ERROR: Invalid source directory: $SRCDIR"
    136         echo "Please make sure it contains platforms/android-3 etc..."
    137         exit 1
    138     fi
    139 else
    140     SRCDIR=`dirname $ANDROID_NDK_ROOT`/development/ndk
    141     log "Using source directory: $SRCDIR"
    142 fi
    143 
    144 if [ -n "$OPTION_PLATFORM" ] ; then
    145     PLATFORMS=$(commas_to_spaces $OPTION_PLATFORM)
    146 else
    147     # Build the list from the content of SRCDIR
    148     PLATFORMS=`extract_platforms_from "$SRCDIR"`
    149     log "Using platforms: $PLATFORMS"
    150 fi
    151 
    152 # Remove the android- prefix of any platform name
    153 PLATFORMS=$(echo $PLATFORMS | tr ' ' '\n' | sed -e 's!android-!!g' | tr '\n' ' ')
    154 
    155 if [ -n "$OPTION_DSTDIR" ] ; then
    156     DSTDIR="$OPTION_DSTDIR"
    157 else
    158     log "Using destination directory: $DSTDIR"
    159 fi
    160 
    161 # Handle architecture list
    162 #
    163 # We support both --arch and --abi for backwards compatibility reasons
    164 # --arch is the new hotness, --abi is deprecated.
    165 #
    166 if [ -n "$OPTION_ARCH" ]; then
    167     OPTION_ARCH=$(commas_to_spaces $OPTION_ARCH)
    168 fi
    169 
    170 if [ -n "$OPTION_ABI" ] ; then
    171     echo "WARNING: --abi=<names> is deprecated. Use --arch=<names> instead!"
    172     OPTION_ABI=$(commas_to_spaces $OPTION_ABI)
    173     if [ -n "$OPTION_ARCH" -a "$OPTION_ARCH" != "$OPTION_ABI" ]; then
    174         echo "ERROR: You can't use both --abi and --arch with different values!"
    175         exit 1
    176     fi
    177     OPTION_ARCH=$OPTION_ABI
    178 fi
    179 
    180 if [ -n "$OPTION_ARCH" ] ; then
    181     ARCHS="$OPTION_ARCH"
    182 fi
    183 log "Using architectures: $(commas_to_spaces $ARCHS)"
    184 
    185 log "Checking source platforms."
    186 for PLATFORM in $PLATFORMS; do
    187     DIR="$SRCDIR/platforms/android-$PLATFORM"
    188     if [ ! -d $DIR ] ; then
    189         echo "ERROR: Directory missing: $DIR"
    190         echo "Please check your --platform=<list> option and try again."
    191         exit 2
    192     else
    193         log "  $DIR"
    194     fi
    195 done
    196 
    197 log "Checking source platform architectures."
    198 BAD_ARCHS=
    199 for ARCH in $ARCHS; do
    200     eval CHECK_$ARCH=no
    201 done
    202 for PLATFORM in $PLATFORMS; do
    203     for ARCH in $ARCHS; do
    204         DIR="$SRCDIR/platforms/android-$PLATFORM/arch-$ARCH"
    205         if [ -d $DIR ] ; then
    206             log "  $DIR"
    207             eval CHECK_$ARCH=yes
    208         fi
    209     done
    210 done
    211 
    212 BAD_ARCHS=
    213 for ARCH in $ARCHS; do
    214     CHECK=`var_value CHECK_$ARCH`
    215     log "  $ARCH check: $CHECK"
    216     if [ "$CHECK" = no ] ; then
    217         if [ -z "$BAD_ARCHS" ] ; then
    218             BAD_ARCHS=$ARCH
    219         else
    220             BAD_ARCHS="$BAD_ARCHS $ARCH"
    221         fi
    222     fi
    223 done
    224 
    225 if [ -n "$BAD_ARCHS" ] ; then
    226     echo "ERROR: Source directory doesn't support these ARCHs: $BAD_ARCHS"
    227     exit 3
    228 fi
    229 
    230 # $1: source directory (relative to $SRCDIR)
    231 # $2: destination directory (relative to $DSTDIR)
    232 # $3: description of directory contents (e.g. "sysroot" or "samples")
    233 copy_src_directory ()
    234 {
    235     local SDIR="$SRCDIR/$1"
    236     local DDIR="$DSTDIR/$2"
    237     if [ -d "$SDIR" ] ; then
    238         log "Copying $3 from \$SRC/$1 to \$DST/$2."
    239         mkdir -p "$DDIR" && (cd "$SDIR" && tar chf - *) | (tar xf - -C "$DDIR")
    240         if [ $? != 0 ] ; then
    241             echo "ERROR: Could not copy $3 directory $SDIR into $DDIR !"
    242             exit 5
    243         fi
    244     fi
    245 }
    246 
    247 # Create a symlink-copy of directory $1 into $2
    248 # This function is recursive.
    249 #
    250 # $1: source directory (relative to $SRCDIR)
    251 # $2: destination directory (relative to $DSTDIR)
    252 symlink_src_directory ()
    253 {
    254     local files subdirs file subdir rev
    255     mkdir -p "$DSTDIR/$2"
    256     files=`cd $DSTDIR/$1 && ls -1p | grep -v -e '.*/'`
    257     subdirs=`cd $DSTDIR/$1 && ls -1p | grep -e '.*/' | sed -e 's!/$!!g'`
    258     rev=`reverse_path $1`
    259     for file in $files; do
    260         ln -s $rev/$1/$file $DSTDIR/$2/$file
    261     done
    262     for subdir in $subdirs; do
    263         symlink_src_directory $1/$subdir $2/$subdir
    264     done
    265 }
    266 
    267 # Copy platform sysroot and samples into your destination
    268 #
    269 
    270 # $SRC/android-$PLATFORM/include --> $DST/platforms/android-$PLATFORM/arch-$ARCH/usr/include
    271 # $SRC/android-$PLATFORM/arch-$ARCH/include --> $DST/platforms/android-$PLATFORM/arch-$ARCH/usr/include
    272 # for compatibility:
    273 # $SRC/android-$PLATFORM/arch-$ARCH/usr/include --> $DST/platforms/android-$PLATFORM/arch-$ARCH/usr/include
    274 
    275 
    276 
    277 # $SRC/android-$PLATFORM/arch-$ARCH/usr --> $DST/platforms/android-$PLATFORM/arch-$ARCH/usr
    278 # $SRC/android-$PLATFORM/samples       --> $DST/samples
    279 #
    280 rm -rf $DSTDIR/platforms && mkdir -p $DSTDIR/platforms
    281 PREV_PLATFORM_DST=
    282 for PLATFORM in $PLATFORMS; do
    283     NEW_PLATFORM=platforms/android-$PLATFORM
    284     PLATFORM_SRC=$NEW_PLATFORM
    285     PLATFORM_DST=$NEW_PLATFORM
    286     dump "Copying android-$PLATFORM platform files"
    287     if [ -n "$PREV_PLATFORM_DST" ] ; then
    288         if [ "$OPTION_NO_SYMLINKS" = "yes" ] ; then
    289             log "Copying \$DST/$PREV_PLATFORM_DST to \$DST/$PLATFORM_DST"
    290             #cp -r $DSTDIR/$PREV_PLATFORM_DST $DSTDIR/$PLATFORM_DST
    291             copy_directory "$DSTDIR/$PREV_PLATFORM_DST" "$DSTDIR/$PLATFORM_DST"
    292         else
    293             log "Symlink-copying \$DST/$PREV_PLATFORM_DST to \$DST/$PLATFORM_DST"
    294             symlink_src_directory $PREV_PLATFORM_DST $PLATFORM_DST
    295         fi
    296         if [ $? != 0 ] ; then
    297             echo "ERROR: Could not copy previous sysroot to $DSTDIR/$NEW_PLATFORM"
    298             exit 4
    299         fi
    300     fi
    301     for ARCH in $ARCHS; do
    302         SYSROOT=arch-$ARCH/usr
    303         log "Copy $ARCH sysroot files from \$SRC/android-$PLATFORM over \$DST/android-$PLATFORM/arch-$ARCH"
    304         copy_src_directory $PLATFORM_SRC/include           $PLATFORM_DST/$SYSROOT/include "sysroot headers"
    305         copy_src_directory $PLATFORM_SRC/arch-$ARCH/include $PLATFORM_DST/$SYSROOT/include "sysroot headers"
    306         copy_src_directory $PLATFORM_SRC/arch-$ARCH/lib     $PLATFORM_DST/$SYSROOT/lib "sysroot libs"
    307         copy_src_directory $PLATFORM_SRC/$SYSROOT          $PLATFORM_DST/$SYSROOT "sysroot"
    308     done
    309     PREV_PLATFORM_DST=$PLATFORM_DST
    310 done
    311 
    312 if [ "$OPTION_NO_SAMPLES" = no ] ; then
    313     # Copy platform samples and generic samples into your destination
    314     #
    315     # $SRC/samples/ --> $DST/samples/
    316     # $SRC/android-$PLATFORM/samples/ --> $DST/samples
    317     #
    318     dump "Copying generic samples"
    319     rm -rf $DSTDIR/samples && mkdir -p $DSTDIR/samples
    320     copy_src_directory  samples samples samples
    321 
    322     for PLATFORM in $PLATFORMS; do
    323         dump "Copy android-$PLATFORM samples"
    324         # $SRC/platform-$PLATFORM/samples --> $DST/samples
    325         copy_src_directory platforms/android-$PLATFORM/samples samples samples
    326     done
    327 
    328     # Cleanup generated files in samples
    329     rm -rf "$DSTDIR/samples/*/obj"
    330     rm -rf "$DSTDIR/samples/*/libs"
    331 fi
    332 
    333 log "Done !"
    334