在CMake的世界里:
vcpkg
vcpkg是一个用于Windows、Linux和macOS的C++库管理器。它可以与CMake无缝集成 - 有关详细信息,请参见此处。
Conan
Conan是一个C/C++包管理器。它还具有与CMake集成的策略。
CMake with ExternalProject_Add
CMakeList.txt.in:
cmake_minimum_required(VERSION 2.8.2)
project(googletest-download NONE)
include(ExternalProject)
ExternalProject_Add(googletest
GIT_REPOSITORY https://github.com/google/googletest.git
GIT_TAG master
SOURCE_DIR "${CMAKE_BINARY_DIR}/googletest-src"
BINARY_DIR "${CMAKE_BINARY_DIR}/googletest-build"
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND ""
TEST_COMMAND ""
)
CMakeList.txt:
cmake_minimum_required(VERSION 3.8)
configure_file(CMakeLists.txt.in googletest-download/CMakeLists.txt)
execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" .
RESULT_VARIABLE result
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/googletest-download )
if(result)
message(FATAL_ERROR "CMake step for googletest failed: ${result}")
endif()
execute_process(COMMAND ${CMAKE_COMMAND} --build .
RESULT_VARIABLE result
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/googletest-download )
if(result)
message(FATAL_ERROR "Build step for googletest failed: ${result}")
endif()
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
add_subdirectory(${CMAKE_BINARY_DIR}/googletest-src
${CMAKE_BINARY_DIR}/googletest-build)
if (CMAKE_VERSION VERSION_LESS 2.8.11)
include_directories("${gtest_SOURCE_DIR}/include")
endif()
add_executable(example example.cpp)
target_link_libraries(example gtest_main)
add_test(NAME example_test COMMAND example)
example.cpp
#include <iostream>
#include "gtest/gtest.h"
TEST(sample_test_case, sample_test)
{
EXPECT_EQ(1, 1);
}
在CMake的范围之外:
我建议你不要使用CMake!使用Bazel!
例如,如果你想使用gtest:
工作区
workspace(name = "GTestDemo")
load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository")
git_repository(
name = "googletest",
commit = "2fe3bd994b3189899d93f1d5a881e725e046fdc2",
remote = "https://github.com/google/googletest",
shallow_since = "1535728917 -0400",
)
构建
cc_test(
name = "tests",
srcs = ["test.cpp"],
copts = ["-isystem external/gtest/include"],
deps = [
"@googletest//:gtest_main",
],
)
text.cpp
#include <iostream>
#include "gtest/gtest.h"
TEST(sample_test_case, sample_test)
{
EXPECT_EQ(1, 1);
}
如何运行测试?
bazel test //...
例如,如果您想使用
boost:
工作区
workspace(name = "BoostFilesystemDemo")
load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository")
# Fetch Boost repo
git_repository(
name = "com_github_nelhage_rules_boost",
commit = "49066b7ccafce2609a3d605e3667af3f07e8547c",
remote = "https://github.com/Vertexwahn/rules_boost",
shallow_since = "1559083909 +0200",
)
load("@com_github_nelhage_rules_boost//:boost/boost.bzl", "boost_deps")
boost_deps()
建立
cc_binary(
name = "FilesystemTest",
srcs = ["main.cpp"],
defines = ["BOOST_ALL_NO_LIB"],
deps = [
"@boost//:filesystem",
],
)
main.cpp
#include <iostream>
#include <boost/filesystem.hpp>
using namespace boost::filesystem;
int main(int argc, char* argv[])
{
if (argc < 2)
{
std::cout << "Usage: tut1 path\n";
return 1;
}
std::cout << argv[1] << " " << file_size(argv[1]) << '\n';
return 0;
}
如何构建:
bazel build //...
如何运行:
bazel run //:FilesystemTest
如果您想生成一个Visual Studio解决方案,请使用
lavender。不幸的是,lavender只是实验性的,并且需要一些改进。但我认为,在这里花费努力比让CMake与所有依赖项配合工作更有意义。还有
一些项目试图实现Bazel CMake互操作性。