Skip to content

Commit f6bb7b3

Browse files
authored
feat(add): support FetchContent for cmake (#22)
* add package target * add release workflows * refactor CMakeLists; enhance usability * add alias for library name
1 parent b8124e9 commit f6bb7b3

File tree

10 files changed

+176
-59
lines changed

10 files changed

+176
-59
lines changed

Diff for: .github/workflows/release.yml

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
name: Release
2+
3+
on:
4+
release:
5+
types: [published]
6+
7+
jobs:
8+
release:
9+
runs-on: ubuntu-latest
10+
steps:
11+
- uses: actions/checkout@v4
12+
13+
- name: Create build environment
14+
run: cmake -B build-release
15+
- name: Package source code
16+
working-directory: build-release/
17+
run: cmake --build . --target package
18+
- name: Add packaged source code to release
19+
uses: svenstaro/upload-release-action@v2
20+
with:
21+
repo_token: ${{ secrets.GITHUB_TOKEN }}
22+
file: build-release/numbers-src.zip
23+
tag: ${{ github.ref }}

Diff for: CMakeLists.txt

+41-20
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,28 @@
11
cmake_minimum_required(VERSION 3.10)
22

3-
set(BUILD_SHARED_LIBS OFF)
4-
set(CMAKE_CXX_STANDARD 17)
5-
set(CMAKE_CXX_STANDARD_REQUIRED ON)
3+
set(version 0.0.3)
64

7-
string(COMPARE EQUAL ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_SOURCE_DIR} PROJECT_IS_TOP_LEVEL)
5+
project(numbers VERSION ${version} LANGUAGES CXX)
86

9-
if (PROJECT_IS_TOP_LEVEL)
10-
message(STATUS "Project is top level")
11-
endif()
7+
set(BUILD_SHARED_LIBS OFF)
128

13-
option(NUMBERS_TEST "Build and perform numbers tests" ${PROJECT_IS_TOP_LEVEL})
9+
string(COMPARE EQUAL ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_SOURCE_DIR} PROJECT_IS_IN_ROOT)
1410

15-
set(version 0.0.2)
11+
set(CMAKE_EXPORT_COMPILE_COMMANDS ${PROJECT_IS_IN_ROOT})
1612

17-
project(numbers VERSION ${version} LANGUAGES CXX)
13+
if(PROJECT_IS_IN_ROOT)
14+
set(CMAKE_CXX_STANDARD 17)
15+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
16+
message(STATUS "Project ${PROJECT_NAME} is in root")
17+
endif()
18+
19+
# Check if the compiler supports C++17
20+
if(NOT CMAKE_CXX_STANDARD OR CMAKE_CXX_STANDARD LESS 17)
21+
message(FATAL_ERROR "Error: ${PROJECT_NAME} is a library for C++17 and later versions.")
22+
endif()
1823

19-
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
24+
option(NUMBERS_TEST "Build and perform ${PROJECT_NAME} tests" ${PROJECT_IS_IN_ROOT})
25+
option(NUMBERS_EXAMPLE "Build and perform ${PROJECT_NAME} examples" ${PROJECT_IS_IN_ROOT})
2026

2127
# Includes.
2228
set(SRC_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/src/include)
@@ -25,14 +31,29 @@ include_directories(${SRC_INCLUDE_DIR})
2531

2632
add_subdirectory(src)
2733

28-
if (NUMBERS_TEST)
29-
message(STATUS "Building and running tests")
30-
set(THIRD_PARTY_INCLUDE_DIR
31-
${PROJECT_SOURCE_DIR}/third_party
32-
)
33-
include_directories(${THIRD_PARTY_INCLUDE_DIR})
34+
if(NUMBERS_EXAMPLE)
35+
add_subdirectory(examples)
36+
endif()
3437

