BIGTOP-3558. Fix build failure of HBase on ppc64le. (#789)

* BIGTOP-3558. Fix build failure of HBase on ppc64le.

* bumped asciidoctorj.pdf.version to avoid OOM. improved the readability by avoiding duplicate architecture specific conditionals.

* added ppc64le patch for protoc.
diff --git a/bigtop-packages/src/common/hbase/do-component-build b/bigtop-packages/src/common/hbase/do-component-build
index 0619ff9..9de0ca4 100644
--- a/bigtop-packages/src/common/hbase/do-component-build
+++ b/bigtop-packages/src/common/hbase/do-component-build
@@ -25,10 +25,13 @@
 fi
 
 if [ $HOSTTYPE = "powerpc64le" ] ; then
-  sed  -i "s|<asciidoctor.plugin.version>.*</asciidoctor.plugin.version>|<asciidoctor.plugin.version>1.5.3</asciidoctor.plugin.version>|" pom.xml
+  sed -i "s|<asciidoctor.plugin.version>.*</asciidoctor.plugin.version>|<asciidoctor.plugin.version>1.5.3</asciidoctor.plugin.version>|" pom.xml
+  sed -i 's|<asciidoctorj.pdf.version>.*</asciidoctorj.pdf.version>|<asciidoctorj.pdf.version>1.5.0-alpha.11</asciidoctorj.pdf.version>|' pom.xml
   sed -i 's|<jruby.version>.*</jruby.version>|<jruby.version>1.7.23</jruby.version>|' pom.xml
-  sed  -i "s|<version>1.5.0-alpha.6</version>|<version>1.5.0-alpha.11</version>|" pom.xml
-  CLASSIFIER="linux-ppcle_64"
+  mvn install:install-file -DgroupId=com.google.protobuf -DartifactId=protoc -Dversion=2.5.0 \
+      -Dclassifier=linux-ppcle_64 -Dpackaging=exe -Dfile=/usr/local/bin/protoc
+  mvn install:install-file -DgroupId=com.google.protobuf -DartifactId=protoc -Dversion=3.5.1-1 \
+      -Dclassifier=linux-ppcle_64 -Dpackaging=exe -Dfile=/usr/local/protobuf-3.5.1.1/bin/protoc
 fi
 
 if [ $HOSTTYPE = "aarch64" ] ; then
@@ -38,7 +41,8 @@
 '\             <artifactId>jruby-complete<\/artifactId>\n'\
 '\             <version>9.1.8.0</version>\n'\
 '\          <\/dependency>' pom.xml
-  CLASSIFIER="linux-aarch_64"
+  mvn install:install-file -DgroupId=com.google.protobuf -DartifactId=protoc -Dversion=2.5.0 \
+      -Dclassifier=linux-aarch_64 -Dpackaging=exe -Dfile=/usr/local/bin/protoc
 fi
 
 MVN_ARGS="-Phadoop-3.0 "
@@ -50,9 +54,6 @@
 MVN_ARGS+="-DskipTests "
 MVN_ARGS+="-Dcheckstyle.skip=true "
 
-mvn install:install-file -DgroupId=com.google.protobuf -DartifactId=protoc -Dversion=2.5.0 \
-            -Dclassifier=${CLASSIFIER} -Dpackaging=exe -Dfile=/usr/local/bin/protoc
-
 # HBASE-21513: separate site and assembly:single to avoid assembly issues.
 mvn ${MVN_ARGS} ${MAVEN_ADDITIONAL} clean install "$@"
 mvn ${MVN_ARGS} ${MAVEN_ADDITIONAL} site "$@"
diff --git a/bigtop_toolchain/files/protoc-3.5.1-add-support-for-ppc64le.patch b/bigtop_toolchain/files/protoc-3.5.1-add-support-for-ppc64le.patch
new file mode 100644
index 0000000..581ac4e
--- /dev/null
+++ b/bigtop_toolchain/files/protoc-3.5.1-add-support-for-ppc64le.patch
@@ -0,0 +1,65 @@
+diff --git a/protoc-artifacts/build-protoc.sh b/protoc-artifacts/build-protoc.sh
+index fe1dec2..f31597a 100755
+--- a/protoc-artifacts/build-protoc.sh
++++ b/protoc-artifacts/build-protoc.sh
+@@ -81,6 +81,8 @@ checkArch ()
+         assertEq $format "elf64-x86-64" $LINENO
+       elif [[ "$ARCH" == aarch_64 ]]; then
+         assertEq $format "elf64-little" $LINENO
++      elif [[ "$ARCH" == ppcle_64 ]]; then
++        assertEq $format "elf64-powerpcle" $LINENO
+       else
+         fail "Unsupported arch: $ARCH"
+       fi
+@@ -127,6 +129,8 @@ checkDependencies ()
+     elif [[ "$ARCH" == aarch_64 ]]; then
+       dump_cmd='objdump -p '"$1"' | grep NEEDED'
+       white_list="libpthread\.so\.0\|libc\.so\.6\|ld-linux-aarch64\.so\.1"
++    elif [[ "$ARCH" == ppcle_64 ]]; then
++      white_list="linux-vdso64\.so\.1\|libpthread\.so\.0\|libm\.so\.6\|libc\.so\.6\|libz\.so\.1\|ld64\.so\.2"
+     fi
+   elif [[ "$OS" == osx ]]; then
+     dump_cmd='otool -L '"$1"' | fgrep dylib'
+@@ -193,6 +197,8 @@ elif [[ "$(uname)" == Linux* ]]; then
+       CXXFLAGS="$CXXFLAGS -m32"
+     elif [[ "$ARCH" == aarch_64 ]]; then
+       CONFIGURE_ARGS="$CONFIGURE_ARGS --host=aarch64-linux-gnu"
++    elif [[ "$ARCH" == ppcle_64 ]]; then
++      CXXFLAGS="$CXXFLAGS -m64"
+     else
+       fail "Unsupported arch: $ARCH"
+     fi
+diff --git a/protoc-artifacts/build-zip.sh b/protoc-artifacts/build-zip.sh
+index f08e275..e87bb39 100755
+--- a/protoc-artifacts/build-zip.sh
++++ b/protoc-artifacts/build-zip.sh
+@@ -20,6 +20,7 @@ included. Each invocation will create 6 zip packages:
+   dist/<TARGET>-<VERSION_NUMBER>-linux-x86_32.zip
+   dist/<TARGET>-<VERSION_NUMBER>-linux-x86_64.zip
+   dist/<TARGET>-<VERSION_NUMBER>-linux-aarch_64.zip
++  dist/<TARGET>-<VERSION_NUMBER>-linux-ppcle_64.zip
+ EOF
+   exit 1
+ fi
+@@ -35,6 +36,8 @@ declare -a FILE_NAMES=( \
+   linux-x86_32.zip linux-x86_32.exe \
+   linux-x86_64.zip linux-x86_64.exe \
+   linux-aarch_64.zip linux-aarch_64.exe \
++  linux-ppcle_64.zip linux-ppcle_64.exe \
++
+ )
+ 
+ # List of all well-known types to be included.
+diff --git a/protoc-artifacts/pom.xml b/protoc-artifacts/pom.xml
+index 0f9dd9f..4a0892e 100644
+--- a/protoc-artifacts/pom.xml
++++ b/protoc-artifacts/pom.xml
+@@ -37,7 +37,7 @@
+       <extension>
+         <groupId>kr.motd.maven</groupId>
+         <artifactId>os-maven-plugin</artifactId>
+-        <version>1.2.3.Final</version>
++        <version>1.5.0.Final</version>
+       </extension>
+     </extensions>
+     <plugins>
diff --git a/bigtop_toolchain/manifests/protobuf.pp b/bigtop_toolchain/manifests/protobuf.pp
index 808b702..3e8879e 100644
--- a/bigtop_toolchain/manifests/protobuf.pp
+++ b/bigtop_toolchain/manifests/protobuf.pp
@@ -40,4 +40,26 @@
      require => EXEC["download protobuf"],
      timeout => 3000
   }
