Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #268 from zhangkun83/protoc-artifact-maven
Build scripts to publish precompiled protoc binaries (Maven-based)
- Loading branch information
Showing
3 changed files
with
272 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
# Build scripts that publish pre-compiled protoc artifacts | ||
``protoc`` is the compiler for ``.proto`` files. It generates language bindings | ||
for the messages and/or RPC services from ``.proto`` files. | ||
|
||
Because ``protoc`` is a native executable, the scripts under this directory | ||
build and publish a ``protoc`` executable (a.k.a. artifact) to Maven | ||
repositories. The artifact can be used by build automation tools so that users | ||
would not need to compile and install ``protoc`` for their systems. | ||
|
||
## Versioning | ||
The version of the ``protoc`` artifact must be the same as the version of the | ||
Protobuf project. | ||
|
||
## Artifact name | ||
The name of a published ``protoc`` artifact is in the following format: | ||
``protoc-<version>-<os>-<arch>.exe``, e.g., ``protoc-3.0.0-alpha-3-windows-x86_64.exe``. | ||
|
||
## System requirement | ||
Install [Apache Maven](http://maven.apache.org/) if you don't have it. | ||
|
||
The scripts only work under Unix-like environments, e.g., Linux, MacOSX, and | ||
Cygwin or MinGW for Windows. Please see ``README.md`` of the Protobuf project | ||
for how to set up the build environment. | ||
|
||
## To install artifacts locally | ||
The following command will install the ``protoc`` artifact to your local Maven repository. | ||
``` | ||
$ mvn install | ||
``` | ||
|
||
## Cross-compilation | ||
The Maven script will try to detect the OS and the architecture from Java | ||
system properties. It's possible to build a protoc binary for an architecture | ||
that is different from what Java has detected, as long as you have the proper | ||
compilers installed. For example, MingGW32 only ships with 32-bit compilers, | ||
but you can still build 32-bit protoc under a 64-bit system, with the following | ||
command: | ||
``` | ||
$ mvn install -Dos.detected.arch=x86_32 | ||
``` | ||
|
||
## To push artifacts to Maven Central | ||
Before you can upload artifacts to Maven Central repository, make sure you have | ||
read [this page](http://central.sonatype.org/pages/apache-maven.html) on how to | ||
configure GPG and Sonatype account. | ||
|
||
Use the following command to upload artifacts: | ||
``` | ||
$ mvn clean deploy -P release | ||
``` | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,97 @@ | ||
#!/bin/bash | ||
|
||
# Builds protoc executable into target/protoc.exe | ||
# To be run from Maven. | ||
# Usage: build-protoc.sh <OS> <ARCH> | ||
# <OS> and <ARCH> are ${os.detected.name} and ${os.detected.arch} from os-maven-plugin | ||
OS=$1 | ||
ARCH=$2 | ||
|
||
# Under Cygwin, bash doesn't have these in PATH when called from Maven which | ||
# runs in Windows version of Java. | ||
export PATH="/bin:/usr/bin:$PATH" | ||
|
||
############################################################################ | ||
# Helper functions | ||
############################################################################ | ||
E_PARAM_ERR=98 | ||
E_ASSERT_FAILED=99 | ||
|
||
fail() | ||
{ | ||
echo "Error: $1" | ||
exit $E_ASSERT_FAILED | ||
} | ||
|
||
# Usage: assertEq VAL1 VAL2 $LINENO | ||
assertEq () | ||
{ | ||
lineno=$3 | ||
if [ -z "$lineno" ]; then | ||
echo "lineno not given" | ||
exit $E_PARAM_ERR | ||
fi | ||
|
||
if [[ "$1" != "$2" ]]; then | ||
echo "Assertion failed: \"$1\" == \"$2\"" | ||
echo "File \"$0\", line $lineno" # Give name of file and line number. | ||
exit $E_ASSERT_FAILED | ||
fi | ||
} | ||
############################################################################ | ||
|
||
echo "Building protoc, OS=$OS ARCH=$ARCH" | ||
|
||
cd "$(dirname \"$0\")" | ||
WORKING_DIR=$(pwd) | ||
CONFIGURE_ARGS="--disable-shared" | ||
|
||
MAKE_TARGET="protoc" | ||
if [[ "$OS" == windows ]]; then | ||
MAKE_TARGET="${MAKE_TARGET}.exe" | ||
fi | ||
|
||
if [[ "$(uname)" == CYGWIN* ]]; then | ||
assertEq "$OS" windows $LINENO | ||
# Use mingw32 compilers because executables produced by Cygwin compiler | ||
# always have dependency on Cygwin DLL. | ||
if [[ "$ARCH" == x86_64 ]]; then | ||
CONFIGURE_ARGS="$CONFIGURE_ARGS --host=x86_64-w64-mingw32" | ||
elif [[ "$ARCH" == x86_32 ]]; then | ||
CONFIGURE_ARGS="$CONFIGURE_ARGS --host=i686-pc-mingw32" | ||
else | ||
fail "Unsupported arch by CYGWIN: $ARCH" | ||
fi | ||
elif [[ "$(uname)" == MINGW32* ]]; then | ||
assertEq "$OS" windows $LINENO | ||
assertEq "$ARCH" x86_32 $LINENO | ||
elif [[ "$(uname)" == Linux* ]]; then | ||
assertEq "$OS" linux $LINENO | ||
if [[ "$ARCH" == x86_64 ]]; then | ||
CONFIGURE_ARGS="$CONFIGURE_ARGS --host=x86_64-linux-gnu" | ||
elif [[ "$ARCH" == x86_32 ]]; then | ||
CONFIGURE_ARGS="$CONFIGURE_ARGS --host=i686-linux-gnu" | ||
else | ||
fail "Unsupported arch by CYGWIN: $ARCH" | ||
fi | ||
elif [[ "$(uname)" == Darwin* ]]; then | ||
assertEq "$OS" osx $LINENO | ||
else | ||
fail "Unsupported system: $(uname)" | ||
fi | ||
|
||
# Override the default value set in configure.ac that has '-g' which produces | ||
# huge binary. | ||
export CXXFLAGS="-DNDEBUG" | ||
|
||
# Statically link libgcc and libstdc++. | ||
# -s to produce stripped binary. | ||
# And they don't work under Mac. | ||
if [[ "$OS" != osx ]]; then | ||
export LDFLAGS="-static-libgcc -static-libstdc++ -s" | ||
fi | ||
|
||
cd "$WORKING_DIR"/.. && ./configure $CONFIGURE_ARGS && | ||
cd src && make clean && make $MAKE_TARGET && | ||
cd "$WORKING_DIR" && mkdir -p target && | ||
(cp ../src/protoc target/protoc.exe || cp ../src/protoc.exe target/protoc.exe) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,124 @@ | ||
<?xml version="1.0" encoding="UTF-8"?> | ||
<project xmlns="http://maven.apache.org/POM/4.0.0" | ||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> | ||
<modelVersion>4.0.0</modelVersion> | ||
<parent> | ||
<groupId>com.google</groupId> | ||
<artifactId>google</artifactId> | ||
<version>1</version> | ||
</parent> | ||
<groupId>com.google.protobuf</groupId> | ||
<artifactId>protoc</artifactId> | ||
<version>3.0.0-alpha-3-pre</version> | ||
<packaging>pom</packaging> | ||
<name>Protobuf Compiler</name> | ||
<description> | ||
Protobuf Compiler (protoc) is a compiler for .proto files. It generates | ||
language-specific code for Protobuf messages and RPC interfaces. | ||
</description> | ||
<inceptionYear>2008</inceptionYear> | ||
<url>https://developers.google.com/protocol-buffers/</url> | ||
<licenses> | ||
<license> | ||
<name>New BSD license</name> | ||
<url>http://www.opensource.org/licenses/bsd-license.php</url> | ||
<distribution>repo</distribution> | ||
</license> | ||
</licenses> | ||
<scm> | ||
<url>https://github.com/google/protobuf</url> | ||
<connection> | ||
scm:git:https://github.com/google/protobuf.git | ||
</connection> | ||
</scm> | ||
<build> | ||
<extensions> | ||
<extension> | ||
<groupId>kr.motd.maven</groupId> | ||
<artifactId>os-maven-plugin</artifactId> | ||
<version>1.2.3.Final</version> | ||
</extension> | ||
</extensions> | ||
<plugins> | ||
<plugin> | ||
<groupId>org.codehaus.mojo</groupId> | ||
<artifactId>exec-maven-plugin</artifactId> | ||
<version>1.1.1</version> | ||
<executions> | ||
<execution> | ||
<phase>compile</phase> | ||
<goals> | ||
<goal>exec</goal> | ||
</goals> | ||
</execution> | ||
</executions> | ||
<configuration> | ||
<executable>bash</executable> | ||
<arguments> | ||
<argument>build-protoc.sh</argument> | ||
<argument>${os.detected.name}</argument> | ||
<argument>${os.detected.arch}</argument> | ||
</arguments> | ||
</configuration> | ||
</plugin> | ||
<plugin> | ||
<groupId>org.codehaus.mojo</groupId> | ||
<artifactId>build-helper-maven-plugin</artifactId> | ||
<version>1.8</version> | ||
<executions> | ||
<execution> | ||
<id>attach-artifacts</id> | ||
<phase>package</phase> | ||
<goals> | ||
<goal>attach-artifact</goal> | ||
</goals> | ||
<configuration> | ||
<artifacts> | ||
<artifact> | ||
<file>${basedir}/target/protoc.exe</file> | ||
<classifier>${os.detected.name}-${os.detected.arch}</classifier> | ||
<type>exe</type> | ||
</artifact> | ||
</artifacts> | ||
</configuration> | ||
</execution> | ||
</executions> | ||
</plugin> | ||
</plugins> | ||
</build> | ||
<profiles> | ||
<profile> | ||
<id>release</id> | ||
<build> | ||
<plugins> | ||
<plugin> | ||
<groupId>org.apache.maven.plugins</groupId> | ||
<artifactId>maven-gpg-plugin</artifactId> | ||
<version>1.5</version> | ||
<executions> | ||
<execution> | ||
<id>sign-artifacts</id> | ||
<phase>verify</phase> | ||
<goals> | ||
<goal>sign</goal> | ||
</goals> | ||
</execution> | ||
</executions> | ||
</plugin> | ||
<plugin> | ||
<groupId>org.sonatype.plugins</groupId> | ||
<artifactId>nexus-staging-maven-plugin</artifactId> | ||
<version>1.6.3</version> | ||
<extensions>true</extensions> | ||
<configuration> | ||
<serverId>sonatype-nexus-staging</serverId> | ||
<nexusUrl>https://oss.sonatype.org/</nexusUrl> | ||
<autoReleaseAfterClose>false</autoReleaseAfterClose> | ||
</configuration> | ||
</plugin> | ||
</plugins> | ||
</build> | ||
</profile> | ||
</profiles> | ||
</project> |