xref: /aosp_15_r20/external/dagger2/util/deploy-library.sh (revision f585d8a307d0621d6060bd7e80091fdcbf94fe27)
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