From 55ddd9a0433b70efec8c9e3a612c6453fd65402e Mon Sep 17 00:00:00 2001 From: duncanpo Date: Mon, 11 Sep 2023 22:30:49 -0400 Subject: [PATCH 1/4] Use fetchcontent to obtain vcpkg --- .github/workflows/build.yml | 11 --- CMakeLists.txt | 140 ++++++++++++++++++++++++++---------- README.md | 12 +--- vcpkg.json | 12 ++++ 4 files changed, 115 insertions(+), 60 deletions(-) create mode 100644 vcpkg.json diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b25bc2c..f7e5ee2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -9,25 +9,14 @@ jobs: OPENTELEMETRY_CPP_INSTALL: "${{ github.workspace }}/otel_cpp_install" OPENTELEMETRY_MATLAB_INSTALL: "${{ github.workspace }}/otel_matlab_install" OPENTELEMETRY_COLLECTOR_INSTALL: "${{ github.workspace }}/otelcol" - VCPKG_ROOT: "${{ github.workspace }}/vcpkg" SYSTEM_LIBSTDCPP_PATH: "/usr/lib/x86_64-linux-gnu/libstdc++.so.6" steps: - name: Download OpenTelemetry-Matlab source uses: actions/checkout@v3 with: path: opentelemetry-matlab - - name: Download vcpkg - uses: actions/checkout@v3 - with: - repository: microsoft/vcpkg - path: vcpkg - name: Install MATLAB uses: matlab-actions/setup-matlab@v1 - - name: Install vcpkg packages - run: | - cd vcpkg - ./bootstrap-vcpkg.sh - ./vcpkg install curl nlohmann-json protobuf zlib - name: Download OpenTelemetry Collector binary run: | mkdir otelcol && cd otelcol diff --git a/CMakeLists.txt b/CMakeLists.txt index e4a1d39..6896b93 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,14 +2,52 @@ cmake_minimum_required(VERSION 3.7.0) cmake_policy(SET CMP0074 NEW) -# Autodetect vcpkg toolchain from VCPKG_ROOT environment variable -if(DEFINED ENV{VCPKG_ROOT} AND NOT DEFINED CMAKE_TOOLCHAIN_FILE) - string(REPLACE "\\" "/" CMAKE_TOOLCHAIN_FILE "$ENV{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake") -endif() -set(CLIENT_PROJECT_NAME otel-matlab) +# ########################### +# vcpkg +# ########################### -project(${CLIENT_PROJECT_NAME} VERSION 0.1.0) +include(FetchContent) + +# check if VCPKG_ROOT is defined, which should point to an existing installation +if(DEFINED ENV{VCPKG_ROOT}) + # Autodetect vcpkg toolchain + if(NOT DEFINED CMAKE_TOOLCHAIN_FILE) + string(REPLACE "\\" "/" CMAKE_TOOLCHAIN_FILE "$ENV{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake") + endif() +else() + # VCPKG_ROOT not defined, get it using FetchContent + + if(DEFINED VCPKG_PREFIX}) + # download location specified + string(REPLACE "\\" "/" VCPKG_PREFIX "${VCPKG_PREFIX}") + else() + set(VCPKG_PREFIX ${CMAKE_BINARY_DIR}/vcpkg) + endif() + + set(VCPKG_FETCH_CONTENT_NAME vcpkg) + set(VCPKG_GIT_REPOSITORY "https://github.com/microsoft/vcpkg.git") + set(VCPKG_GIT_TAG "9edb1b8") + FetchContent_Declare( + ${VCPKG_FETCH_CONTENT_NAME} + GIT_REPOSITORY ${VCPKG_GIT_REPOSITORY} + GIT_TAG ${VCPKG_GIT_TAG} + PREFIX ${VCPKG_PREFIX} + UPDATE_DISCONNECTED 1 + ) + + FetchContent_MakeAvailable( + ${VCPKG_FETCH_CONTENT_NAME} + ) + + FetchContent_GetProperties(${VCPKG_FETCH_CONTENT_NAME}) + string(REPLACE "\\" "/" CMAKE_TOOLCHAIN_FILE "${vcpkg_SOURCE_DIR}/scripts/buildsystems/vcpkg.cmake") + +endif() + +if(NOT DEFINED VCPKG_INSTALLED_DIR) + set(DVCPKG_INSTALLED_DIR ${CMAKE_BINARY_DIR}/vcpkg_installed) +endif() # ###################################### # Options @@ -24,8 +62,25 @@ if(APPLE) option(SKIP_OTEL_CPP_PATCH "Whether to skip patching OpenTelemetry-cpp" OFF) endif() +# set vcpkg features depending on specified options +set(VCPKG_MANIFEST_FEATURES "") # start with empty +if(WITH_OTLP_HTTP) + set(VCPKG_MANIFEST_FEATURES ${VCPKG_MANFIEST_FEATURES} "otlp-http") +endif() +if(WITH_OTLP_GRPC) + set(VCPKG_MANIFEST_FEATURES ${VCPKG_MANIFEST_FEATURES} "otlp-grpc") +endif() + # ###################################### -# libmexclass FetchContent Configuration +# Project Declaration +# ###################################### + +set(CLIENT_PROJECT_NAME otel-matlab) + +project(${CLIENT_PROJECT_NAME} VERSION 0.1.0) + +# ###################################### +# libmexclass # ###################################### set(LIBMEXCLASS_FETCH_CONTENT_NAME libmexclass) @@ -36,7 +91,6 @@ set(LIBMEXCLASS_FETCH_CONTENT_GIT_TAG "77f3d72") set(LIBMEXCLASS_FETCH_CONTENT_SOURCE_SUBDIR "libmexclass/cpp") -include(FetchContent) FetchContent_Declare( ${LIBMEXCLASS_FETCH_CONTENT_NAME} GIT_REPOSITORY ${LIBMEXCLASS_FETCH_CONTENT_GIT_REPOSITORY} @@ -47,44 +101,52 @@ FetchContent_MakeAvailable( ${LIBMEXCLASS_FETCH_CONTENT_NAME} ) + # ########################### # OpenTelemetry-cpp # ########################### -include(ExternalProject) -set(OTEL_CPP_PROJECT_NAME opentelemetry-cpp) -set(OTEL_CPP_GIT_REPOSITORY "https://github.com/open-telemetry/opentelemetry-cpp.git") -set(OTEL_CPP_GIT_TAG "11d5d9e") -if(DEFINED OTEL_CPP_PREFIX) - string(REPLACE "\\" "/" OTEL_CPP_PREFIX ${OTEL_CPP_PREFIX}) +if(DEFINED OTEL_CPP_INSTALLED_DIR) + # OTEL_CPP_INSTALLED_DIR should point to an installed location of OpenTelemetry-cpp + string(REPLACE "\\" "/" OTEL_CPP_PREFIX ${OTEL_CPP_INSTALLED_DIR}) else() - set(OTEL_CPP_PREFIX ${CMAKE_BINARY_DIR}/otel-cpp) + # No installed location supplied. Fetch it as an external project + include(ExternalProject) + set(OTEL_CPP_PROJECT_NAME opentelemetry-cpp) + set(OTEL_CPP_GIT_REPOSITORY "https://github.com/open-telemetry/opentelemetry-cpp.git") + set(OTEL_CPP_GIT_TAG "11d5d9e") + + if(DEFINED OTEL_CPP_PREFIX) + string(REPLACE "\\" "/" OTEL_CPP_PREFIX ${OTEL_CPP_PREFIX}) + else() + set(OTEL_CPP_PREFIX ${CMAKE_BINARY_DIR}/otel-cpp) + endif() + + if(WITH_OTLP_GRPC) + set(OTEL_CPP_CXX_STANDARD 14) # Abseil requires at least Cxx14 + else() + set(OTEL_CPP_CXX_STANDARD 11) + endif() + + if(NOT APPLE OR SKIP_OTEL_CPP_PATCH) + set(patch_command "") + else() + set(patch_command git apply ${CMAKE_SOURCE_DIR}/otel-cpp.patch) + endif() + + ExternalProject_Add( + ${OTEL_CPP_PROJECT_NAME} + GIT_REPOSITORY ${OTEL_CPP_GIT_REPOSITORY} + GIT_TAG ${OTEL_CPP_GIT_TAG} + PREFIX ${OTEL_CPP_PREFIX} + UPDATE_DISCONNECTED 1 + PATCH_COMMAND ${patch_command} + CMAKE_ARGS -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DWITH_OTLP_HTTP=${WITH_OTLP_HTTP} -DWITH_OTLP_GRPC=${WITH_OTLP_GRPC} -DBUILD_TESTING=OFF -DWITH_BENCHMARK=OFF -DOPENTELEMETRY_INSTALL=ON -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} -DCMAKE_CXX_STANDARD=${OTEL_CPP_CXX_STANDARD} -DVCPKG_INSTALLED_DIR=${VCPKG_INSTALLED_DIR} + INSTALL_DIR ${OTEL_CPP_PREFIX} + INSTALL_COMMAND ${CMAKE_COMMAND} --install . --prefix ${OTEL_CPP_PREFIX} + ) endif() -if(WITH_OTLP_GRPC) - set(OTEL_CPP_CXX_STANDARD 14) # Abseil requires at least Cxx14 -else() - set(OTEL_CPP_CXX_STANDARD 11) -endif() - -if(NOT APPLE OR SKIP_OTEL_CPP_PATCH) - set(patch_command "") -else() - set(patch_command git apply ${CMAKE_SOURCE_DIR}/otel-cpp.patch) -endif() - -ExternalProject_Add( - ${OTEL_CPP_PROJECT_NAME} - GIT_REPOSITORY ${OTEL_CPP_GIT_REPOSITORY} - GIT_TAG ${OTEL_CPP_GIT_TAG} - PREFIX ${OTEL_CPP_PREFIX} - UPDATE_DISCONNECTED 1 - PATCH_COMMAND ${patch_command} - CMAKE_ARGS -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DWITH_OTLP_HTTP=${WITH_OTLP_HTTP} -DWITH_OTLP_GRPC=${WITH_OTLP_GRPC} -DBUILD_TESTING=OFF -DWITH_BENCHMARK=OFF -DOPENTELEMETRY_INSTALL=ON -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} -DCMAKE_CXX_STANDARD=${OTEL_CPP_CXX_STANDARD} - INSTALL_DIR ${OTEL_CPP_PREFIX} - INSTALL_COMMAND ${CMAKE_COMMAND} --install . --prefix ${OTEL_CPP_PREFIX} -) - # ########################### # OpenTelemetry Proxy Library # ########################### diff --git a/README.md b/README.md index 63426f0..c61d746 100644 --- a/README.md +++ b/README.md @@ -21,22 +21,14 @@ Installation instructions Before proceeding, ensure that the below products are installed: * [MATLAB](https://www.mathworks.com/products/matlab.html) -1. Download [vcpkg](https://vcpkg.io). Install the following packages: -- curl -- nlohmann-json -- protobuf -- zlib - -2. Set VCPKG_ROOT environment variable to point to installed location of vcpkg. - -3. Download, Build and install OpenTelemetry MATLAB +1. Download, Build and install OpenTelemetry MATLAB ``` cd cmake -S . -B build -DCMAKE_INSTALL_PREFIX= cmake --build build --config Release --target install ``` -4. Download [OpenTelemetry Collector](https://github.com/open-telemetry/opentelemetry-collector-releases/releases). You can just obtain a pre-built binary for your platform. +2. Download [OpenTelemetry Collector](https://github.com/open-telemetry/opentelemetry-collector-releases/releases). You can just obtain a pre-built binary for your platform. ## Getting Started 1. Start OpenTelemetry Collector diff --git a/vcpkg.json b/vcpkg.json new file mode 100644 index 0000000..f7b0ee6 --- /dev/null +++ b/vcpkg.json @@ -0,0 +1,12 @@ +{ + "name": "opentelemetry-matlab", + "$schema": "https://raw.githubusercontent.com/microsoft/vcpkg-tool/main/docs/vcpkg.schema.json", + "dependencies": [ + "protobuf", + "zlib" + ], + "features": { + "otlp-http": {"description": "Otlp HTTP Exporter", "dependencies": ["curl", "nlohmann-json"]}, + "otlp-grpc": {"description": "Otlp gRPC Exporter", "dependencies": ["grpc", "abseil", "c-ares", "re2", "openssl", "upb"]} + } +} From 2516f6d3f14950f5b6232830099fe101e17ebd93 Mon Sep 17 00:00:00 2001 From: Duncan Po Date: Tue, 12 Sep 2023 16:44:37 -0400 Subject: [PATCH 2/4] add custom triplet to vcpkg on Mac --- CMakeLists.txt | 10 ++++++++++ vcpkg.json | 5 +++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6896b93..53307e7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,6 +25,16 @@ else() set(VCPKG_PREFIX ${CMAKE_BINARY_DIR}/vcpkg) endif() + # On Mac, there is a conflict between libcurl and the version in MATLAB, so + # use libcurl as a shared library and load the MATLAB version at runtime + if(APPLE) + # run uname -m to determine whether arm64 or x86_64 + exec_program(uname ARGS -m OUTPUT_VARIABLE MAC_HOST_SYSTEM) + set(VCPKG_OTEL_TRIPLET ${MAC_HOST_SYSTEM}-osx-otel-matlab) + set(VCPKG_OVERLAY_TRIPLETS ${CMAKE_SOURCE_DIR}/cmake/vcpkg_triplets) + set(VCPKG_TARGET_TRIPLET ${VCPKG_OTEL_TRIPLET}) + endif() + set(VCPKG_FETCH_CONTENT_NAME vcpkg) set(VCPKG_GIT_REPOSITORY "https://github.com/microsoft/vcpkg.git") set(VCPKG_GIT_TAG "9edb1b8") diff --git a/vcpkg.json b/vcpkg.json index f7b0ee6..6717cef 100644 --- a/vcpkg.json +++ b/vcpkg.json @@ -3,10 +3,11 @@ "$schema": "https://raw.githubusercontent.com/microsoft/vcpkg-tool/main/docs/vcpkg.schema.json", "dependencies": [ "protobuf", - "zlib" + "zlib", + "nlohmann-json" ], "features": { - "otlp-http": {"description": "Otlp HTTP Exporter", "dependencies": ["curl", "nlohmann-json"]}, + "otlp-http": {"description": "Otlp HTTP Exporter", "dependencies": ["curl"]}, "otlp-grpc": {"description": "Otlp gRPC Exporter", "dependencies": ["grpc", "abseil", "c-ares", "re2", "openssl", "upb"]} } } From d665f75fb40b5b40ae4031f7ce59f3644d108265 Mon Sep 17 00:00:00 2001 From: duncanpo Date: Tue, 12 Sep 2023 16:47:05 -0400 Subject: [PATCH 3/4] add custom triplets to vcpkg on Mac --- cmake/vcpkg_triplets/arm64-osx-otel-matlab.cmake | 10 ++++++++++ cmake/vcpkg_triplets/x86_64-osx-otel-matlab.cmake | 10 ++++++++++ 2 files changed, 20 insertions(+) create mode 100644 cmake/vcpkg_triplets/arm64-osx-otel-matlab.cmake create mode 100644 cmake/vcpkg_triplets/x86_64-osx-otel-matlab.cmake diff --git a/cmake/vcpkg_triplets/arm64-osx-otel-matlab.cmake b/cmake/vcpkg_triplets/arm64-osx-otel-matlab.cmake new file mode 100644 index 0000000..4e8c1d0 --- /dev/null +++ b/cmake/vcpkg_triplets/arm64-osx-otel-matlab.cmake @@ -0,0 +1,10 @@ +set(VCPKG_TARGET_ARCHITECTURE arm64) +set(VCPKG_CRT_LINKAGE dynamic) +if(${PORT} MATCHES "(curl|zlib)") + set(VCPKG_LIBRARY_LINKAGE dynamic) +else() + set(VCPKG_LIBRARY_LINKAGE static) +endif() + +set(VCPKG_CMAKE_SYSTEM_NAME Darwin) +set(VCPKG_OSX_ARCHITECTURES arm64) diff --git a/cmake/vcpkg_triplets/x86_64-osx-otel-matlab.cmake b/cmake/vcpkg_triplets/x86_64-osx-otel-matlab.cmake new file mode 100644 index 0000000..e33a495 --- /dev/null +++ b/cmake/vcpkg_triplets/x86_64-osx-otel-matlab.cmake @@ -0,0 +1,10 @@ +set(VCPKG_TARGET_ARCHITECTURE x64) +set(VCPKG_CRT_LINKAGE dynamic) +if(${PORT} MATCHES "(curl|zlib)") + set(VCPKG_LIBRARY_LINKAGE dynamic) +else() + set(VCPKG_LIBRARY_LINKAGE static) +endif() + +set(VCPKG_CMAKE_SYSTEM_NAME Darwin) +set(VCPKG_OSX_ARCHITECTURES x86_64) From f54327ca0a5601a70b3756bd4312de85d1a6ec96 Mon Sep 17 00:00:00 2001 From: duncanpo Date: Wed, 13 Sep 2023 10:56:42 -0400 Subject: [PATCH 4/4] automatically get windows_kill on Windows --- test/commonSetupOnce.m | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/test/commonSetupOnce.m b/test/commonSetupOnce.m index 1885696..f70a2a5 100644 --- a/test/commonSetupOnce.m +++ b/test/commonSetupOnce.m @@ -20,9 +20,20 @@ function commonSetupOnce(testCase) testCase.ListPid = @(name)"tasklist /fi ""IMAGENAME eq " + name + ".exe"""; testCase.ReadPidList = @(file)readtable(file, "VariableNamingRule", "preserve", "NumHeaderLines", 3, "MultipleDelimsAsOne", true, "Delimiter", " "); testCase.ExtractPid = @(table)table.Var2; - windows_killroot = string(getenv("WINDOWS_KILL_INSTALL")); - assert(~isempty(windows_killroot), "WINDOWS_KILL_INSTALL environment must be defined.") - testCase.Sigint = @(id)fullfile(windows_killroot,"windows-kill") + " -SIGINT " + id; + windows_killroot = getenv("WINDOWS_KILL_INSTALL"); + windows_killname = "windows-kill"; + if isempty(windows_killroot) + % windows_kill not pre-installed + windows_kill_url = "https://github.com/ElyDotDev/windows-kill/releases/download/1.1.4"; + windows_kill_zipfilename = "windows-kill_x64_1.1.4_lib_release"; + windows_killroot = fullfile(tempdir, windows_kill_zipfilename); + + % look for it in tempdir, download and install if it doesn't exist + if ~exist(fullfile(windows_killroot, windows_killname + ".exe"),"file") + unzip(fullfile(windows_kill_url, windows_kill_zipfilename + ".zip"), tempdir); + end + end + testCase.Sigint = @(id)fullfile(windows_killroot,windows_killname) + " -SIGINT " + id; testCase.Sigterm = @(id)"taskkill /F /pid " + id; elseif isunix && ~ismac testCase.ListPid = @(name)"ps -C " + name;