From 7bb75068b56b629bd8fdc4e0927dc100558d143a Mon Sep 17 00:00:00 2001 From: Zack Galbreath Date: Thu, 3 Oct 2019 11:04:54 -0400 Subject: [PATCH 1/5] Create pkg-config files from CMake --- CMakeLists.txt | 71 ++++++++++++++++++++++++++++++- cmake/pkg-config-template.pc.in | 12 ++++++ templates/CMakeLists.txt.template | 71 ++++++++++++++++++++++++++++++- 3 files changed, 152 insertions(+), 2 deletions(-) create mode 100644 cmake/pkg-config-template.pc.in diff --git a/CMakeLists.txt b/CMakeLists.txt index 8294a2c2e1f..98c3f5e9105 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,10 +25,11 @@ cmake_minimum_required(VERSION 3.5.1) set(PACKAGE_NAME "grpc") set(PACKAGE_VERSION "1.25.0-dev") +set(gRPC_CORE_VERSION "8.0.0") set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}") set(PACKAGE_TARNAME "${PACKAGE_NAME}-${PACKAGE_VERSION}") set(PACKAGE_BUGREPORT "https://github.com/grpc/grpc/issues/") -project(${PACKAGE_NAME} C CXX) +project(${PACKAGE_NAME} LANGUAGES C CXX) set(gRPC_INSTALL_BINDIR "bin" CACHE STRING "Installation directory for executables") set(gRPC_INSTALL_LIBDIR "lib" CACHE STRING "Installation directory for libraries") @@ -19431,3 +19432,71 @@ endforeach() install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/etc/roots.pem DESTINATION ${gRPC_INSTALL_SHAREDIR}) + +# Function to generate pkg-config files. +function(generate_pkgconfig name description version requires + libs libs_private output_filename) + set(PC_NAME "${name}") + set(PC_DESCRIPTION "${description}") + set(PC_VERSION "${version}") + set(PC_REQUIRES "${requires}") + set(PC_LIB "${libs}") + set(PC_LIBS_PRIVATE "${libs_private}") + set(output_filepath "${grpc_BINARY_DIR}/libs/opt/pkgconfig/${output_filename}") + configure_file( + "${grpc_SOURCE_DIR}/cmake/pkg-config-template.pc.in" + "${output_filepath}" + @ONLY) + install(FILES "${output_filepath}" + DESTINATION "lib/pkgconfig/") +endfunction() + +# gpr .pc file +generate_pkgconfig( + "gpr" + "gRPC platform support library" + "${gRPC_CORE_VERSION}" + "" + "-lgpr" + "" + "gpr.pc") + +# grpc .pc file +generate_pkgconfig( + "gRPC" + "high performance general RPC framework" + "${gRPC_CORE_VERSION}" + "gpr" + "-lgrpc -laddress_sorting -lcares -lz" + "" + "grpc.pc") + +# grpc_unsecure .pc file +generate_pkgconfig( + "gRPC unsecure" + "high performance general RPC framework without SSL" + "${gRPC_CORE_VERSION}" + "gpr" + "-lgrpc_unsecure" + "" + "grpc_unsecure.pc") + +# grpc++ .pc file +generate_pkgconfig( + "gRPC++" + "C++ wrapper for gRPC" + "${PACKAGE_VERSION}" + "grpc" + "-lgrpc++" + "" + "grpc++.pc") + +# grpc++_unsecure .pc file +generate_pkgconfig( + "gRPC++ unsecure" + "C++ wrapper for gRPC without SSL" + "${PACKAGE_VERSION}" + "grpc_unsecure" + "-lgrpc++_unsecure" + "" + "grpc++_unsecure.pc") diff --git a/cmake/pkg-config-template.pc.in b/cmake/pkg-config-template.pc.in new file mode 100644 index 00000000000..d56154bb3a5 --- /dev/null +++ b/cmake/pkg-config-template.pc.in @@ -0,0 +1,12 @@ +prefix=@CMAKE_INSTALL_PREFIX@ +exec_prefix=${prefix} +includedir=${prefix}/include +libdir=${exec_prefix}/lib + +Name: @PC_NAME@ +Description: @PC_DESCRIPTION@ +Version: @PC_VERSION@ +Cflags: -I${includedir} +Requires: @PC_REQUIRES@ +Libs: -L${libdir} @PC_LIB@ +Libs.private: @PC_LIBS_PRIVATE@ diff --git a/templates/CMakeLists.txt.template b/templates/CMakeLists.txt.template index 77769cb93bf..e954d404178 100644 --- a/templates/CMakeLists.txt.template +++ b/templates/CMakeLists.txt.template @@ -73,10 +73,11 @@ set(PACKAGE_NAME "grpc") set(PACKAGE_VERSION "${settings.cpp_version}") + set(gRPC_CORE_VERSION "${settings.core_version}") set(PACKAGE_STRING "<%text>${PACKAGE_NAME} ${PACKAGE_VERSION}") set(PACKAGE_TARNAME "<%text>${PACKAGE_NAME}-${PACKAGE_VERSION}") set(PACKAGE_BUGREPORT "https://github.com/grpc/grpc/issues/") - project(<%text>${PACKAGE_NAME} C CXX) + project(<%text>${PACKAGE_NAME} LANGUAGES C CXX) set(gRPC_INSTALL_BINDIR "bin" CACHE STRING "Installation directory for executables") set(gRPC_INSTALL_LIBDIR "lib" CACHE STRING "Installation directory for libraries") @@ -569,3 +570,71 @@ install(FILES <%text>${CMAKE_CURRENT_SOURCE_DIR}/etc/roots.pem DESTINATION <%text>${gRPC_INSTALL_SHAREDIR}) + + # Function to generate pkg-config files. + function(generate_pkgconfig name description version requires + libs libs_private output_filename) + set(PC_NAME "<%text>${name}") + set(PC_DESCRIPTION "<%text>${description}") + set(PC_VERSION "<%text>${version}") + set(PC_REQUIRES "<%text>${requires}") + set(PC_LIB "<%text>${libs}") + set(PC_LIBS_PRIVATE "<%text>${libs_private}") + set(output_filepath "<%text>${grpc_BINARY_DIR}/libs/opt/pkgconfig/${output_filename}") + configure_file( + "<%text>${grpc_SOURCE_DIR}/cmake/pkg-config-template.pc.in" + "<%text>${output_filepath}" + @ONLY) + install(FILES "<%text>${output_filepath}" + DESTINATION "lib/pkgconfig/") + endfunction() + + # gpr .pc file + generate_pkgconfig( + "gpr" + "gRPC platform support library" + "<%text>${gRPC_CORE_VERSION}" + "" + "-lgpr" + "" + "gpr.pc") + + # grpc .pc file + generate_pkgconfig( + "gRPC" + "high performance general RPC framework" + "<%text>${gRPC_CORE_VERSION}" + "gpr" + "-lgrpc -laddress_sorting -lcares -lz" + "" + "grpc.pc") + + # grpc_unsecure .pc file + generate_pkgconfig( + "gRPC unsecure" + "high performance general RPC framework without SSL" + "<%text>${gRPC_CORE_VERSION}" + "gpr" + "-lgrpc_unsecure" + "" + "grpc_unsecure.pc") + + # grpc++ .pc file + generate_pkgconfig( + "gRPC++" + "C++ wrapper for gRPC" + "<%text>${PACKAGE_VERSION}" + "grpc" + "-lgrpc++" + "" + "grpc++.pc") + + # grpc++_unsecure .pc file + generate_pkgconfig( + "gRPC++ unsecure" + "C++ wrapper for gRPC without SSL" + "<%text>${PACKAGE_VERSION}" + "grpc_unsecure" + "-lgrpc++_unsecure" + "" + "grpc++_unsecure.pc") From d249dc9cf38af7f347d7202e274d2e83227defc5 Mon Sep 17 00:00:00 2001 From: Zack Galbreath Date: Thu, 3 Oct 2019 11:05:06 -0400 Subject: [PATCH 2/5] Update Makefile rules for .pc file creation Change "Requires.private" to "Requires" so pkg-config can better provide gRPC's dependencies. --- Makefile | 16 ++++++++-------- templates/Makefile.template | 16 ++++++++-------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Makefile b/Makefile index 6055df352df..b8250545f64 100644 --- a/Makefile +++ b/Makefile @@ -498,11 +498,11 @@ ifeq ($(HAS_PKG_CONFIG), true) CACHE_MK += HAS_PKG_CONFIG = true, endif -CORE_PC_TEMPLATE = prefix=$(prefix),exec_prefix=\$${prefix},includedir=\$${prefix}/include,libdir=\$${exec_prefix}/lib,,Name: $(PC_NAME),Description: $(PC_DESCRIPTION),Version: $(CORE_VERSION),Cflags: -I\$${includedir} $(PC_CFLAGS),Requires.private: $(PC_REQUIRES_PRIVATE),Libs: -L\$${libdir} $(PC_LIB),Libs.private: $(PC_LIBS_PRIVATE) +CORE_PC_TEMPLATE = prefix=$(prefix),exec_prefix=\$${prefix},includedir=\$${prefix}/include,libdir=\$${exec_prefix}/lib,,Name: $(PC_NAME),Description: $(PC_DESCRIPTION),Version: $(CORE_VERSION),Cflags: -I\$${includedir} $(PC_CFLAGS),Requires: $(PC_REQUIRES),Libs: -L\$${libdir} $(PC_LIB),Libs.private: $(PC_LIBS_PRIVATE) -CPP_PC_TEMPLATE = prefix=$(prefix),exec_prefix=\$${prefix},includedir=\$${prefix}/include,libdir=\$${exec_prefix}/lib,,Name: $(PC_NAME),Description: $(PC_DESCRIPTION),Version: $(CPP_VERSION),Cflags: -I\$${includedir} $(PC_CFLAGS),Requires.private: $(PC_REQUIRES_PRIVATE),Libs: -L\$${libdir} $(PC_LIB),Libs.private: $(PC_LIBS_PRIVATE) +CPP_PC_TEMPLATE = prefix=$(prefix),exec_prefix=\$${prefix},includedir=\$${prefix}/include,libdir=\$${exec_prefix}/lib,,Name: $(PC_NAME),Description: $(PC_DESCRIPTION),Version: $(CPP_VERSION),Cflags: -I\$${includedir} $(PC_CFLAGS),Requires: $(PC_REQUIRES),Libs: -L\$${libdir} $(PC_LIB),Libs.private: $(PC_LIBS_PRIVATE) -CSHARP_PC_TEMPLATE = prefix=$(prefix),exec_prefix=\$${prefix},includedir=\$${prefix}/include,libdir=\$${exec_prefix}/lib,,Name: $(PC_NAME),Description: $(PC_DESCRIPTION),Version: $(CSHARP_VERSION),Cflags: -I\$${includedir} $(PC_CFLAGS),Requires.private: $(PC_REQUIRES_PRIVATE),Libs: -L\$${libdir} $(PC_LIB),Libs.private: $(PC_LIBS_PRIVATE) +CSHARP_PC_TEMPLATE = prefix=$(prefix),exec_prefix=\$${prefix},includedir=\$${prefix}/include,libdir=\$${exec_prefix}/lib,,Name: $(PC_NAME),Description: $(PC_DESCRIPTION),Version: $(CSHARP_VERSION),Cflags: -I\$${includedir} $(PC_CFLAGS),Requires: $(PC_REQUIRES),Libs: -L\$${libdir} $(PC_LIB),Libs.private: $(PC_LIBS_PRIVATE) ifeq ($(SYSTEM),MINGW32) EXECUTABLE_SUFFIX = .exe @@ -795,7 +795,7 @@ endif PC_NAME = gpr PC_DESCRIPTION = gRPC platform support library PC_CFLAGS = -PC_REQUIRES_PRIVATE = $(PC_REQUIRES_GPR) +PC_REQUIRES = $(PC_REQUIRES_GPR) PC_LIBS_PRIVATE = $(PC_LIBS_GPR) PC_LIB = -lgpr GPR_PC_FILE := $(CORE_PC_TEMPLATE) @@ -804,7 +804,7 @@ GPR_PC_FILE := $(CORE_PC_TEMPLATE) PC_NAME = gRPC PC_DESCRIPTION = high performance general RPC framework PC_CFLAGS = -PC_REQUIRES_PRIVATE = gpr $(PC_REQUIRES_GRPC) $(PC_REQUIRES_SECURE) +PC_REQUIRES = gpr $(PC_REQUIRES_GRPC) $(PC_REQUIRES_SECURE) PC_LIBS_PRIVATE = $(PC_LIBS_GRPC) $(PC_LIBS_SECURE) PC_LIB = -lgrpc GRPC_PC_FILE := $(CORE_PC_TEMPLATE) @@ -813,7 +813,7 @@ GRPC_PC_FILE := $(CORE_PC_TEMPLATE) PC_NAME = gRPC unsecure PC_DESCRIPTION = high performance general RPC framework without SSL PC_CFLAGS = -PC_REQUIRES_PRIVATE = gpr $(PC_REQUIRES_GRPC) +PC_REQUIRES = gpr $(PC_REQUIRES_GRPC) PC_LIBS_PRIVATE = $(PC_LIBS_GRPC) PC_LIB = -lgrpc_unsecure GRPC_UNSECURE_PC_FILE := $(CORE_PC_TEMPLATE) @@ -875,7 +875,7 @@ endif PC_NAME = gRPC++ PC_DESCRIPTION = C++ wrapper for gRPC PC_CFLAGS = -PC_REQUIRES_PRIVATE = grpc $(PC_REQUIRES_GRPCXX) +PC_REQUIRES = grpc $(PC_REQUIRES_GRPCXX) PC_LIBS_PRIVATE = $(PC_LIBS_GRPCXX) PC_LIB = -lgrpc++ GRPCXX_PC_FILE := $(CPP_PC_TEMPLATE) @@ -884,7 +884,7 @@ GRPCXX_PC_FILE := $(CPP_PC_TEMPLATE) PC_NAME = gRPC++ unsecure PC_DESCRIPTION = C++ wrapper for gRPC without SSL PC_CFLAGS = -PC_REQUIRES_PRIVATE = grpc_unsecure $(PC_REQUIRES_GRPCXX) +PC_REQUIRES = grpc_unsecure $(PC_REQUIRES_GRPCXX) PC_LIBS_PRIVATE = $(PC_LIBS_GRPCXX) PC_LIB = -lgrpc++_unsecure GRPCXX_UNSECURE_PC_FILE := $(CPP_PC_TEMPLATE) diff --git a/templates/Makefile.template b/templates/Makefile.template index 4d95935eb26..d925305031d 100644 --- a/templates/Makefile.template +++ b/templates/Makefile.template @@ -374,7 +374,7 @@ Description: $(PC_DESCRIPTION),\ Version: $(CORE_VERSION),\ Cflags: -I${'\$${includedir}'} $(PC_CFLAGS),\ - Requires.private: $(PC_REQUIRES_PRIVATE),\ + Requires: $(PC_REQUIRES),\ Libs: -L${'\$${libdir}'} $(PC_LIB),\ Libs.private: $(PC_LIBS_PRIVATE) @@ -387,7 +387,7 @@ Description: $(PC_DESCRIPTION),\ Version: $(CPP_VERSION),\ Cflags: -I${'\$${includedir}'} $(PC_CFLAGS),\ - Requires.private: $(PC_REQUIRES_PRIVATE),\ + Requires: $(PC_REQUIRES),\ Libs: -L${'\$${libdir}'} $(PC_LIB),\ Libs.private: $(PC_LIBS_PRIVATE) @@ -400,7 +400,7 @@ Description: $(PC_DESCRIPTION),\ Version: $(CSHARP_VERSION),\ Cflags: -I${'\$${includedir}'} $(PC_CFLAGS),\ - Requires.private: $(PC_REQUIRES_PRIVATE),\ + Requires: $(PC_REQUIRES),\ Libs: -L${'\$${libdir}'} $(PC_LIB),\ Libs.private: $(PC_LIBS_PRIVATE) @@ -695,7 +695,7 @@ PC_NAME = gpr PC_DESCRIPTION = gRPC platform support library PC_CFLAGS = - PC_REQUIRES_PRIVATE = $(PC_REQUIRES_GPR) + PC_REQUIRES = $(PC_REQUIRES_GPR) PC_LIBS_PRIVATE = $(PC_LIBS_GPR) PC_LIB = -lgpr GPR_PC_FILE := $(CORE_PC_TEMPLATE) @@ -704,7 +704,7 @@ PC_NAME = gRPC PC_DESCRIPTION = high performance general RPC framework PC_CFLAGS = - PC_REQUIRES_PRIVATE = gpr $(PC_REQUIRES_GRPC) $(PC_REQUIRES_SECURE) + PC_REQUIRES = gpr $(PC_REQUIRES_GRPC) $(PC_REQUIRES_SECURE) PC_LIBS_PRIVATE = $(PC_LIBS_GRPC) $(PC_LIBS_SECURE) PC_LIB = -lgrpc GRPC_PC_FILE := $(CORE_PC_TEMPLATE) @@ -713,7 +713,7 @@ PC_NAME = gRPC unsecure PC_DESCRIPTION = high performance general RPC framework without SSL PC_CFLAGS = - PC_REQUIRES_PRIVATE = gpr $(PC_REQUIRES_GRPC) + PC_REQUIRES = gpr $(PC_REQUIRES_GRPC) PC_LIBS_PRIVATE = $(PC_LIBS_GRPC) PC_LIB = -lgrpc_unsecure GRPC_UNSECURE_PC_FILE := $(CORE_PC_TEMPLATE) @@ -781,7 +781,7 @@ PC_NAME = gRPC++ PC_DESCRIPTION = C++ wrapper for gRPC PC_CFLAGS = - PC_REQUIRES_PRIVATE = grpc $(PC_REQUIRES_GRPCXX) + PC_REQUIRES = grpc $(PC_REQUIRES_GRPCXX) PC_LIBS_PRIVATE = $(PC_LIBS_GRPCXX) PC_LIB = -lgrpc++ GRPCXX_PC_FILE := $(CPP_PC_TEMPLATE) @@ -790,7 +790,7 @@ PC_NAME = gRPC++ unsecure PC_DESCRIPTION = C++ wrapper for gRPC without SSL PC_CFLAGS = - PC_REQUIRES_PRIVATE = grpc_unsecure $(PC_REQUIRES_GRPCXX) + PC_REQUIRES = grpc_unsecure $(PC_REQUIRES_GRPCXX) PC_LIBS_PRIVATE = $(PC_LIBS_GRPCXX) PC_LIB = -lgrpc++_unsecure GRPCXX_UNSECURE_PC_FILE := $(CPP_PC_TEMPLATE) From 17f95ab1f56d5ce1b1a47823c26fcdb2a24edac3 Mon Sep 17 00:00:00 2001 From: Zack Galbreath Date: Thu, 3 Oct 2019 11:05:31 -0400 Subject: [PATCH 3/5] Simplify helloworld makefile Use pkg-config to automatically find grpc as a dependency of grpc++. --- examples/cpp/helloworld/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/cpp/helloworld/Makefile b/examples/cpp/helloworld/Makefile index 9af7337fd1b..8030ba2be29 100644 --- a/examples/cpp/helloworld/Makefile +++ b/examples/cpp/helloworld/Makefile @@ -20,12 +20,12 @@ CXX = g++ CPPFLAGS += `pkg-config --cflags protobuf grpc` CXXFLAGS += -std=c++11 ifeq ($(SYSTEM),Darwin) -LDFLAGS += -L/usr/local/lib `pkg-config --libs protobuf grpc++ grpc`\ +LDFLAGS += -L/usr/local/lib `pkg-config --libs protobuf grpc++`\ -pthread\ -lgrpc++_reflection\ -ldl else -LDFLAGS += -L/usr/local/lib `pkg-config --libs protobuf grpc++ grpc`\ +LDFLAGS += -L/usr/local/lib `pkg-config --libs protobuf grpc++`\ -pthread\ -Wl,--no-as-needed -lgrpc++_reflection -Wl,--as-needed\ -ldl From d6f48913a18dd76ba8d4c0c19e158f3c207703b9 Mon Sep 17 00:00:00 2001 From: Zack Galbreath Date: Thu, 3 Oct 2019 11:05:43 -0400 Subject: [PATCH 4/5] Add distrib test for CMake pkg-config --- .../cpp/run_distrib_test_cmake_pkgconfig.sh | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100755 test/distrib/cpp/run_distrib_test_cmake_pkgconfig.sh diff --git a/test/distrib/cpp/run_distrib_test_cmake_pkgconfig.sh b/test/distrib/cpp/run_distrib_test_cmake_pkgconfig.sh new file mode 100755 index 00000000000..cf3b4dc7291 --- /dev/null +++ b/test/distrib/cpp/run_distrib_test_cmake_pkgconfig.sh @@ -0,0 +1,66 @@ +#!/bin/bash +# Copyright 2017 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -ex + +cd "$(dirname "$0")/../../.." + +echo "deb http://archive.debian.org/debian jessie-backports main" | tee /etc/apt/sources.list.d/jessie-backports.list +echo 'Acquire::Check-Valid-Until "false";' > /etc/apt/apt.conf +sed -i '/deb http:\/\/deb.debian.org\/debian jessie-updates main/d' /etc/apt/sources.list +apt-get update +apt-get install -t jessie-backports -y libssl-dev pkg-config + +# Install c-ares +cd third_party/cares/cares +git fetch origin +git checkout cares-1_15_0 +mkdir -p cmake/build +cd cmake/build +cmake -DCMAKE_BUILD_TYPE=Release ../.. +make -j4 install +cd ../../../../.. +rm -rf third_party/cares/cares # wipe out to prevent influencing the grpc build + +# Install zlib +cd third_party/zlib +mkdir -p cmake/build +cd cmake/build +cmake -DCMAKE_BUILD_TYPE=Release ../.. +make -j4 install +cd ../../../.. +rm -rf third_party/zlib # wipe out to prevent influencing the grpc build + +# Install protobuf +cd third_party/protobuf +mkdir -p cmake/build +cd cmake/build +cmake -Dprotobuf_BUILD_TESTS=OFF -DCMAKE_BUILD_TYPE=Release .. +make -j4 install +cd ../../../.. +rm -rf third_party/protobuf # wipe out to prevent influencing the grpc build + +# Install gRPC +mkdir -p cmake/build +cd cmake/build +cmake -DgRPC_INSTALL=ON -DgRPC_BUILD_TESTS=OFF -DgRPC_PROTOBUF_PROVIDER=package -DgRPC_ZLIB_PROVIDER=package -DgRPC_CARES_PROVIDER=package -DgRPC_SSL_PROVIDER=package -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local/grpc ../.. +make -j4 install +cd ../.. + +# Build helloworld example using Makefiles and pkg-config +cd examples/cpp/helloworld +export PKG_CONFIG_PATH=/usr/local/grpc/lib/pkgconfig +export PATH=$PATH:/usr/local/grpc/bin +make From 1303e80b700cd5070d531d536c44a52e1d9a7b62 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Fri, 11 Oct 2019 03:32:31 -0400 Subject: [PATCH 5/5] add cmake_pkgconfig test to distribtest suite --- tools/run_tests/artifacts/distribtest_targets.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/run_tests/artifacts/distribtest_targets.py b/tools/run_tests/artifacts/distribtest_targets.py index dfee23c4f2a..c85a4b71386 100644 --- a/tools/run_tests/artifacts/distribtest_targets.py +++ b/tools/run_tests/artifacts/distribtest_targets.py @@ -301,6 +301,7 @@ def targets(): CppDistribTest('linux', 'x64', 'jessie', 'cmake'), CppDistribTest('linux', 'x64', 'jessie', 'cmake_as_externalproject'), CppDistribTest('linux', 'x64', 'jessie', 'cmake_as_submodule'), + CppDistribTest('linux', 'x64', 'jessie', 'cmake_pkgconfig'), CppDistribTest('windows', 'x86', testcase='cmake'), CppDistribTest('windows', 'x86', testcase='cmake_as_externalproject'), CSharpDistribTest('linux', 'x64', 'jessie'),