35-
add_subdirectory(examples)
36-
add_subdirectory(third_party)
37-
add_subdirectory(tests)
38+
if(NUMBERS_TEST)
39+
message(STATUS "Building and running tests")
40+
set(THIRD_PARTY_INCLUDE_DIR
41+
${PROJECT_SOURCE_DIR}/third_party
42+
)
43+
include_directories(${THIRD_PARTY_INCLUDE_DIR})
44+
45+
add_subdirectory(third_party)
46+
add_subdirectory(tests)
47+
48+
# Provide only the minimum source files needed by downstream users
49+
set(package_files src/ CMakeLists.txt LICENSE.txt)
50+
set(packaged_zip ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-src.zip)
51+
add_custom_command(
52+
OUTPUT ${packaged_zip}
53+
COMMAND ${CMAKE_COMMAND} -E tar c ${packaged_zip} --format=zip -- ${package_files}
54+
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
55+
COMMENT "The source files have been packaged into ${packaged_zip}"
56+
DEPENDS ${package_files}
57+
)
58+
add_custom_target(package DEPENDS ${packaged_zip})
3859
endif()

Diff for: examples/overflowing-sub.cc

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#include <iostream>
2+
#include <tuple>
3+
4+
#include "numbers.h"
5+
6+
void for_error() {
7+
size_t i;
8+
9+
// error - infinite loop
10+
for (i = 10; i >= 0; i--) {
11+
printf("[ID %u] Hello, World\n", i);
12+
}
13+
}
14+
15+
void for_correct() {
16+
using namespace numbers;
17+
18+
u8 i;
19+
bool flag = false;
20+
for (i = 10; !flag && i >= 0; std::tie(i, flag) = i.overflowing_sub(1)) {
21+
printf("[ID %u] Hello, World\n", i);
22+
}
23+
}
24+
25+
int main(int argc, char const *argv[]) {
26+
for_correct();
27+
return 0;
28+
}

Diff for: src/CMakeLists.txt

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
add_subdirectory(numbers)
22

3-
add_library(numbers STATIC ${ALL_OBJECT_FILES})
3+
add_library(${PROJECT_NAME} STATIC ${ALL_OBJECT_FILES})
4+
add_library(${PROJECT_NAME}::${PROJECT_NAME} ALIAS ${PROJECT_NAME})
45

5-
target_include_directories(numbers PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
6-
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEIR}>
6+
target_include_directories(${PROJECT_NAME} PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
7+
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEIR}>
78
)

Diff for: src/include/integer.hh

+25-3
Original file line numberDiff line numberDiff line change
@@ -210,9 +210,11 @@ class Integer {
210210
return Integer(-num_);
211211
}
212212

213-
constexpr bool operator==(const Integer<T> &other) const noexcept { return num_ == other.num_; }
214-
constexpr bool operator<(const Integer<T> &other) const noexcept { return num_ < other.num_; }
215-
constexpr bool operator>(const Integer<T> &other) const noexcept { return num_ > other.num_; }
213+
constexpr bool operator==(Integer<T> other) const noexcept { return num_ == other.num_; }
214+
constexpr bool operator<(Integer<T> other) const noexcept { return num_ < other.num_; }
215+
constexpr bool operator>(Integer<T> other) const noexcept { return num_ > other.num_; }
216+
constexpr bool operator<=(Integer<T> other) const noexcept { return num_ <= other.num_; }
217+
constexpr bool operator>=(Integer<T> other) const noexcept { return num_ >= other.num_; }
216218

