1*f585d8a3SJacky Wang#!/bin/bash 2*f585d8a3SJacky Wang 3*f585d8a3SJacky Wangset -eu 4*f585d8a3SJacky Wang 5*f585d8a3SJacky Wang# Builds and deploys the given artifacts to a configured maven goal. 6*f585d8a3SJacky Wang# @param {string} library the library to deploy. 7*f585d8a3SJacky Wang# @param {string} pomfile the pom file to deploy. 8*f585d8a3SJacky Wang# @param {string} srcjar the sources jar of the library. This is an optional 9*f585d8a3SJacky Wang# parameter, if provided then javadoc must also be provided. 10*f585d8a3SJacky Wang# @param {string} javadoc the java doc jar of the library. This is an optional 11*f585d8a3SJacky Wang# parameter, if provided then srcjar must also be provided. 12*f585d8a3SJacky Wang# @param {string} module_name the JPMS module name to include in the jar. This 13*f585d8a3SJacky Wang# is an optional parameter and can only be used with jar files. 14*f585d8a3SJacky Wangdeploy_library() { 15*f585d8a3SJacky Wang local shaded_rules=$1 16*f585d8a3SJacky Wang local library=$2 17*f585d8a3SJacky Wang local pomfile=$3 18*f585d8a3SJacky Wang local srcjar=$4 19*f585d8a3SJacky Wang local javadoc=$5 20*f585d8a3SJacky Wang local module_name=$6 21*f585d8a3SJacky Wang local mvn_goal=$7 22*f585d8a3SJacky Wang local version_name=$8 23*f585d8a3SJacky Wang shift 8 24*f585d8a3SJacky Wang local extra_maven_args=("$@") 25*f585d8a3SJacky Wang 26*f585d8a3SJacky Wang bazel build --define=pom_version="$version_name" $library $pomfile 27*f585d8a3SJacky Wang 28*f585d8a3SJacky Wang # Shade the library if shaded_rules exist 29*f585d8a3SJacky Wang if [[ ! -z "$shaded_rules" ]]; then 30*f585d8a3SJacky Wang bash $(dirname $0)/shade-library.sh \ 31*f585d8a3SJacky Wang $(bazel_output_file $library) $shaded_rules 32*f585d8a3SJacky Wang # The output jar name is the same as the input library appended with -shaded 33*f585d8a3SJacky Wang library="${library%.*}-shaded.${library##*.}" 34*f585d8a3SJacky Wang fi 35*f585d8a3SJacky Wang 36*f585d8a3SJacky Wang # Validate that the classes in the library jar begin with expected prefixes. 37*f585d8a3SJacky Wang validate_jar $(bazel_output_file $library) 38*f585d8a3SJacky Wang 39*f585d8a3SJacky Wang # TODO(bcorso): Consider moving this into the "gen_maven_artifact" macro, this 40*f585d8a3SJacky Wang # requires having the version checked-in for the build system. 41*f585d8a3SJacky Wang add_tracking_version \ 42*f585d8a3SJacky Wang $(bazel_output_file $library) \ 43*f585d8a3SJacky Wang $(bazel_output_file $pomfile) \ 44*f585d8a3SJacky Wang $version_name 45*f585d8a3SJacky Wang 46*f585d8a3SJacky Wang # TODO(bcorso): Consider moving this into the "gen_maven_artifact" macro once 47*f585d8a3SJacky Wang # all our targets are using gen_maven_artifact 48*f585d8a3SJacky Wang add_automatic_module_name_manifest_entry \ 49*f585d8a3SJacky Wang $(bazel_output_file $library) \ 50*f585d8a3SJacky Wang "${module_name}" 51*f585d8a3SJacky Wang 52*f585d8a3SJacky Wang if [ -n "$srcjar" ] && [ -n "$javadoc" ] ; then 53*f585d8a3SJacky Wang bazel build --define=pom_version="$version_name" \ 54*f585d8a3SJacky Wang $srcjar $javadoc 55*f585d8a3SJacky Wang mvn $mvn_goal \ 56*f585d8a3SJacky Wang -Dfile=$(bazel_output_file $library) \ 57*f585d8a3SJacky Wang -Djavadoc=$(bazel_output_file $javadoc) \ 58*f585d8a3SJacky Wang -DpomFile=$(bazel_output_file $pomfile) \ 59*f585d8a3SJacky Wang -Dsources=$(bazel_output_file $srcjar) \ 60*f585d8a3SJacky Wang "${extra_maven_args[@]:+${extra_maven_args[@]}}" 61*f585d8a3SJacky Wang else 62*f585d8a3SJacky Wang mvn $mvn_goal \ 63*f585d8a3SJacky Wang -Dfile=$(bazel_output_file $library) \ 64*f585d8a3SJacky Wang -DpomFile=$(bazel_output_file $pomfile) \ 65*f585d8a3SJacky Wang "${extra_maven_args[@]:+${extra_maven_args[@]}}" 66*f585d8a3SJacky Wang fi 67*f585d8a3SJacky Wang} 68*f585d8a3SJacky Wang 69*f585d8a3SJacky Wangbazel_output_file() { 70*f585d8a3SJacky Wang local library=$1 71*f585d8a3SJacky Wang local output_file=bazel-bin/$library 72*f585d8a3SJacky Wang if [[ ! -e $output_file ]]; then 73*f585d8a3SJacky Wang output_file=bazel-genfiles/$library 74*f585d8a3SJacky Wang fi 75*f585d8a3SJacky Wang if [[ ! -e $output_file ]]; then 76*f585d8a3SJacky Wang echo "Could not find bazel output file for $library" 77*f585d8a3SJacky Wang exit 1 78*f585d8a3SJacky Wang fi 79*f585d8a3SJacky Wang echo -n $output_file 80*f585d8a3SJacky Wang} 81*f585d8a3SJacky Wang 82*f585d8a3SJacky Wangadd_tracking_version() { 83*f585d8a3SJacky Wang local library=$1 84*f585d8a3SJacky Wang local pomfile=$2 85*f585d8a3SJacky Wang local version_name=$3 86*f585d8a3SJacky Wang local group_id=$(find_pom_value $pomfile "groupId") 87*f585d8a3SJacky Wang local artifact_id=$(find_pom_value $pomfile "artifactId") 88*f585d8a3SJacky Wang local temp_dir=$(mktemp -d) 89*f585d8a3SJacky Wang local version_file="META-INF/${group_id}_${artifact_id}.version" 90*f585d8a3SJacky Wang mkdir -p "$temp_dir/META-INF/" 91*f585d8a3SJacky Wang echo $version_name >> "$temp_dir/$version_file" 92*f585d8a3SJacky Wang if [[ $library =~ \.jar$ ]]; then 93*f585d8a3SJacky Wang jar uf $library -C $temp_dir $version_file 94*f585d8a3SJacky Wang elif [[ $library =~ \.aar$ ]]; then 95*f585d8a3SJacky Wang unzip $library classes.jar -d $temp_dir 96*f585d8a3SJacky Wang jar uf $temp_dir/classes.jar -C $temp_dir $version_file 97*f585d8a3SJacky Wang jar uf $library -C $temp_dir classes.jar 98*f585d8a3SJacky Wang else 99*f585d8a3SJacky Wang echo "Could not add tracking version file to $library" 100*f585d8a3SJacky Wang exit 1 101*f585d8a3SJacky Wang fi 102*f585d8a3SJacky Wang} 103*f585d8a3SJacky Wang 104*f585d8a3SJacky Wangvalidate_jar() { 105*f585d8a3SJacky Wang local library=$1 106*f585d8a3SJacky Wang if [[ $library == */gwt/libgwt.jar ]]; then 107*f585d8a3SJacky Wang python $(dirname $0)/validate-jar-entry-prefixes.py \ 108*f585d8a3SJacky Wang $library "dagger/,META-INF/,javax/inject/" 109*f585d8a3SJacky Wang elif [[ $library == */java/dagger/hilt/android/artifact.aar ]]; then 110*f585d8a3SJacky Wang python $(dirname $0)/validate-jar-entry-prefixes.py \ 111*f585d8a3SJacky Wang $library "dagger/,META-INF/,hilt_aggregated_deps/" 112*f585d8a3SJacky Wang else 113*f585d8a3SJacky Wang python $(dirname $0)/validate-jar-entry-prefixes.py \ 114*f585d8a3SJacky Wang $library "dagger/,META-INF/" 115*f585d8a3SJacky Wang fi 116*f585d8a3SJacky Wang} 117*f585d8a3SJacky Wang 118*f585d8a3SJacky Wangadd_automatic_module_name_manifest_entry() { 119*f585d8a3SJacky Wang local library=$1 120*f585d8a3SJacky Wang local module_name=$2 121*f585d8a3SJacky Wang if [ -n "$module_name" ] ; then 122*f585d8a3SJacky Wang if [[ $library =~ \.jar$ ]]; then 123*f585d8a3SJacky Wang local temp_dir=$(mktemp -d) 124*f585d8a3SJacky Wang echo "Automatic-Module-Name: ${module_name}" > $temp_dir/module_name_file 125*f585d8a3SJacky Wang # The "m" flag is specifically for adding manifest entries. 126*f585d8a3SJacky Wang jar ufm $library $temp_dir/module_name_file 127*f585d8a3SJacky Wang else 128*f585d8a3SJacky Wang echo "Could not add module name to $library" 129*f585d8a3SJacky Wang exit 1 130*f585d8a3SJacky Wang fi 131*f585d8a3SJacky Wang fi 132*f585d8a3SJacky Wang} 133*f585d8a3SJacky Wang 134*f585d8a3SJacky Wangfind_pom_value() { 135*f585d8a3SJacky Wang local pomfile=$1 136*f585d8a3SJacky Wang local attribute=$2 137*f585d8a3SJacky Wang # Using Python here because `mvn help:evaluate` doesn't work with our gen pom 138*f585d8a3SJacky Wang # files since they don't include the aar packaging plugin. 139*f585d8a3SJacky Wang python $(dirname $0)/find_pom_value.py $pomfile $attribute 140*f585d8a3SJacky Wang} 141*f585d8a3SJacky Wang 142*f585d8a3SJacky Wangdeploy_library "$@" 143