opencensus-cpp
opencensus-cpp copied to clipboard
CMake stackdriver enhancements
do not merge yet, it is still work in progress. I probably also left quite a few comments that need removing.
many enhancements to CMake support ( see #244 )
-
support for exporting package and install ( related to #256 )
opencensus_lib()now has aHDRSsection just like Bazel.opencensus_lib()allows declaration of headers in subdirectories, and installs them in proper directory- build and deploy stackdriver exporters if
gRPCandgoogleapisCMake packages are installed already, and built with -DBUILD_STACKDRIVER_EXPORTER=ON flag.
-
(failed) attempt at allowing build as shared libraries ( more on that later )
- added ( gcc specific ) helper code to request no undefined symbols in shared libraries.
- outlined and fixed many missing dependencies declarations (fixed only in
CMakeLists.txtnotBUILDfiles ). Mostly around missing the context library as a dependency. - as of now, if you try to build with shared libraries, I think I always give you static libraries with position independent code...
-
attempt at
find_package()before usingFetchContent() -
two more examples that builds in repository
- Linux, Google Compute Engine and Stackdriver stats exporter specific...
parses
/proc/meminfoand eventually/proc/vmstatand shoves its contents into stackdriver stats exporter. uses cpr asFetchContent()dependency. - Linux specific : parses
/proc/meminfoand eventually/proc/vmstatand shoves its contents to stdout stats exporter.
- Linux, Google Compute Engine and Stackdriver stats exporter specific...
parses
Ongoing issues / unresolved:
- support for exporting package and install
- segregating public and private headers (
HDRSof nonPUBLICopencenus_lib()) ( it looks like customer can write code that includes internal files, so I install them ) - issues linking private static libraries together into bigger public ones.
( as Bazel does. I deploy the internal libraries as static libs unless marked as
PRIVATEinopencensus_lib) I can think of a way involving linking manually all internal libs only for build with:
- segregating public and private headers (
opencensus_lib(
drink
PUBLIC
HDRS
drink.h
SRCS
drink.cc
DEPS
# publicly visible target
bar
# private targets
$<BUILD_INTERFACE:speakeasy>
)
- not sure I handle correctly yet CMake builds without Stackdriver.
- (failed) attempt at allowing build as shared libraries
- attempt failed because of circular dependencies between
opencensus_traceandopencensus_context. until those are fixed, no hope for producing shared libraries. - Stackdriver exporters as shared lib :
google-cloud-cpphas deprecated use ofcpp-makefilesproject ... I have a branch for that somewhere, but this work assumes there is a googleapis cmake package that contains- the monitoring v3 API libraries for stats
- the cloud trace and tracing v2 API libraries for trace
- attempt failed because of circular dependencies between
Unfortunately I did not read many of the outstanding PRs when I started this work, so it may be very redundant with ongoing efforts.
tools/docker-format/Dockerfile is obsolete (#448).
hence, no pre-commit formatting, and significant effort to get the linux/ubuntu ci builds green.
related PR here #449.
circular depdendency between opencensus_trace.so and opencensus_context.so
building shared libraries with code as is gives a linking error:
[ 70%] Linking CXX shared library libopencensus_trace.so
CMakeFiles/opencensus_trace.dir/internal/context_util.cc.o: In function `opencensus::trace::GetCurrentSpan()':
context_util.cc:(.text+0x5): undefined reference to `opencensus::context::Context::Current()'
CMakeFiles/opencensus_trace.dir/internal/with_span.cc.o: In function `opencensus::trace::WithSpan::WithSpan(opencensus::trace::Span const&, bool, bool)':
with_span.cc:(.text+0x4d): undefined reference to `opencensus::context::Context::InternalMutableCurrent()'
CMakeFiles/opencensus_trace.dir/internal/with_span.cc.o: In function `opencensus::trace::WithSpan::ConditionalSwap()':
with_span.cc:(.text+0xcf): undefined reference to `opencensus::context::Context::InternalMutableCurrent()'
CMakeFiles/opencensus_trace.dir/internal/with_span.cc.o: In function `opencensus::trace::WithSpan::~WithSpan()':
with_span.cc:(.text+0x10d): undefined reference to `opencensus::context::Context::InternalMutableCurrent()'
with_span.cc:(.text+0x1a4): undefined reference to `opencensus::context::Context::InternalMutableCurrent()'
clang-7: error: linker command failed with exit code 1 (use -v to see invocation)
opencensus/trace/CMakeFiles/opencensus_trace.dir/build.make:406: recipe for target 'opencensus/trace/libopencensus_trace.so' failed
make[2]: *** [opencensus/trace/libopencensus_trace.so] Error 1
make[2]: Leaving directory '/opencensus-cpp/cmake-out'
CMakeFiles/Makefile2:8650: recipe for target 'opencensus/trace/CMakeFiles/opencensus_trace.dir/all' failed
make[1]: *** [opencensus/trace/CMakeFiles/opencensus_trace.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....
adding context as a direct depdendency to opencensus_trace.so would give a configuration error. Cyclic depdendencies.
...
-- Configuring done
CMake Error: The inter-target dependency graph contains the following strongly connected component (cycle):
"opencensus_context" of type SHARED_LIBRARY
depends on "opencensus_trace" (weak)
"opencensus_trace" of type SHARED_LIBRARY
depends on "opencensus_context" (weak)
At least one of these targets is not a STATIC_LIBRARY. Cyclic dependencies are allowed only among static libraries.
-- Build files have been written to: /opencensus-cpp/cmake-out
Makefile:2658: recipe for target 'cmake_check_build_system' failed
make: *** [cmake_check_build_system] Error 1
make: Leaving directory '/opencensus-cpp/cmake-out'
As a result, as of today, the only way to assemble this code is with a static library. Worthy of a separate issue ?