217219
Integer &operator+=(Integer other) {
218220
*this = *this + other;
@@ -401,6 +403,26 @@ constexpr bool operator==(U lhs, Integer<T> rhs) noexcept {
401403
return Integer<T>(lhs) == rhs;
402404
}
403405

406+
template <typename U, typename T, typename = std::enable_if_t<std::is_signed_v<U> && std::is_convertible_v<U, T>>>
407+
constexpr bool operator>(U lhs, Integer<T> rhs) noexcept {
408+
return Integer<T>(lhs) > rhs;
409+
}
410+
411+
template <typename U, typename T, typename = std::enable_if_t<std::is_signed_v<U> && std::is_convertible_v<U, T>>>
412+
constexpr bool operator>=(U lhs, Integer<T> rhs) noexcept {
413+
return Integer<T>(lhs) >= rhs;
414+
}
415+
416+
template <typename U, typename T, typename = std::enable_if_t<std::is_signed_v<U> && std::is_convertible_v<U, T>>>
417+
constexpr bool operator<(U lhs, Integer<T> rhs) noexcept {
418+
return Integer<T>(lhs) < rhs;
419+
}
420+
421+
template <typename U, typename T, typename = std::enable_if_t<std::is_signed_v<U> && std::is_convertible_v<U, T>>>
422+
constexpr bool operator<=(U lhs, Integer<T> rhs) noexcept {
423+
return Integer<T>(lhs) <= rhs;
424+
}
425+
404426
using i8 = Integer<int8_t>;
405427
using i16 = Integer<int16_t>;
406428
using i32 = Integer<int32_t>;

Diff for: src/include/uinteger.hh

+22
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,8 @@ class Uinteger {
169169
constexpr bool operator==(Uinteger<T> other) const noexcept { return num_ == other.num_; }
170170
constexpr bool operator<(Uinteger<T> other) const noexcept { return num_ < other.num_; }
171171
constexpr bool operator>(Uinteger<T> other) const noexcept { return num_ > other.num_; }
172+
constexpr bool operator<=(Uinteger<T> other) const noexcept { return num_ <= other.num_; }
173+
constexpr bool operator>=(Uinteger<T> other) const noexcept { return num_ >= other.num_; }
172174

173175
Uinteger &operator+=(Uinteger other) {
174176
*this = *this + other;
@@ -340,6 +342,26 @@ constexpr bool operator==(U lhs, Uinteger<T> rhs) noexcept {
340342
return Uinteger<T>(lhs) == rhs;
341343
}
342344

345+
template <typename U, typename T, typename = std::enable_if_t< std::is_convertible_v<U, T>>>
346+
constexpr bool operator>(U lhs, Uinteger<T> rhs) noexcept {
347+
return Uinteger<T>(lhs) > rhs;
348+
}
349+
350+
template <typename U, typename T, typename = std::enable_if_t<std::is_convertible_v<U, T>>>
351+
constexpr bool operator>=(U lhs, Uinteger<T> rhs) noexcept {
352+
return Uinteger<T>(lhs) >= rhs;
353+
}
354+
355+
template <typename U, typename T, typename = std::enable_if_t<std::is_convertible_v<U, T>>>
356+
constexpr bool operator<(U lhs, Uinteger<T> rhs) noexcept {
357+
return Uinteger<T>(lhs) < rhs;
358+
}
359+
360+
template <typename U, typename T, typename = std::enable_if_t<std::is_convertible_v<U, T>>>
361+
constexpr bool operator<=(U lhs, Uinteger<T> rhs) noexcept {
362+
return Uinteger<T>(lhs) <= rhs;
363+
}
364+
343365
using u8 = Uinteger<uint8_t>;
344366
using u16 = Uinteger<uint16_t>;
345367
using u32 = Uinteger<uint32_t>;

Diff for: src/numbers/CMakeLists.txt

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
file(GLOB obj_files "${CMAKE_CURRENT_SOURCE_DIR}/*.cc")
22

33
add_library(
4-
numbers_obj
5-
OBJECT
6-
${obj_files}
4+
numbers_obj
5+
OBJECT
6+
${obj_files}
77
)
88

99
set(ALL_OBJECT_FILES
10-
${ALL_OBJECT_FILES} $<TARGET_OBJECTS:numbers_obj>
11-
PARENT_SCOPE)
10+
${ALL_OBJECT_FILES} $<TARGET_OBJECTS:numbers_obj>
11+
PARENT_SCOPE)

Diff for: tests/integer/CMakeLists.txt

+11-11
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,25 @@ file(GLOB_RECURSE test_files "${CMAKE_CURRENT_SOURCE_DIR}/*.test.cc")
33
set(PROJECT_NAME integer_test)
44

55
add_executable(
6-
${PROJECT_NAME}
7-
EXCLUDE_FROM_ALL
8-
${test_files}
6+
${PROJECT_NAME}
7+
EXCLUDE_FROM_ALL
8+
${test_files}
99
)
1010

1111
target_link_libraries(${PROJECT_NAME} PRIVATE numbers_obj test_utils gtest gmock_main)
1212

1313
gtest_discover_tests(${PROJECT_NAME}
14-
EXTRA_ARGS
15-
--gtest_output=xml:${CMAKE_BINARY_DIR}/test/${PROJECT_NAME}.xml
16-
--gtest_catch_exceptions=0
17-
DISCOVERY_TIMEOUT 120
18-
PROPERTIES
19-
TIMEOUT 120
14+
EXTRA_ARGS
15+
--gtest_output=xml:${CMAKE_BINARY_DIR}/test/${PROJECT_NAME}.xml
16+
--gtest_catch_exceptions=0
17+
DISCOVERY_TIMEOUT 120
18+
PROPERTIES
19+
TIMEOUT 120
2020
)
2121

2222
set_target_properties(${PROJECT_NAME}
23-
PROPERTIES
24-
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/test"
23+
PROPERTIES
24+
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/test"
2525
)
2626

2727
list(APPEND TEST_TARGETS ${PROJECT_NAME} PARENT_SCOPE)

Diff for: tests/uinteger/CMakeLists.txt

+11-11
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,25 @@ file(GLOB_RECURSE test_files "${CMAKE_CURRENT_SOURCE_DIR}/*.test.cc")
33
set(PROJECT_NAME uinteger_test)
44

55
add_executable(
6-
${PROJECT_NAME}
7-
EXCLUDE_FROM_ALL
8-
${test_files}
6+
${PROJECT_NAME}
7+
EXCLUDE_FROM_ALL
8+
${test_files}
99
)
1010

1111
target_link_libraries(${PROJECT_NAME} PRIVATE numbers_obj test_utils gtest gmock_main)
1212

1313
gtest_discover_tests(${PROJECT_NAME}
14-
EXTRA_ARGS
15-
--gtest_output=xml:${CMAKE_BINARY_DIR}/test/${PROJECT_NAME}.xml
16-
--gtest_catch_exceptions=0
17-
DISCOVERY_TIMEOUT 120
18-
PROPERTIES
19-
TIMEOUT 120
14+
EXTRA_ARGS
15+
--gtest_output=xml:${CMAKE_BINARY_DIR}/test/${PROJECT_NAME}.xml
16+
--gtest_catch_exceptions=0
17+
DISCOVERY_TIMEOUT 120
18+
PROPERTIES
19+
TIMEOUT 120
2020
)
2121

2222
set_target_properties(${PROJECT_NAME}
23-
PROPERTIES
24-
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/test"
23+
PROPERTIES
24+
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/test"
2525
)
2626

2727
list(APPEND TEST_TARGETS ${PROJECT_NAME} PARENT_SCOPE)

Diff for: tests/utils/CMakeLists.txt

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
add_library(
2-
test_utils
3-
EXCLUDE_FROM_ALL
4-
OBJECT
5-
utils.cc
2+
test_utils
3+
EXCLUDE_FROM_ALL
4+
OBJECT
5+
utils.cc
66
)
77

88
set(ALL_OBJECT_FILES
9-
${ALL_OBJECT_FILES} $<TARGET_OBJECTS:test_utils>
10-
PARENT_SCOPE)
9+
${ALL_OBJECT_FILES} $<TARGET_OBJECTS:test_utils>
10+
PARENT_SCOPE)

0 commit comments

Comments
 (0)