Protobuf: CMake (#4846)

* Protobuf: CMake

This rebuilds protobuf to be build with CMake,
so cmake config packages are created and installed, too.

Unfurtunately, this drops support for protobuf < 3.

* Protobuf CMake: Add .pc files

* libprotobuf.a: -fPIC

* Protobuf: Minor Updates

Updates from upstream review and planned patch inclusion.
This commit is contained in:
Axel Huebl 2017-08-02 15:03:31 +02:00 committed by Adam J. Stewart
parent 44ce0adbd5
commit 269925f775
2 changed files with 71 additions and 15 deletions

View File

@ -25,31 +25,29 @@
from spack import *
class Protobuf(AutotoolsPackage):
class Protobuf(CMakePackage):
"""Google's data interchange format."""
homepage = "https://developers.google.com/protocol-buffers"
url = "https://github.com/google/protobuf/archive/v3.2.0.tar.gz"
root_cmakelists_dir = "cmake"
version('3.2.0', '61d899b8369781f6dd1e62370813392d')
version('3.1.0', '14a532a7538551d5def317bfca41dace')
version('3.0.2', '845b39e4b7681a2ddfd8c7f528299fbb')
version('2.5.0', '9c21577a03adc1879aba5b52d06e25cf')
# does not build with CMake:
# version('2.5.0', '9c21577a03adc1879aba5b52d06e25cf')
depends_on('automake', type='build')
depends_on('autoconf', type='build')
depends_on('libtool', type='build')
depends_on('m4', type='build')
depends_on('zlib')
conflicts('%gcc@:4.6') # Requires c++11
variant('shared', default=True, description='Build shared libraries.')
# first fixed in 3.4.0: https://github.com/google/protobuf/pull/3406
patch('pkgconfig.patch', when='@:3.3.2')
def configure_args(self):
if '+shared' in self.spec:
return ['--enable-shared=yes',
'--enable-static=no']
else:
return ['--enable-shared=no',
'--enable-static=yes',
'--with-pic=yes']
def cmake_args(self):
args = [
'-Dprotobuf_BUILD_TESTS:BOOL=OFF',
'-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=ON'
]
return args

View File

@ -0,0 +1,58 @@
diff --git a/cmake/install.cmake b/cmake/install.cmake
index 28dc90d..441bf55 100644
--- a/cmake/install.cmake
+++ b/cmake/install.cmake
@@ -1,5 +1,10 @@
include(GNUInstallDirs)
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/protobuf.pc.cmake
+ ${CMAKE_CURRENT_BINARY_DIR}/protobuf.pc @ONLY)
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/protobuf-lite.pc.cmake
+ ${CMAKE_CURRENT_BINARY_DIR}/protobuf-lite.pc @ONLY)
+
foreach(_library
libprotobuf-lite
libprotobuf
@@ -17,6 +22,8 @@ endforeach()
install(TARGETS protoc EXPORT protobuf-targets
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT protoc)
+install(FILES ${CMAKE_CURRENT_BINARY_DIR}/protobuf.pc ${CMAKE_CURRENT_BINARY_DIR}/protobuf-lite.pc DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
+
file(STRINGS extract_includes.bat.in _extract_strings
REGEX "^copy")
foreach(_extract_string ${_extract_strings})
diff --git a/cmake/protobuf-lite.pc.cmake b/cmake/protobuf-lite.pc.cmake
new file mode 100644
index 0000000..cbe5426
--- /dev/null
+++ b/cmake/protobuf-lite.pc.cmake
@@ -0,0 +1,11 @@
+prefix=@CMAKE_INSTALL_PREFIX@
+exec_prefix=@CMAKE_INSTALL_PREFIX@
+libdir=@CMAKE_INSTALL_FULL_LIBDIR@
+includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@
+
+Name: Protocol Buffers
+Description: Google's Data Interchange Format
+Version: @protobuf_VERSION@
+Libs: -L${libdir} -lprotobuf-lite @CMAKE_THREAD_LIBS_INIT@
+Cflags: -I${includedir} @CMAKE_THREAD_LIBS_INIT@
+Conflicts: protobuf
diff --git a/cmake/protobuf.pc.cmake b/cmake/protobuf.pc.cmake
new file mode 100644
index 0000000..2e30763
--- /dev/null
+++ b/cmake/protobuf.pc.cmake
@@ -0,0 +1,11 @@
+prefix=@CMAKE_INSTALL_PREFIX@
+exec_prefix=@CMAKE_INSTALL_PREFIX@
+libdir=@CMAKE_INSTALL_FULL_LIBDIR@
+includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@
+
+Name: Protocol Buffers
+Description: Google's Data Interchange Format
+Version: @protobuf_VERSION@
+Libs: -L${libdir} -lprotobuf @CMAKE_THREAD_LIBS_INIT@
+Cflags: -I${includedir} @CMAKE_THREAD_LIBS_INIT@
+Conflicts: protobuf-lite