|
|
|
@ -7,13 +7,31 @@ 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. |
|
|
|
|
|
|
|
|
|
If you would like us to publish protoc artifact for a new platform, please send |
|
|
|
|
us a pull request to add support for the new platform. You would need to change |
|
|
|
|
the following files: |
|
|
|
|
|
|
|
|
|
* [build-protoc.sh](build-protoc.sh): script to cross-build the protoc for your |
|
|
|
|
platform. |
|
|
|
|
* [pom.xml](pom.xml): script to upload artifacts to maven. |
|
|
|
|
* [build-zip.sh](build-zip.sh): script to package published maven artifacts in |
|
|
|
|
our release page. |
|
|
|
|
|
|
|
|
|
## Maven Location |
|
|
|
|
The published protoc artifacts are available on Maven here: |
|
|
|
|
|
|
|
|
|
http://central.maven.org/maven2/com/google/protobuf/protoc/ |
|
|
|
|
|
|
|
|
|
## 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``. |
|
|
|
|
``protoc-<version>-<os>-<arch>.exe``, e.g., ``protoc-3.6.1-linux-x86_64.exe``. |
|
|
|
|
|
|
|
|
|
Note that artifacts for linux/macos also have the `.exe` suffix but they are |
|
|
|
|
not windows binaries. |
|
|
|
|
|
|
|
|
|
## System requirement |
|
|
|
|
Install [Apache Maven](http://maven.apache.org/) if you don't have it. |
|
|
|
@ -29,95 +47,116 @@ generate the configure script. |
|
|
|
|
|
|
|
|
|
Under the protobuf project directory: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
``` |
|
|
|
|
$ ./autogen.sh && ./configure && make |
|
|
|
|
$ ./autogen.sh |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
## To install artifacts locally |
|
|
|
|
The following command will install the ``protoc`` artifact to your local Maven repository. |
|
|
|
|
### Build the artifact for each platform |
|
|
|
|
|
|
|
|
|
Run the build-protoc.sh script under this protoc-artifacts directory to build the protoc |
|
|
|
|
artifact for each platform. For example: |
|
|
|
|
|
|
|
|
|
``` |
|
|
|
|
$ mvn install |
|
|
|
|
$ cd protoc-artifacts |
|
|
|
|
$ ./build-protoc.sh linux x86_64 protoc |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
## 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. |
|
|
|
|
The above command will produce a `target/linux/x86_64/protoc` binary under the |
|
|
|
|
protoc-artifacts directory. |
|
|
|
|
|
|
|
|
|
You can override the Maven properties ``os.detected.name`` and |
|
|
|
|
``os.detected.arch`` to force the script to generate binaries for a specific OS |
|
|
|
|
and/or architecture. Valid values are defined as the return values of |
|
|
|
|
``normalizeOs()`` and ``normalizeArch()`` of ``Detector`` from |
|
|
|
|
[os-maven-plugin](https://github.com/trustin/os-maven-plugin/blob/master/src/main/java/kr/motd/maven/os/Detector.java). |
|
|
|
|
Frequently used values are: |
|
|
|
|
- ``os.detected.name``: ``linux``, ``osx``, ``windows``. |
|
|
|
|
- ``os.detected.arch``: ``x86_32``, ``x86_64`` |
|
|
|
|
For a list of supported platforms, see the comments in the build-protoc.sh |
|
|
|
|
script. We only use this script to build artifacts on Ubuntu and MacOS (both |
|
|
|
|
with x86_64, and do cross-compilation for other platforms. |
|
|
|
|
|
|
|
|
|
### Tips for building for Linux |
|
|
|
|
We build on Centos 6.9 to provide a good compatibility for not very new |
|
|
|
|
systems. We have provided a ``Dockerfile`` under this directory to build the |
|
|
|
|
environment. It has been tested with Docker 1.6.1. |
|
|
|
|
|
|
|
|
|
To build a image: |
|
|
|
|
|
|
|
|
|
For example, MinGW32 only ships with 32-bit compilers, but you can still build |
|
|
|
|
32-bit protoc under 64-bit Windows, with the following command: |
|
|
|
|
``` |
|
|
|
|
$ mvn install -Dos.detected.arch=x86_32 |
|
|
|
|
$ docker build -t protoc-artifacts . |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
To run the image: |
|
|
|
|
|
|
|
|
|
``` |
|
|
|
|
$ docker run -it --rm=true protoc-artifacts bash |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
To checkout protobuf (run within the container): |
|
|
|
|
|
|
|
|
|
``` |
|
|
|
|
$ # Replace v3.5.1 with the version you want |
|
|
|
|
$ wget -O - https://github.com/google/protobuf/archive/v3.5.1.tar.gz | tar xvzp |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
### Windows build |
|
|
|
|
We no longer use scripts in this directory to build windows artifacts. Instead, |
|
|
|
|
we use Visual Studio 2015 to build our windows release artifacts. See our |
|
|
|
|
[kokoro windows build scripts here](../kokoro/release/protoc/windows/build.bat). |
|
|
|
|
|
|
|
|
|
To upload windows artifacts, copy the built binaries into this directory and |
|
|
|
|
put it into the target/windows/(x86_64|x86_32) directory the same way as the |
|
|
|
|
artifacts for other platforms. That will allow the maven script to find and |
|
|
|
|
upload the artifacts to maven. |
|
|
|
|
|
|
|
|
|
## 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. |
|
|
|
|
|
|
|
|
|
You need to perform the deployment for every platform that you want to |
|
|
|
|
support. DO NOT close the staging repository until you have done the |
|
|
|
|
deployment for all platforms. Currently the following platforms are supported: |
|
|
|
|
- Linux (x86_32, x86_64 and cross compiled aarch_64) |
|
|
|
|
- Windows (x86_32 and x86_64) with |
|
|
|
|
- Cygwin64 with MinGW compilers (x86_64) |
|
|
|
|
- MSYS with MinGW32 (x86_32) |
|
|
|
|
- Cross compile in Linux with MinGW-w64 (x86_32, x86_64) |
|
|
|
|
- MacOSX (x86_32 and x86_64) |
|
|
|
|
|
|
|
|
|
As for MSYS2/MinGW64 for Windows: protoc will build, but it insists on |
|
|
|
|
adding a dependency of `libwinpthread-1.dll`, which isn't shipped with |
|
|
|
|
Windows. |
|
|
|
|
Before you do the deployment, make sure you have built the protoc artifacts for |
|
|
|
|
every supported platform and put them under the target directory. Example |
|
|
|
|
target directory layout: |
|
|
|
|
|
|
|
|
|
+ pom.xml |
|
|
|
|
+ target |
|
|
|
|
+ linux |
|
|
|
|
+ x86_64 |
|
|
|
|
protoc.exe |
|
|
|
|
+ x86_32 |
|
|
|
|
protoc.exe |
|
|
|
|
+ macos |
|
|
|
|
+ x86_64 |
|
|
|
|
protoc.exe |
|
|
|
|
+ x86_32 |
|
|
|
|
protoc.exe |
|
|
|
|
+ windows |
|
|
|
|
+ x86_64 |
|
|
|
|
protoc.exe |
|
|
|
|
+ x86_32 |
|
|
|
|
protoc.exe |
|
|
|
|
|
|
|
|
|
You will need to build the artifacts on multiple machines and gather them |
|
|
|
|
together into one place. |
|
|
|
|
|
|
|
|
|
Use the following command to deploy artifacts for the host platform to a |
|
|
|
|
staging repository. |
|
|
|
|
|
|
|
|
|
``` |
|
|
|
|
$ mvn clean deploy -P release |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
It creates a new staging repository. Go to |
|
|
|
|
https://oss.sonatype.org/#stagingRepositories and find the repository, usually |
|
|
|
|
in the name like ``comgoogle-123``. |
|
|
|
|
|
|
|
|
|
You will want to run this command on a different platform. Remember, in |
|
|
|
|
subsequent deployments you will need to provide the repository name that you |
|
|
|
|
have found in the first deployment so that all artifacts go to the same |
|
|
|
|
repository: |
|
|
|
|
``` |
|
|
|
|
$ mvn clean deploy -P release -Dstaging.repository=comgoogle-123 |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
A 32-bit artifact can be deployed from a 64-bit host with |
|
|
|
|
``-Dos.detected.arch=x86_32`` |
|
|
|
|
|
|
|
|
|
An arm64 artifact can be deployed from x86 host with |
|
|
|
|
``-Dos.detected.arch=aarch_64`` |
|
|
|
|
|
|
|
|
|
A windows artifact can be deployed from a linux machine with |
|
|
|
|
``-Dos.detected.name=windows`` |
|
|
|
|
|
|
|
|
|
When you have done deployment for all platforms, go to |
|
|
|
|
https://oss.sonatype.org/#stagingRepositories, verify that the staging |
|
|
|
|
repository has all the binaries, close and release this repository. |
|
|
|
|
in the name like ``comgoogle-123``. Verify that the staging repository has all |
|
|
|
|
the binaries, close and release this repository. |
|
|
|
|
|
|
|
|
|
## Upload zip packages to github release page. |
|
|
|
|
After uploading protoc artifacts to Maven Central repository, run the |
|
|
|
|
build-zip.sh script to bulid zip packages for these protoc binaries |
|
|
|
|
and upload these zip packages to the download section of the github |
|
|
|
|
release. For example: |
|
|
|
|
|
|
|
|
|
``` |
|
|
|
|
$ ./build-zip.sh 3.0.0-beta-4 |
|
|
|
|
$ ./build-zip.sh 3.6.0 |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
The above command will create 5 zip files: |
|
|
|
|
|
|
|
|
|
``` |
|
|
|
|
dist/protoc-3.0.0-beta-4-win32.zip |
|
|
|
|
dist/protoc-3.0.0-beta-4-osx-x86_32.zip |
|
|
|
@ -125,67 +164,14 @@ dist/protoc-3.0.0-beta-4-osx-x86_64.zip |
|
|
|
|
dist/protoc-3.0.0-beta-4-linux-x86_32.zip |
|
|
|
|
dist/protoc-3.0.0-beta-4-linux-x86_64.zip |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
Before running the script, make sure the artifacts are accessible from: |
|
|
|
|
http://repo1.maven.org/maven2/com/google/protobuf/protoc/ |
|
|
|
|
|
|
|
|
|
### Tips for deploying on Linux |
|
|
|
|
We build on Centos 6.6 to provide a good compatibility for not very new |
|
|
|
|
systems. We have provided a ``Dockerfile`` under this directory to build the |
|
|
|
|
environment. It has been tested with Docker 1.6.1. |
|
|
|
|
|
|
|
|
|
To build a image: |
|
|
|
|
``` |
|
|
|
|
$ docker build -t protoc-artifacts . |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
To run the image: |
|
|
|
|
``` |
|
|
|
|
$ docker run -it --rm=true protoc-artifacts bash |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
To checkout protobuf (run within the container): |
|
|
|
|
``` |
|
|
|
|
$ # Replace v3.5.1 with the version you want |
|
|
|
|
$ wget -O - https://github.com/google/protobuf/archive/v3.5.1.tar.gz | tar xvzp |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
### Tips for deploying on Windows |
|
|
|
|
Under Windows the following error may occur: ``gpg: cannot open tty `no tty': |
|
|
|
|
No such file or directory``. This can be fixed by configuring gpg through an |
|
|
|
|
active profile in ``.m2\settings.xml`` where also the Sonatype password is |
|
|
|
|
stored: |
|
|
|
|
```xml |
|
|
|
|
<settings> |
|
|
|
|
<servers> |
|
|
|
|
<server> |
|
|
|
|
<id>sonatype-nexus-staging</id> |
|
|
|
|
<username>[username]</username> |
|
|
|
|
<password>[password]</password> |
|
|
|
|
</server> |
|
|
|
|
</servers> |
|
|
|
|
<profiles> |
|
|
|
|
<profile> |
|
|
|
|
<id>gpg</id> |
|
|
|
|
<properties> |
|
|
|
|
<gpg.executable>gpg</gpg.executable> |
|
|
|
|
<gpg.passphrase>[password]</gpg.passphrase> |
|
|
|
|
</properties> |
|
|
|
|
</profile> |
|
|
|
|
</profiles> |
|
|
|
|
<activeProfiles> |
|
|
|
|
<activeProfile>gpg</activeProfile> |
|
|
|
|
</activeProfiles> |
|
|
|
|
</settings> |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
### Tested build environments |
|
|
|
|
## Tested build environments |
|
|
|
|
We have successfully built artifacts on the following environments: |
|
|
|
|
- Linux x86_32 and x86_64: |
|
|
|
|
- Centos 6.6 (within Docker 1.6.1) |
|
|
|
|
- Ubuntu 14.04.2 64-bit |
|
|
|
|
- Linux aarch_64: Cross compiled with `g++-aarch64-linux-gnu` on Ubuntu 14.04.2 64-bit |
|
|
|
|
- Windows x86_32: MSYS with ``mingw32-gcc-g++ 4.8.1-4`` on Windows 7 64-bit |
|
|
|
|
- Windows x86_32: Cross compile with ``i686-w64-mingw32-g++ 4.8.2`` on Ubuntu 14.04.2 64-bit |
|
|
|
|
- Windows x86_64: Cygwin64 with ``mingw64-x86_64-gcc-g++ 4.8.3-1`` on Windows 7 64-bit |
|
|
|
|
- Windows x86_64: Cross compile with ``x86_64-w64-mingw32-g++ 4.8.2`` on Ubuntu 14.04.2 64-bit |
|
|
|
|
- Centos 6.9 (within Docker 1.6.1) |
|
|
|
|
- Ubuntu 14.04.5 64-bit |
|
|
|
|
- Linux aarch_64: Cross compiled with `g++-aarch64-linux-gnu` on Ubuntu 14.04.5 64-bit |
|
|
|
|
- Mac OS X x86_32 and x86_64: Mac OS X 10.9.5 |
|
|
|
|