opencensus-cpp icon indicating copy to clipboard operation
opencensus-cpp copied to clipboard

CMake stackdriver enhancements

Open alichnewsky opened this issue 5 years ago • 2 comments

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 a HDRS section just like Bazel.
    • opencensus_lib() allows declaration of headers in subdirectories, and installs them in proper directory
    • build and deploy stackdriver exporters if gRPC and googleapis CMake 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.txt not BUILD files ). 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 using FetchContent()

  • two more examples that builds in repository

    • Linux, Google Compute Engine and Stackdriver stats exporter specific... parses /proc/meminfo and eventually /proc/vmstat and shoves its contents into stackdriver stats exporter. uses cpr as FetchContent() dependency.
    • Linux specific : parses /proc/meminfo and eventually /proc/vmstat and shoves its contents to stdout stats exporter.

Ongoing issues / unresolved:

  • support for exporting package and install
    • segregating public and private headers ( HDRS of non PUBLIC opencenus_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 PRIVATE in opencensus_lib ) I can think of a way involving linking manually all internal libs only for build with:
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_trace and opencensus_context. until those are fixed, no hope for producing shared libraries.
    • Stackdriver exporters as shared lib : google-cloud-cpp has deprecated use of cpp-makefiles project ... 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

Unfortunately I did not read many of the outstanding PRs when I started this work, so it may be very redundant with ongoing efforts.

alichnewsky avatar Jun 19 '20 19:06 alichnewsky

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.

alichnewsky avatar Jun 20 '20 08:06 alichnewsky

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 ?

alichnewsky avatar Jun 20 '20 10:06 alichnewsky