Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
P
protobuf
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
protobuf
Commits
78944e14
Unverified
Commit
78944e14
authored
Jul 13, 2018
by
Feng Xiao
Committed by
GitHub
Jul 13, 2018
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #4913 from xfxyjwf/protoc
Update protoc build scripts.
parents
4a0ad7b0
6fa17eb3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
167 additions
and
166 deletions
+167
-166
README.md
protoc-artifacts/README.md
+101
-115
build-protoc.sh
protoc-artifacts/build-protoc.sh
+34
-20
pom.xml
protoc-artifacts/pom.xml
+32
-31
No files found.
protoc-artifacts/README.md
View file @
78944e14
...
@@ -7,13 +7,31 @@ build and publish a ``protoc`` executable (a.k.a. artifact) to Maven
...
@@ -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
repositories. The artifact can be used by build automation tools so that users
would not need to compile and install
``protoc``
for their systems.
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
## Versioning
The version of the
``protoc``
artifact must be the same as the version of the
The version of the
``protoc``
artifact must be the same as the version of the
Protobuf project.
Protobuf project.
## Artifact name
## Artifact name
The name of a published
``protoc``
artifact is in the following format:
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
## System requirement
Install
[
Apache Maven
](
http://maven.apache.org/
)
if you don't have it.
Install
[
Apache Maven
](
http://maven.apache.org/
)
if you don't have it.
...
@@ -29,95 +47,116 @@ generate the configure script.
...
@@ -29,95 +47,116 @@ generate the configure script.
Under the protobuf project directory:
Under the protobuf project directory:
```
```
$ ./autogen.sh
&& ./configure && make
$ ./autogen.sh
```
```
## To install artifacts locally
### Build the artifact for each platform
The following command will install the
``protoc``
artifact to your local Maven repository.
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 above command will produce a
`target/linux/x86_64/protoc`
binary under the
The Maven script will try to detect the OS and the architecture from Java
protoc-artifacts directory.
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.
You can override the Maven properties
``os.detected.name``
and
For a list of supported platforms, see the comments in the build-protoc.sh
``os.detected.arch``
to force the script to generate binaries for a specific OS
script. We only use this script to build artifacts on Ubuntu and MacOS (both
and/or architecture. Valid values are defined as the return values of
with x86_64, and do cross-compilation for other platforms.
``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
)
.
### Tips for building for Linux
Frequently used values are:
We build on Centos 6.9 to provide a good compatibility for not very new
-
``os.detected.name``
:
``linux``
,
``osx``
,
``windows``
.
systems. We have provided a
``Dockerfile``
under this directory to build the
-
``os.detected.arch``
:
``x86_32``
,
``x86_64``
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
## To push artifacts to Maven Central
Before you can upload artifacts to Maven Central repository, make sure you have
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
read
[
this page
](
http://central.sonatype.org/pages/apache-maven.html
)
on how to
configure GPG and Sonatype account.
configure GPG and Sonatype account.
You need to perform the deployment for every platform that you want to
Before you do the deployment, make sure you have built the protoc artifacts for
support. DO NOT close the staging repository until you have done the
every supported platform and put them under the target directory. Example
deployment for all platforms. Currently the following platforms are supported:
target directory layout:
-
Linux (x86_32, x86_64 and cross compiled aarch_64)
-
Windows (x86_32 and x86_64) with
+ pom.xml
-
Cygwin64 with MinGW compilers (x86_64)
+ target
-
MSYS with MinGW32 (x86_32)
+ linux
-
Cross compile in Linux with MinGW-w64 (x86_32, x86_64)
+ x86_64
-
MacOSX (x86_32 and x86_64)
protoc.exe
+ x86_32
As for MSYS2/MinGW64 for Windows: protoc will build, but it insists on
protoc.exe
adding a dependency of
`libwinpthread-1.dll`
, which isn't shipped with
+ macos
Windows.
+ 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
Use the following command to deploy artifacts for the host platform to a
staging repository.
staging repository.
```
```
$ mvn clean deploy -P release
$ mvn clean deploy -P release
```
```
It creates a new staging repository. Go to
It creates a new staging repository. Go to
https://oss.sonatype.org/#stagingRepositories and find the repository, usually
https://oss.sonatype.org/#stagingRepositories and find the repository, usually
in the name like
``comgoogle-123``
.
in the name like
``comgoogle-123``
. Verify that the staging repository has all
the binaries, close and release this repository.
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.
## Upload zip packages to github release page.
## Upload zip packages to github release page.
After uploading protoc artifacts to Maven Central repository, run the
After uploading protoc artifacts to Maven Central repository, run the
build-zip.sh script to bulid zip packages for these protoc binaries
build-zip.sh script to bulid zip packages for these protoc binaries
and upload these zip packages to the download section of the github
and upload these zip packages to the download section of the github
release. For example:
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:
The above command will create 5 zip files:
```
```
dist/protoc-3.0.0-beta-4-win32.zip
dist/protoc-3.0.0-beta-4-win32.zip
dist/protoc-3.0.0-beta-4-osx-x86_32.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
...
@@ -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_32.zip
dist/protoc-3.0.0-beta-4-linux-x86_64.zip
dist/protoc-3.0.0-beta-4-linux-x86_64.zip
```
```
Before running the script, make sure the artifacts are accessible from:
Before running the script, make sure the artifacts are accessible from:
http://repo1.maven.org/maven2/com/google/protobuf/protoc/
http://repo1.maven.org/maven2/com/google/protobuf/protoc/
### Tips for deploying on Linux
## Tested build environments
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
We have successfully built artifacts on the following environments:
We have successfully built artifacts on the following environments:
-
Linux x86_32 and x86_64:
-
Linux x86_32 and x86_64:
-
Centos 6.6 (within Docker 1.6.1)
-
Centos 6.9 (within Docker 1.6.1)
-
Ubuntu 14.04.2 64-bit
-
Ubuntu 14.04.5 64-bit
-
Linux aarch_64: Cross compiled with
`g++-aarch64-linux-gnu`
on Ubuntu 14.04.2 64-bit
-
Linux aarch_64: Cross compiled with
`g++-aarch64-linux-gnu`
on Ubuntu 14.04.5 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
-
Mac OS X x86_32 and x86_64: Mac OS X 10.9.5
-
Mac OS X x86_32 and x86_64: Mac OS X 10.9.5
protoc-artifacts/build-protoc.sh
View file @
78944e14
#!/bin/bash
#!/bin/bash
# Builds protoc executable into target/protoc.exe; optionally build protoc
# Builds protoc executable into target/<OS>/<ARCH>/protoc.exe; optionally builds
# plugins into target/protoc-gen-*.exe
# protoc plugins into target/<OS>/<ARCH>/protoc-gen-*.exe
# To be run from Maven.
# Usage: build-protoc.sh <OS> <ARCH> <TARGET>
# <OS> and <ARCH> are ${os.detected.name} and ${os.detected.arch} from os-maven-plugin
# <TARGET> can be "protoc" or "protoc-gen-javalite"
#
#
# The script now supports cross-compiling windows and linux-arm64 in linux-x86
# Usage: ./build-protoc.sh <OS> <ARCH> <TARGET>
# environment. Required packages:
#
# - Windows: i686-w64-mingw32-gcc (32bit) and x86_64-w64-mingw32-gcc (64bit)
# <TARGET> can be "protoc" or "protoc-gen-javalite". Supported <OS> <ARCH>
# - Arm64: g++-aarch64-linux-gnu
# combinations:
# HOST <OS> <ARCH> <COMMENT>
# cygwin windows x86_32 Requires: i686-w64-mingw32-gcc
# cygwin windows x86_64 Requires: x86_64-w64-mingw32-gcc
# linux linux aarch_64 Requires: g++-aarch64-linux-gnu
# linux linux x86_32
# linux linux x86_64
# linux windows x86_32 Requires: i686-w64-mingw32-gcc
# linux windows x86_64 Requires: x86_64-w64-mingw32-gcc
# macos osx x86_32
# macos osx x86_64
# mingw windows x86_32
# mingw windows x86_64
#
# Before running this script, make sure you have generated the configure script
# in the parent directory (i.e., run ./autogen.sh there).
OS
=
$1
OS
=
$1
ARCH
=
$2
ARCH
=
$2
MAKE_TARGET
=
$3
MAKE_TARGET
=
$3
if
[[
$#
< 3
]]
;
then
if
[[
$#
< 3
]]
;
then
echo
"No
arguments provided. This script is intended to be run from Maven
."
echo
"No
t enough arguments provided
."
exit
1
exit
1
fi
fi
...
@@ -156,13 +167,8 @@ checkDependencies ()
...
@@ -156,13 +167,8 @@ checkDependencies ()
echo
"Building protoc, OS=
$OS
ARCH=
$ARCH
TARGET=
$TARGET
"
echo
"Building protoc, OS=
$OS
ARCH=
$ARCH
TARGET=
$TARGET
"
# Nested double quotes are unintuitive, but it works.
cd
"
$(
dirname
"
$0
"
)
"
WORKING_DIR
=
$(
pwd
)
CONFIGURE_ARGS
=
"--disable-shared"
CONFIGURE_ARGS
=
"--disable-shared"
TARGET_FILE
=
target/
$MAKE_TARGET
.exe
if
[[
"
$OS
"
==
windows
]]
;
then
if
[[
"
$OS
"
==
windows
]]
;
then
MAKE_TARGET
=
"
${
MAKE_TARGET
}
.exe"
MAKE_TARGET
=
"
${
MAKE_TARGET
}
.exe"
fi
fi
...
@@ -242,10 +248,18 @@ fi
...
@@ -242,10 +248,18 @@ fi
export
CXXFLAGS LDFLAGS
export
CXXFLAGS LDFLAGS
cd
"
$WORKING_DIR
"
/..
&&
./configure
$CONFIGURE_ARGS
&&
# Nested double quotes are unintuitive, but it works.
cd
src
&&
make clean
&&
make
$MAKE_TARGET
&&
cd
"
$(
dirname
"
$0
"
)
"
cd
"
$WORKING_DIR
"
&&
mkdir
-p
target
&&
cp
../src/
$MAKE_TARGET
$TARGET_FILE
||
WORKING_DIR
=
"
$(
pwd
)
"
BUILD_DIR
=
"build/
$OS
/
$ARCH
"
TARGET_FILE
=
"target/
$OS
/
$ARCH
/
$MAKE_TARGET
.exe"
mkdir
-p
"
$BUILD_DIR
"
&&
cd
"
$BUILD_DIR
"
&&
../../../../configure
$CONFIGURE_ARGS
&&
cd
src
&&
make
$MAKE_TARGET
-j8
&&
cd
"
$WORKING_DIR
"
&&
mkdir
-p
$(
dirname
$TARGET_FILE
)
&&
cp
$BUILD_DIR
/src/
$MAKE_TARGET
$TARGET_FILE
||
exit
1
exit
1
if
[[
"
$OS
"
==
osx
]]
;
then
if
[[
"
$OS
"
==
osx
]]
;
then
...
...
protoc-artifacts/pom.xml
View file @
78944e14
...
@@ -33,36 +33,7 @@
...
@@ -33,36 +33,7 @@
</connection>
</connection>
</scm>
</scm>
<build>
<build>
<extensions>
<extension>
<groupId>
kr.motd.maven
</groupId>
<artifactId>
os-maven-plugin
</artifactId>
<version>
1.5.0.Final
</version>
</extension>
</extensions>
<plugins>
<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>
<argument>
protoc
</argument>
</arguments>
</configuration>
</plugin>
<plugin>
<plugin>
<groupId>
org.codehaus.mojo
</groupId>
<groupId>
org.codehaus.mojo
</groupId>
<artifactId>
build-helper-maven-plugin
</artifactId>
<artifactId>
build-helper-maven-plugin
</artifactId>
...
@@ -77,8 +48,38 @@
...
@@ -77,8 +48,38 @@
<configuration>
<configuration>
<artifacts>
<artifacts>
<artifact>
<artifact>
<file>
${basedir}/target/protoc.exe
</file>
<file>
${basedir}/target/linux/x86_64/protoc.exe
</file>
<classifier>
${os.detected.name}-${os.detected.arch}
</classifier>
<classifier>
linux-x86_64
</classifier>
<type>
exe
</type>
</artifact>
<artifact>
<file>
${basedir}/target/linux/x86_32/protoc.exe
</file>
<classifier>
linux-x86_32
</classifier>
<type>
exe
</type>
</artifact>
<artifact>
<file>
${basedir}/target/windows/x86_64/protoc.exe
</file>
<classifier>
windows-x86_64
</classifier>
<type>
exe
</type>
</artifact>
<artifact>
<file>
${basedir}/target/windows/x86_32/protoc.exe
</file>
<classifier>
windows-x86_32
</classifier>
<type>
exe
</type>
</artifact>
<artifact>
<file>
${basedir}/target/osx/x86_64/protoc.exe
</file>
<classifier>
osx-x86_64
</classifier>
<type>
exe
</type>
</artifact>
<artifact>
<file>
${basedir}/target/osx/x86_32/protoc.exe
</file>
<classifier>
osx-x86_32
</classifier>
<type>
exe
</type>
</artifact>
<artifact>
<file>
${basedir}/target/linux/aarch_64/protoc.exe
</file>
<classifier>
linux-aarch_64
</classifier>
<type>
exe
</type>
<type>
exe
</type>
</artifact>
</artifact>
</artifacts>
</artifacts>
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment