Просмотр исходного кода

:tada: create cpp20 project based on cmake & conan

Jeremy Zheng 3 лет назад
Родитель
Сommit
58300fb65d

+ 7 - 0
cpp/.clang-format

@@ -0,0 +1,7 @@
+---
+BasedOnStyle: Google
+IncludeBlocks: Preserve
+SortIncludes: 'true'
+TabWidth: 2
+MaxEmptyLinesToKeep: 1
+...

+ 4 - 0
cpp/.gitignore

@@ -0,0 +1,4 @@
+/build/
+/include/mint/version.hpp
+/config.ini
+/tmp/

+ 32 - 0
cpp/CMakeLists.txt

@@ -0,0 +1,32 @@
+cmake_minimum_required(VERSION 3.21)
+include(ExternalProject)
+include(FetchContent)
+
+project(
+    mint
+    VERSION 0.1.0
+    DESCRIPTION "International Academy Of Pali Tipitaka"
+    LANGUAGES C CXX)
+# --------------------------------------------------------
+# FIXME https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100900
+set(CMAKE_CXX_STANDARD 20)
+set(CMAKE_CXX_STANDARD_REQUIRED ON)
+set(CMAKE_CXX_EXTENSIONS OFF)
+
+include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
+conan_basic_setup()
+
+# --------------------------------------------------------
+execute_process(COMMAND git describe --tags --always --dirty
+    OUTPUT_VARIABLE GIT_REV
+    ERROR_QUIET
+)
+string(STRIP "${GIT_REV}" GIT_REV)
+string(TIMESTAMP BUILD_TIME UTC)
+configure_file(include/mint/version.h.in ${PROJECT_SOURCE_DIR}/include/mint/version.hpp)
+# --------------------------------------------------------
+
+add_subdirectory(loquat)
+add_subdirectory(src)
+add_subdirectory(apps)
+add_subdirectory(tests)

+ 7 - 0
cpp/README.md

@@ -0,0 +1,7 @@
+# CPP20 开发环境
+
+```bash
+./scripts/build.sh # 创建 for amd64/arm64/armhf的编译环境
+cd build/amd64-Debug
+make -j # 编译
+```

+ 10 - 0
cpp/apps/CMakeLists.txt

