Skip to content

Commit e7579ed

Browse files
authored
Enable generating deb, rpm, NuGet, tgz, zip package through cmake build (#1662)
1 parent dfff693 commit e7579ed

File tree

5 files changed

+143
-6
lines changed

5 files changed

+143
-6
lines changed

CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -542,3 +542,8 @@ install(
542542
EXPORT "${PROJECT_NAME}-target"
543543
NAMESPACE "${PROJECT_NAME}::"
544544
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}")
545+
546+
if(BUILD_PACKAGE)
547+
include(cmake/package.cmake)
548+
include(CPack)
549+
endif()

INSTALL.md

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,42 @@ work on Windows, specifically we can't safely allocate memory in one DLL and
269269
free it in another. For now, OpenTelemetry C++ targets need to be statically
270270
linked into the Windows applications.
271271

272+
## Generatring binary packages
273+
274+
OpenTelemetry C++ supports generating plateform specific binary packages from CMake
275+
configuration. The packages generated through this mayn't be production ready,
276+
and user may have to customize it further before using it as distribution.
277+
278+
- Linux : deb, rpm, tgz
279+
- MacOS : tgz
280+
- Windows : NuGet, zip
281+
282+
This requires platform specific package generators already installed. The package
283+
generation can subsequently be enabled by using BUILD_PACKAGE option during cmake
284+
configuration
285+
286+
```console
287+
$ cd opentelemetry-cpp
288+
$ mkdir build && cd build && cmake -DBUILD_PACKAGE ..
289+
290+
-- Package name: opentelemetry-cpp-1.8.1-ubuntu-20.04-x86_64.deb
291+
-- Configuring done
292+
-- Generating done
293+
...
294+
$
295+
```
296+
297+
Once build is complete as specified in [standalone build section](#building-as-standalone-cmake-project),
298+
the package can be generated as below.
299+
300+
```console
301+
$ cpack -C debug
302+
CPack: Create package using DEB
303+
...
304+
CPack: - package: /home/<user>/opentelemetry-cpp/build/opentelemetry-cpp-1.8.1-ubuntu-20.04-x86_64.deb generated.
305+
$
306+
```
307+
272308
## Using Package Managers
273309

274310
If you are using [Conan](https://www.conan.io/) to manage your dependencies, add

cmake/ParseOsRelease.cmake

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# Parse /etc/os-release to determine Linux distro
2+
3+
if(EXISTS /etc/os-release)
4+
file(STRINGS /etc/os-release OS_RELEASE)
5+
foreach(NameAndValue ${OS_RELEASE})
6+
# Strip leading spaces
7+
string(REGEX REPLACE "^[ ]+" "" NameAndValue ${NameAndValue})
8+
# Find variable name
9+
string(REGEX MATCH "^[^=]+" Name ${NameAndValue})
10+
# Find the value
11+
string(REPLACE "${Name}=" "" Value ${NameAndValue})
12+
# Strip quotes from value
13+
string(REPLACE "\"" "" Value ${Value})
14+
# Set the variable
15+
message("-- /etc/os-release : ${Name}=${Value}")
16+
set("OS_RELEASE_${Name}" "${Value}")
17+
endforeach()
18+
else()
19+
set("OS_RELEASE_NAME" ${CMAKE_SYSTEM_NAME})
20+
set("OS_RELEASE_ID" ${CMAKE_SYSTEM_NAME})
21+
set("OS_RELEASE_VERSION_ID" "1.0")
22+
endif()

cmake/package.cmake

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
2+
set(CPACK_PACKAGE_DESCRIPTION "OpenTelemetry C++ for Linux")
3+
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "OpenTelemetry C++ for Linux - C++ Implementation of OpenTelemetry Specification")
4+
set(CPACK_PACKAGE_VENDOR "OpenTelemetry")
5+
set(CPACK_PACKAGE_CONTACT "OpenTelemetry-cpp")
6+
set(CPACK_PACKAGE_HOMEPAGE_URL "https://opentelemetry.io/")
7+
set(CMAKE_PROJECT_NAME "opentelemetry-cpp")
8+
9+
option(TARBALL "Build a tarball package" OFF)
10+
11+
if (UNIX AND NOT APPLE)
12+
include(cmake/ParseOsRelease.cmake)
13+
set(CPACK_SYSTEM_NAME "${OS_RELEASE_ID}-${OS_RELEASE_VERSION_ID}")
14+
#set(CPACK_PACKAGING_INSTALL_PREFIX "/usr/local")
15+
set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${OPENTELEMETRY_VERSION}-${CPACK_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}")
16+
17+
# Check if system is deb or rpm capable
18+
find_program(RPMCAPABLE rpmbuild)
19+
find_program(DEBCAPABLE dpkg-buildpackage)
20+
if (TARBALL)
21+
set(CPACK_GENERATOR "TGZ")
22+
message("-- Package name: ${CPACK_PACKAGE_FILE_NAME}.tar.gz")
23+
elseif (DEBCAPABLE MATCHES "NOTFOUND" AND RPMCAPABLE MATCHES "NOTFOUND")
24+
message(FATAL_ERROR "Required Package generator not found for either deb or rpm."
25+
" Install required package generation software and try again")
26+
elseif (NOT DEBCAPABLE MATCHES "NOTFOUND")
27+
if (NOT RPMCAPABLE MATCHES "NOTFOUND")
28+
message(WARNING "Both deb and rpm package generator found."
29+
"Selecting deb as default packager.")
30+
endif()
31+
set(CPACK_GENERATOR "DEB")
32+
set(INSTALL_LIB_DIR
33+
${CMAKE_INSTALL_PREFIX}/lib/${CPACK_DEBIAN_ARCHITECTURE}-linux-gnu)
34+
set(CPACK_DEBIAN_PACKAGE_PRIORITY "optional")
35+
set(CPACK_DEBIAN_ARCHITECTURE ${CMAKE_SYSTEM_PROCESSOR})
36+
#set(CPACK_COMPONENTS_ALL headers libraries)
37+
set (CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
38+
message("-- Package name: ${CPACK_PACKAGE_FILE_NAME}.deb")
39+
elseif(NOT RPMCAPABLE MATCHES "NOTFOUND")
40+
set(CPACK_GENERATOR "RPM")
41+
set(INSTALL_LIB_DIR
42+
${CMAKE_INSTALL_PREFIX}/lib/${CMAKE_SYSTEM_PROCESSOR}-linux-gnu)
43+
list(APPEND CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION "/usr/lib64/cmake")
44+
list(APPEND CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION "/usr/lib64/pkgconfig")
45+
set(CPACK_RPM_PACKAGE_LICENSE "Apache-2.0")
46+
message("-- Package name: ${CPACK_PACKAGE_FILE_NAME}.rpm")
47+
endif()
48+
elseif(APPLE)
49+
if (TARBALL)
50+
set(CPACK_GENERATOR "TGZ")
51+
message("-- Package name: ${CPACK_PACKAGE_FILE_NAME}.tar.gz")
52+
endif()
53+
elseif(WIN32)
54+
find_program(NUGETCAPABLE nuget)
55+
if(NOT NUGETCAPABLE MATCHES "NOTFOUND")
56+
set(CPACK_NUGET_PACKAGE_NAME "${CPACK_PROJECT_NAME}")
57+
set(CPACK_NUGET_PACKAGE_VERSION "${OPENTELEMETRY_VERSIOM}")
58+
set(CPACK_NUGET_PACKAGE_DESCRIPTION "${CPACK_PACKAGE_DESCRIPTION}")
59+
set(CPACK_NUGET_PACKAGE_AUTHORS "${CPACK_PACKAGE_VENDOR}")
60+
set(CPACK_NUGET_PACKAGE_TITLE "${CPACK_PACKAGE_DESCRIPTION_SUMMARY}")
61+
set(CPACK_NUGET_PACKAGE_OWNERS "${CPACK_PACKAGE_VENDOR}")
62+
set(CPACK_NUGET_PACKAGE_HOMEPAGE_URL "${CPACK_PACKAGE_HOMEPAGE_URL}")
63+
set(CPACK_NUGET_PACKAGE_DESCRIPTION_SUMMARY "${CPACK_PACKAGE_DESCRIPTION_SUMMARY}")
64+
set(CPACK_NUGET_PACKAGE_COPYRIGHT "${CPACK_PACKAGE_VENDOR}")
65+
set(CPACK_NUGET_PACKAGE_LICENSEURL "https://www.apache.org/licenses/LICENSE-2.0.txt")
66+
set(CPACK_NUGET_PACKAGE_LANGUAGE "en_US")
67+
set(CPACK_GENERATOR NuGet)
68+
else()
69+
set(CPACK_GENERATOR ZIP)
70+
endif()
71+
endif()

exporters/otlp/include/opentelemetry/exporters/otlp/otlp_http_client.h

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,6 @@
33

44
#pragma once
55

6-
#include "opentelemetry/exporters/otlp/protobuf_include_prefix.h"
7-
8-
#include "google/protobuf/message.h"
9-
10-
#include "opentelemetry/exporters/otlp/protobuf_include_suffix.h"
11-
126
#include "opentelemetry/common/spin_lock_mutex.h"
137
#include "opentelemetry/ext/http/client/http_client.h"
148
#include "opentelemetry/nostd/variant.h"
@@ -28,6 +22,15 @@
2822
#include <string>
2923
#include <unordered_map>
3024

25+
// forward declare google::protobuf::Message
26+
namespace google
27+
{
28+
namespace protobuf
29+
{
30+
class Message;
31+
}
32+
} // namespace google
33+
3134
OPENTELEMETRY_BEGIN_NAMESPACE
3235
namespace exporter
3336
{

0 commit comments

Comments
 (0)