+
+  if ($architecture == 'ppc64le') {
+    exec { "download protobuf 3.5.1.1":
+      cwd  => "/usr/src",
+      command => "/usr/bin/wget https://github.com/protocolbuffers/protobuf/archive/refs/tags/v3.5.1.1.tar.gz && mkdir -p protobuf-3.5.1.1 && /bin/tar -xvzf v3.5.1.1.tar.gz -C protobuf-3.5.1.1 --strip-components=1",
+      creates => "/usr/src/protobuf-3.5.1.1",
+    }
+
+    file { "/usr/src/protobuf-3.5.1.1/protoc-3.5.1-add-support-for-ppc64le.patch":
+      source => "puppet:///modules/bigtop_toolchain/protoc-3.5.1-add-support-for-ppc64le.patch",
+      require => Exec["download protobuf 3.5.1.1"],
+    }
+
+    exec { "install protobuf 3.5.1.1":
+      cwd => "/usr/src/protobuf-3.5.1.1",
+      command => "/usr/bin/patch -p1 < protoc-3.5.1-add-support-for-ppc64le.patch && /usr/src/protobuf-3.5.1.1/autogen.sh && /usr/src/protobuf-3.5.1.1/configure --prefix=/usr/local/protobuf-3.5.1.1 --disable-shared --with-pic && /usr/bin/make install",
+      creates => "/usr/local/protobuf-3.5.1.1",
+      require => File["/usr/src/protobuf-3.5.1.1/protoc-3.5.1-add-support-for-ppc64le.patch"],
+      timeout => 3000
+    }
+  }
+
 }