1 #! /bin/bash 2 # Copyright (c) 2016, Intel Corporation 3 # All rights reserved. 4 # 5 # Redistribution and use in source and binary forms, with or without modification, 6 # are permitted provided that the following conditions are met: 7 # 8 # 1. Redistributions of source code must retain the above copyright notice, this 9 # list of conditions and the following disclaimer. 10 # 11 # 2. Redistributions in binary form must reproduce the above copyright notice, 12 # this list of conditions and the following disclaimer in the documentation and/or 13 # other materials provided with the distribution. 14 # 15 # 3. Neither the name of the copyright holder nor the names of its contributors 16 # may be used to endorse or promote products derived from this software without 17 # specific prior written permission. 18 # 19 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 20 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 21 # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 22 # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR 23 # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 24 # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 25 # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 26 # ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 28 # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 30 cd "$ANDROID_BUILD_TOP" 31 . build/envsetup.sh 32 cd - 33 34 set -eo pipefail 35 36 # INSTRUCTIONS 37 # 38 # Prior to running this script you should git-rm the previous content of the 39 # directory pointed to by the "asio" symbolic link, extract the version you 40 # want to integrate and finally, make the "asio" symbolic link point to the 41 # extracted directory. Additionaly, the build environment must be ready; i.e. 42 # you must have sourced "build/envestup.sh" and lunched any target. 43 # 44 # Then, run this script by passing it a list of lunch targets. ASIO will be 45 # minified based on which files were used when building the Parameter Framework 46 # on those lunch targets. As results may very among targets, it is advised to 47 # pass lunch targets of various architectures (ideally, all lunch targets). 48 49 # USAGE 50 # See the usage() function below 51 52 usage () { 53 echo "run from the Parameter Framework's git root" 54 echo "\tsupport/android/asio/asio_shrinker.sh <lunch target> [more lunch targets]" 55 exit 1 56 } 57 58 fail () { 59 code=$? 60 echo "Asio shrinker error: $1" 61 exit $code 62 } 63 64 list_compiled_files () { 65 directory=$1 66 output=$2 67 68 # list all files used during compilation. Ignore "grep" errors: some .P 69 # files may well not contain any "asio" line. 70 find "$directory/obj" -name "*.P" | \ 71 xargs grep --no-filename 'external/parameter-framework/asio' >> "$output" || true 72 } 73 74 if [ $# -eq 0 ]; then 75 echo "Not enough arguments." 76 usage 77 fi 78 79 # This script must be run from the Parameter Framework's git root. 80 cd asio 81 82 asio_includes=$(mktemp) 83 find include -type f -name '*.[ih]pp' > "$asio_includes" 84 85 # unifdef can't parse multi-line macros. Help him out by removing the wrapping 86 xargs sed -i -e :a -e '/\\$/N' -e 's@\\ *\n@ @' -e ta < "$asio_includes" 87 88 # apply macro definitions 89 # "-x 2" means: only exit with a code != 0 if an error happened 90 # "-m" means: work on multiple files 91 # -f" means: read define and undef directives from the following file 92 xargs unifdef -x 2 -m -f ../support/android/asio/asio_defines.txt < "$asio_includes" 93 rm "$asio_includes" 94 95 96 # Take a list of lunch targets as argument and run "mma" on all of them. 97 # Why? because it seems that different target architectures require different 98 # sets of files 99 pushd .. 100 tmpfile=$(mktemp) 101 for target in "$@"; do 102 lunch $target || fail "Failed to lunch $target" 103 104 # compile and list the source files that actually have been used 105 mma -j$(nproc) || fail "Failed to build $target" 106 list_compiled_files "$ANDROID_PRODUCT_OUT" $tmpfile 107 done 108 popd 109 list_compiled_files "$ANDROID_HOST_OUT" $tmpfile 110 111 # In .P files, a line may contain several entries and may be terminated by " \" 112 # or " :" or nothing. Let's make sure we have one entry per line. 113 sed -r -e 's@^ *([^:\\]*)( [:\\])?$@\1@' \ 114 -e 's@^external/parameter-framework/asio/@@g' \ 115 -e 's@ @\n@' $tmpfile | \ 116 sort -u | \ 117 xargs git add || fail "Failed to git-add some necessary ASIO headers" 118 rm $tmpfile 119 120 # Add copyright mentions and readmes 121 git add COPYING LICENSE_1_0.txt README 122 # Remove asio.hpp because we override it 123 git rm -f include/asio.hpp || true # it may already have been removed 124 125 cat > README.parameter-framework << __EOF__ 126 This version of ASIO has been minified for lower disk footprint for Android 127 integraton by support/android/asio/asio_shrinker.sh. 128 129 Although unlikely (thanks to having been tested on all AOSP lunch targets), if 130 the Parameter Framework fails to compile on your lunch target because of a 131 missing ASIO header, you may download a vanilla ASIO version from 132 'http://sourceforge.net/projects/asio/files/asio/1.10.6%20%28Stable%29/' and 133 run that script anew. 134 __EOF__ 135 git add README.parameter-framework 136