1 #!/bin/bash 2 # See usage() below for the description. 3 4 function usage() { 5 cat <<EOF 6 # This script copies the .jar files that each plugin depends on into the plugins libs folder. 7 # By default, on Mac & Linux, this script creates symlinks from the libs folder to the jar file. 8 # Since Windows does not support symlinks, the jar files are copied. 9 # 10 # Options: 11 # -f : to copy files rather than creating symlinks on the Mac/Linux platforms. 12 # -d : print make dependencies instead of running make; doesn't copy files. 13 # -c : copy files expected after make dependencies (reported by -d) have been built. 14 # 15 # The purpose of -d/-c is to include the workflow in a make file: 16 # - the make rule should depend on \$(shell create_all_symlinks -d) 17 # - the rule body should perform \$(shell create_all_symlinks -c [-f]) 18 EOF 19 } 20 21 # CD to the top android directory 22 PROG_DIR=`dirname "$0"` 23 cd "${PROG_DIR}/../../../" 24 25 HOST=`uname` 26 USE_COPY="" # force copy dependent jar files rather than creating symlinks 27 ONLY_SHOW_DEPS="" # only report make dependencies but don't build them nor copy. 28 ONLY_COPY_DEPS="" # only copy dependencies built by make; uses -f as needed. 29 30 function die() { 31 echo "Error: $*" >/dev/stderr 32 exit 1 33 } 34 35 function warn() { 36 # Only print something if not in show-deps mode 37 if [[ -z $ONLY_SHOW_DEPS ]]; then 38 echo "$*" 39 fi 40 } 41 42 function printGradleJarPath() { 43 # Prints to stdout the absolute path of the JAR assembled for a given gradle project. 44 # $1 = source dir, e.g. tools/base or tools/swt 45 # $2 = the gradle project name e.g. common or lint-api 46 echo "## Quering Gradle properties for '$2' in '$1'." > /dev/stderr 47 ( cd $1 && \ 48 ./gradlew :$2:properties | awk ' 49 BEGIN { B=""; N=""; V="" } 50 /^archivesBaseName:/ { N=$2 } 51 /^buildDir:/ { D=$2 } 52 /^version:/ { V=$2 } 53 END { print D "/libs/" N "-" V ".jar" }' ) 54 } 55 56 ## parse arguments 57 while [ $# -gt 0 ]; do 58 case "$1" in 59 "-f" ) 60 USE_COPY="1" 61 ;; 62 "-d" ) 63 ONLY_SHOW_DEPS="1" 64 ;; 65 "-c" ) 66 ONLY_COPY_DEPS="1" 67 ;; 68 * ) 69 usage 70 exit 2 71 esac 72 shift 73 done 74 75 warn "## Running $0" 76 77 if [[ "${HOST:0:6}" == "CYGWIN" || "$USE_MINGW" == "1" ]]; then 78 # This is either Cygwin or Linux/Mingw cross-compiling to Windows. 79 PLATFORM="windows-x86" 80 if [[ "${HOST:0:6}" == "CYGWIN" ]]; then 81 # We can't use symlinks under Cygwin 82 USE_COPY="1" 83 fi 84 elif [[ "$HOST" == "Linux" ]]; then 85 PLATFORM="linux-x86" 86 elif [[ "$HOST" == "Darwin" ]]; then 87 PLATFORM="darwin-x86" 88 else 89 die "Unsupported platform ($HOST). Aborting." 90 fi 91 92 if [[ "$USE_COPY" == "1" ]]; then 93 function cpfile { # $1=source $2=dest $3=optional dest filename 94 cp -fv $1 $2/$3 95 } 96 else 97 # computes the "reverse" path, e.g. "a/b/c" => "../../.." 98 function back() { 99 echo $1 | sed 's@[^/]*@..@g' 100 } 101 102 function cpfile { # $1=source $2=dest $3=optional dest filename 103 local src=$1 104 if [[ "${src:0:1}" != "/" ]]; then 105 # Not an absolute path. We assume a relative path to be 106 # relative to the android root and we want to make it 107 # relative to the destination dir. 108 src=$(back $2)/$1 109 fi 110 ln -svf $src $2/$3 111 } 112 fi 113 114 DEST="sdk/eclipse/scripts" 115 116 set -e # fail early 117 LIBS="" 118 CP_FILES="" 119 120 121 ### Configure which libs to build. 122 # 123 # Each entry for LIBS needs to be prefixed with the way we want to build it: 124 # make: - a library built using its traditional Android.mk 125 # base: - a gradle library located in tools/base 126 # swt: - a gradle library located in toosl/swt 127 # 128 # LIBS entries without or with an unknown ":" prefix will generate an error. 129 130 ### BASE ### 131 132 BASE_PLUGIN_DEST="sdk/eclipse/plugins/com.android.ide.eclipse.base/libs" 133 BASE_PLUGIN_LIBS="base:common swt:sdkstats base:sdklib base:dvlib base:layoutlib-api base:sdk-common" 134 BASE_PLUGIN_PREBUILTS="\ 135 prebuilts/tools/common/m2/repository/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0.jar \ 136 prebuilts/tools/common/m2/repository/org/apache/commons/commons-compress/1.0/commons-compress-1.0.jar \ 137 prebuilts/tools/common/m2/repository/com/google/guava/guava/15.0/guava-15.0.jar \ 138 prebuilts/tools/common/m2/repository/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.jar \ 139 prebuilts/tools/common/m2/repository/commons-codec/commons-codec/1.4/commons-codec-1.4.jar \ 140 prebuilts/tools/common/m2/repository/org/apache/httpcomponents/httpclient/4.1.1/httpclient-4.1.1.jar \ 141 prebuilts/tools/common/m2/repository/org/apache/httpcomponents/httpcore/4.1/httpcore-4.1.jar \ 142 prebuilts/tools/common/m2/repository/org/apache/httpcomponents/httpmime/4.1/httpmime-4.1.jar" 143 144 # temporarily disabled 145 # prebuilts/tools/common/m2/repository/org/bouncycastle/bcpkix-jdk15on/1.48/bcpkix-jdk15on-1.48.jar \ 146 # prebuilts/tools/common/m2/repository/org/bouncycastle/bcprov-jdk15on/1.48/bcprov-jdk15on-1.48.jar" 147 148 LIBS="$LIBS $BASE_PLUGIN_LIBS" 149 CP_FILES="$CP_FILES @:$BASE_PLUGIN_DEST $BASE_PLUGIN_LIBS $BASE_PLUGIN_PREBUILTS" 150 151 152 ### ADT ### 153 154 ADT_DEST="sdk/eclipse/plugins/com.android.ide.eclipse.adt/libs" 155 ADT_LIBS="make:ant-glob base:asset-studio base:lint-api base:lint-checks base:ninepatch make:propertysheet \ 156 base:rule-api swt:sdkuilib swt:swtmenubar base:manifest-merger" 157 ADT_PREBUILTS="\ 158 prebuilts/tools/common/freemarker/freemarker-2.3.19.jar \ 159 prebuilts/tools/common/m2/repository/org/ow2/asm/asm/4.0/asm-4.0.jar \ 160 prebuilts/tools/common/m2/repository/org/ow2/asm/asm-tree/4.0/asm-tree-4.0.jar \ 161 prebuilts/tools/common/m2/repository/org/ow2/asm/asm-analysis/4.0/asm-analysis-4.0.jar \ 162 prebuilts/tools/common/m2/repository/com/android/tools/external/lombok/lombok-ast/0.2.2/lombok-ast-0.2.2.jar" 163 164 LIBS="$LIBS $ADT_LIBS" 165 CP_FILES="$CP_FILES @:$ADT_DEST $ADT_LIBS $ADT_PREBUILTS" 166 167 168 ### DDMS ### 169 170 DDMS_DEST="sdk/eclipse/plugins/com.android.ide.eclipse.ddms/libs" 171 DDMS_LIBS="base:ddmlib swt:ddmuilib swt:swtmenubar swt:uiautomatorviewer" 172 173 DDMS_PREBUILTS="\ 174 prebuilts/tools/common/m2/repository/jfree/jcommon/1.0.12/jcommon-1.0.12.jar \ 175 prebuilts/tools/common/m2/repository/jfree/jfreechart/1.0.9/jfreechart-1.0.9.jar \ 176 prebuilts/tools/common/m2/repository/jfree/jfreechart-swt/1.0.9/jfreechart-swt-1.0.9.jar" 177 178 LIBS="$LIBS $DDMS_LIBS" 179 CP_FILES="$CP_FILES @:$DDMS_DEST $DDMS_LIBS $DDMS_PREBUILTS" 180 181 182 ### TEST ### 183 184 TEST_DEST="sdk/eclipse/plugins/com.android.ide.eclipse.tests" 185 TEST_LIBS="make:easymock base:testutils" 186 TEST_PREBUILTS="prebuilts/tools/common/m2/repository/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0.jar" 187 188 LIBS="$LIBS $TEST_LIBS" 189 CP_FILES="$CP_FILES @:$TEST_DEST $TEST_LIBS $TEST_PREBUILTS" 190 191 192 ### BRIDGE ### 193 194 if [[ $PLATFORM != "windows-x86" ]]; then 195 # We can't build enough of the platform on Cygwin to create layoutlib 196 BRIDGE_LIBS="make:layoutlib base:ninepatch" 197 198 LIBS="$LIBS $BRIDGE_LIBS" 199 fi 200 201 202 ### HIERARCHYVIEWER ### 203 204 HV_DEST="sdk/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/libs" 205 HV_LIBS="swt:hierarchyviewer2lib swt:swtmenubar" 206 207 LIBS="$LIBS $HV_LIBS" 208 CP_FILES="$CP_FILES @:$HV_DEST $HV_LIBS" 209 210 211 ### TRACEVIEW ### 212 213 TV_DEST="sdk/eclipse/plugins/com.android.ide.eclipse.traceview/libs" 214 TV_LIBS="swt:traceview" 215 216 LIBS="$LIBS $TV_LIBS" 217 CP_FILES="$CP_FILES @:$TV_DEST $TV_LIBS" 218 219 220 ### MONITOR ### 221 222 MONITOR_DEST="sdk/eclipse/plugins/com.android.ide.eclipse.monitor/libs" 223 MONITOR_LIBS="swt:sdkuilib" 224 225 LIBS="$LIBS $MONITOR_LIBS" 226 CP_FILES="$CP_FILES @:$MONITOR_DEST $MONITOR_LIBS" 227 228 229 ### SDKMANAGER ### 230 231 SDKMAN_LIBS="swt:swtmenubar" 232 233 LIBS="$LIBS $SDKMAN_LIBS" 234 235 236 ### GL DEBUGGER ### 237 238 if [[ $PLATFORM != "windows-x86" ]]; then 239 # liblzf doesn't build under cygwin. If necessary, this should be fixed first. 240 241 GLD_DEST="sdk/eclipse/plugins/com.android.ide.eclipse.gldebugger/libs" 242 GLD_LIBS="make:host-libprotobuf-java-2.3.0-lite make:liblzf" 243 244 LIBS="$LIBS $GLD_LIBS" 245 CP_FILES="$CP_FILES @:$GLD_DEST $GLD_LIBS" 246 fi 247 248 249 #--- Determine what to build 250 251 UNPROCESSED="" 252 GRADLE_SWT="" 253 GRADLE_BASE="" 254 MAKE_TARGETS="" 255 for LIB in $LIBS; do 256 if [[ "${LIB:0:5}" == "base:" ]]; then 257 GRADLE_BASE="$GRADLE_BASE :${LIB:5}:assemble" 258 elif [[ "${LIB:0:4}" == "swt:" ]]; then 259 GRADLE_SWT="$GRADLE_SWT :${LIB:4}:assemble" 260 elif [[ "${LIB:0:5}" == "make:" ]]; then 261 MAKE_TARGETS="$MAKE_TARGETS ${LIB:5}" 262 else 263 UNPROCESSED="$UNPROCESSED $LIB" 264 fi 265 done 266 267 unset LIBS # we shouldn't use this anymore, it has been split up just above. 268 269 270 if [[ -n $UNPROCESSED ]]; then 271 die "## The following libs lack a prefix (make:, base: or swt:): $UNPROCESSED" 272 fi 273 274 # In the mode to only echo dependencies, output them and we're done 275 if [[ -n $ONLY_SHOW_DEPS ]]; then 276 echo $MAKE_TARGETS 277 exit 0 278 fi 279 280 # --- Gradle Build --- 281 282 # tools/base: if we need it for SWT, we build them all and public local. 283 # Otherwise we do a specific tools/base build on just the requested targets. 284 285 if [[ -n "$GRADLE_SWT" ]]; then 286 echo "### Starting tools/base: gradlew assemble publishLocal" 287 (cd tools/base && ./gradlew assemble publishLocal) 288 elif [[ -n "$GRADLE_BASE" ]]; then 289 echo "### Starting tools/base: gradlew $GRADLE_BASE" 290 (cd tools/base && ./gradlew $GRADLE_BASE) 291 fi 292 293 # tools/swt: build requested targets 294 295 if [[ -n "$GRADLE_SWT" ]]; then 296 echo "### Starting tools/swt: gradlew $GRADLE_SWT" 297 (cd tools/swt && ./gradlew $GRADLE_SWT) 298 fi 299 300 # --- Android.mk Build --- 301 302 # If some of the libs are available in prebuilts/devtools, use link to them directly 303 # instead of trying to rebuild them so remove them from the libs to build. Note that 304 # they are already listed in CP_FILES so we'll adjust the source to copy later. 305 306 NEW_TARGETS="" 307 for LIB in $MAKE_TARGETS; do 308 J="prebuilts/devtools/tools/lib/$LIB.jar" 309 if [[ ! -f $J ]]; then 310 J="prebuilts/devtools/adt/lib/$LIB.jar" 311 fi 312 if [[ -f $J ]]; then 313 warn "## Using existing $J" 314 else 315 NEW_TARGETS="$NEW_TARGETS $LIB" 316 fi 317 done 318 MAKE_TARGETS="$NEW_TARGETS" 319 unset NEW_TARGETS 320 321 if [[ -z $ONLY_COPY_DEPS ]]; then 322 if [[ -n $MAKE_TARGETS ]]; then 323 ( # Make sure we have lunch sdk-<something> 324 if [[ ! "$TARGET_PRODUCT" ]]; then 325 warn "## TARGET_PRODUCT is not set, running build/envsetup.sh" 326 . build/envsetup.sh 327 warn "## lunch sdk-eng" 328 lunch sdk-eng 329 fi 330 331 J="4" 332 [[ $(uname) == "Darwin" ]] && J=$(sysctl hw.ncpu | cut -d : -f 2 | tr -d ' ') 333 [[ $(uname) == "Linux" ]] && J=$(cat /proc/cpuinfo | grep processor | wc -l) 334 335 warn "## Building libs: make -j$J $MAKE_TARGETS" 336 make -j${J} $MAKE_TARGETS 337 ) 338 fi 339 fi 340 341 # --- Copy resulting files --- 342 343 DEST="" 344 for SRC in $CP_FILES; do 345 if [[ "${SRC:0:2}" == "@:" ]]; then 346 DEST="${SRC:2}" 347 mkdir -vp "$DEST" 348 continue 349 fi 350 351 ORIG_SRC="$SRC" 352 DEST_FILE="" 353 354 if [[ "${SRC:0:5}" == "base:" ]]; then 355 SRC="${SRC:5}" 356 ORIG_SRC="$SRC" 357 DEST_FILE="$SRC.jar" 358 SRC=$(printGradleJarPath tools/base $SRC) 359 elif [[ "${SRC:0:4}" == "swt:" ]]; then 360 SRC="${SRC:4}" 361 ORIG_SRC="$SRC" 362 DEST_FILE="$SRC.jar" 363 SRC=$(printGradleJarPath tools/swt $SRC) 364 elif [[ "${SRC:0:5}" == "make:" ]]; then 365 SRC="${SRC:5}" 366 ORIG_SRC="$SRC" 367 fi 368 369 if [[ ! -f "$SRC" ]]; then 370 # Take a prebuilts/devtools instead of a framework one if possible. 371 SRC="prebuilts/devtools/tools/lib/$SRC.jar" 372 if [[ ! -f "$SRC" ]]; then 373 SRC="prebuilts/devtools/adt/lib/$ORIG_SRC.jar" 374 fi 375 if [[ ! -f "$SRC" ]]; then 376 SRC="out/host/$PLATFORM/framework/$ORIG_SRC.jar" 377 fi 378 fi 379 if [[ -f "$SRC" ]]; then 380 if [[ ! -d "$DEST" ]]; then 381 die "Invalid cp_file dest directory: $DEST" 382 fi 383 384 cpfile "$SRC" "$DEST" "$DEST_FILE" 385 else 386 die "## Unknown source '$ORIG_SRC' to copy in '$DEST'" 387 fi 388 done 389 390 # OS-specific post operations 391 392 if [ "${HOST:0:6}" == "CYGWIN" ]; then 393 chmod -v a+rx "$ADT_DEST"/*.jar 394 fi 395 396 echo "### $0 done" 397