@@ -0,0 +1,10 @@
+file(GLOB TEST_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
+
+foreach(sfn ${TEST_SOURCES})
+    file(RELATIVE_PATH itn ${CMAKE_CURRENT_SOURCE_DIR} ${sfn})
+    string(REPLACE ".cpp" "" it ${itn})
+    add_executable(${it} ${itn})    
+    target_link_libraries(${it} PRIVATE mint)
+    set_target_properties(${it} PROPERTIES LINK_FLAGS_RELEASE -s)
+endforeach(sfn ${TEST_SOURCES})
+

+ 6 - 0
cpp/apps/fig.cpp

@@ -0,0 +1,6 @@
+
+#include "mint/fig.hpp"
+
+#include <cstdlib>
+
+int main(int argc, char** argv) { return EXIT_SUCCESS; }

+ 5 - 0
cpp/include/mint/fig.hpp

@@ -0,0 +1,5 @@
+#pragma once
+
+namespace mint {
+namespace fig {}
+}  // namespace mint

+ 5 - 0
cpp/include/mint/utils.hpp

@@ -0,0 +1,5 @@
+#pragma once
+
+namespace mint {
+namespace utils {}
+}  // namespace mint

+ 13 - 0
cpp/include/mint/version.h.in

@@ -0,0 +1,13 @@
+#pragma once
+
+// clang-format off
+#define MINT_PROJECT_NAME "@CMAKE_PROJECT_NAME@"
+#define MINT_VERSION_MAJOR @mint_VERSION_MAJOR@
+#define MINT_VERSION_MINOR @mint_VERSION_MINOR@
+#define MINT_VERSION_PATCH @mint_VERSION_PATCH@
+#define MINT_VERSION "v@mint_VERSION_MAJOR@.@mint_VERSION_MINOR@.@mint_VERSION_PATCH@"
+#define MINT_PROJECT_DESCRIPTION "@CMAKE_PROJECT_DESCRIPTION@"
+
+#define MINT_GIT_VERSION "@GIT_REV@"
+#define MINT_BUILD_TIME "@BUILD_TIME@"
+// clang-format on

+ 19 - 0
cpp/protocols/CMakeLists.txt

@@ -0,0 +1,19 @@
+file(GLOB HEADER_LIST CONFIGURE_DEPENDS "${PROJECT_SOURCE_DIR}/loquat/cpp/*.h")
+file(GLOB SOURCE_LIST CONFIGURE_DEPENDS "${PROJECT_SOURCE_DIR}/loquat/cpp/*.cc")
+
+add_library(loquat STATIC ${SOURCE_LIST})
+
+target_include_directories(loquat PUBLIC
+  ${mint_SOURCE_DIR}/loquat/cpp/
+)
+
+target_link_libraries(loquat PUBLIC
+  dl crypt m
+  ${CONAN_LIBS}
+)
+
+source_group(
+  TREE "${PROJECT_SOURCE_DIR}/loquat/cpp"
+  PREFIX "Header Files"
+  FILES ${HEADER_LIST}
+)

+ 25 - 0
cpp/scripts/build.sh

@@ -0,0 +1,25 @@
+#!/bin/bash
+
+set -e
+
+export WORKSPACE=$PWD
+
+build_backend() {
+    echo "build $1@$2..."
+    mkdir -pv $WORKSPACE/build/$1-$2
+    cd $WORKSPACE/build/$1-$2
+    conan install --build=missing --profile:build=default \
+        --profile:host=/opt/conan/profiles/$1 /opt/conan
+    cmake $WORKSPACE -DCMAKE_BUILD_TYPE=$2 \
+        -DCMAKE_TOOLCHAIN_FILE=/opt/conan/toolchains/$1.cmake
+    make -j
+}
+
+build_backend amd64 Debug
+build_backend amd64 Release
+build_backend arm64 Release
+build_backend armhf Release
+
+echo 'done.'
+
+exit 0

+ 13 - 0
cpp/src/CMakeLists.txt

@@ -0,0 +1,13 @@
+file(GLOB HEADER_LIST CONFIGURE_DEPENDS "${PROJECT_SOURCE_DIR}/include/mint/*.hpp")
+file(GLOB SOURCE_LIST CONFIGURE_DEPENDS "${PROJECT_SOURCE_DIR}/src/*.cpp")
+
+add_library(mint STATIC ${SOURCE_LIST})
+
+target_link_libraries(mint PUBLIC loquat)
+
+source_group(
+  TREE "${PROJECT_SOURCE_DIR}/include"
+  PREFIX "Header Files"
+  FILES ${HEADER_LIST}
+)
+

+ 1 - 0
cpp/src/fig.cpp

@@ -0,0 +1 @@
+#include "mint/fig.hpp"

+ 1 - 0
cpp/src/utils.cpp

@@ -0,0 +1 @@
+#include "mint/utils.hpp"

+ 13 - 0
cpp/tests/CMakeLists.txt

@@ -0,0 +1,13 @@
+file(GLOB TEST_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
+
+enable_testing()
+
+foreach(sfn ${TEST_SOURCES})
+    file(RELATIVE_PATH itn ${CMAKE_CURRENT_SOURCE_DIR} ${sfn})
+    string(REPLACE ".cpp" "-test" it ${itn})
+    add_executable(${it} ${itn})
+
+    target_link_libraries(${it} PRIVATE palm)
+    set_target_properties(${it} PROPERTIES LINK_FLAGS_RELEASE -s)
+endforeach(sfn ${TEST_SOURCES})
+

+ 6 - 0
cpp/tests/utils.cpp

@@ -0,0 +1,6 @@
+#define BOOST_TEST_MODULE json
+#include <boost/test/unit_test.hpp>
+
+#include "mint/utils.hpp"
+
+BOOST_AUTO_TEST_CASE(base64) { BOOST_TEST(2 == (1 + 1)); }