summaryrefslogtreecommitdiff
path: root/CMakeLists.txt
blob: 765ce6396c9bef4708662b85a96cfea67c5bdf26 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
cmake_minimum_required(VERSION 3.25)
project(github-mirror VERSION 0.3.1 LANGUAGES C)

set(CMAKE_C_STANDARD 17)
include(CheckCCompilerFlag)

# Custom compiler flags
set(custom_compiler_flags)
set(SANITIZERS "address,undefined")
list(APPEND custom_compiler_flags
        -Wall
        -Wextra
        -Wpedantic
        -Werror
)
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
    list(APPEND custom_compiler_flags
            -fno-omit-frame-pointer
            -fstack-protector-strong
            -fsanitize=${SANITIZERS}
    )
endif ()

# CURL
find_package(CURL REQUIRED)

# CJSON
find_package(cJSON REQUIRED)
set(ENABLE_CJSON_TEST OFF CACHE BOOL "Enable cJSON tests" FORCE)

# CMocka
find_package(cmocka REQUIRED)

# Python
find_package(Python3 REQUIRED COMPONENTS Interpreter)

# GraphQL Queries
file(MAKE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include)
file(GLOB_RECURSE GRAPHQL_FILES "${CMAKE_CURRENT_SOURCE_DIR}/queries/*.graphql")
set(GENERATED_HEADERS "")

foreach (GQL_FILE ${GRAPHQL_FILES})
    get_filename_component(FILENAME ${GQL_FILE} NAME)
    if (NOT FILENAME STREQUAL "schema.graphql")
        get_filename_component(DIR ${GQL_FILE} DIRECTORY)
        get_filename_component(DIR ${DIR} NAME)
        get_filename_component(BASENAME ${GQL_FILE} NAME_WE)
        set(HEADER_FILE "${CMAKE_CURRENT_SOURCE_DIR}/include/queries/${DIR}/${BASENAME}.h")
        add_custom_command(
                OUTPUT ${HEADER_FILE}
                COMMAND ${Python3_EXECUTABLE}
                ${CMAKE_CURRENT_SOURCE_DIR}/hack/graphql_to_header.py
                ${GQL_FILE}
                ${HEADER_FILE}
                ${BASENAME}
                DEPENDS ${GQL_FILE} ${CMAKE_CURRENT_SOURCE_DIR}/hack/graphql_to_header.py
                COMMENT "Generating header ${HEADER_FILE} from ${GQL_FILE}"
        )
        list(APPEND GENERATED_HEADERS ${HEADER_FILE})
    endif ()
endforeach ()

add_custom_target(generate_graphql_headers ALL DEPENDS ${GENERATED_HEADERS})

# Executable
add_executable(github-mirror
        src/main.c
        src/buffer.c
        src/config.c
        src/client.c
        src/git.c
        src/precheck.c
        src/github/client.c
        src/github/types.c
        src/srht/client.c
        src/srht/types.c
        ${GENERATED_HEADERS}
)
target_link_libraries(github-mirror PRIVATE cjson CURL::libcurl)
target_include_directories(github-mirror PRIVATE ${CJSON_INCLUDE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/include)
target_compile_definitions(github-mirror PRIVATE
        GITHUB_MIRROR_VERSION="${PROJECT_VERSION}"
)
add_dependencies(github-mirror generate_graphql_headers)
install(TARGETS github-mirror DESTINATION bin)

# Compile Options
foreach (compiler_flag ${custom_compiler_flags})
    CHECK_C_COMPILER_FLAG(${compiler_flag} "FLAG_SUPPORTED_${current_variable}")
    if (FLAG_SUPPORTED_${current_variable})
        message(STATUS "Compiler flag ${compiler_flag} is supported")
        target_compile_options(github-mirror PRIVATE ${compiler_flag})
    else ()
        message(WARNING "Compiler flag ${compiler_flag} is not supported")
    endif ()
endforeach ()

# Debug and Sanitizers is not empty
if (CMAKE_BUILD_TYPE STREQUAL "Debug" AND SANITIZERS)
    target_link_options(github-mirror PRIVATE "-fsanitize=${SANITIZERS}")
endif ()

# Manpages
file(GLOB MANPAGES "${CMAKE_CURRENT_SOURCE_DIR}/man/*.1")
install(FILES ${MANPAGES} DESTINATION share/man/man1)
file(GLOB MANPAGES "${CMAKE_CURRENT_SOURCE_DIR}/man/*.5")
install(FILES ${MANPAGES} DESTINATION share/man/man5)

# Testing
enable_testing()

add_executable(test_buffer tests/test_buffer.c src/buffer.c)
if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
    target_link_libraries(test_buffer PRIVATE cmocka::cmocka)
else ()
    target_link_libraries(test_buffer PRIVATE ${CMOCKA_LIBRARIES})
endif ()
target_compile_definitions(test_buffer PRIVATE
        TEST_ALLOC
        GITHUB_MIRROR_VERSION="${PROJECT_VERSION}"
)

add_executable(test_config tests/test_config.c src/config.c)
if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
    target_link_libraries(test_config PRIVATE cmocka::cmocka)
else ()
    target_link_libraries(test_config PRIVATE ${CMOCKA_LIBRARIES})
endif ()
target_compile_definitions(test_config PRIVATE
        TEST_ALLOC
        GITHUB_MIRROR_VERSION="${PROJECT_VERSION}"
)

add_test(NAME test_buffer COMMAND test_buffer)
add_test(NAME test_config COMMAND test_config)

# Packaging
include(InstallRequiredSystemLibraries)

set(CPACK_PACKAGE_NAME "github-mirror")
set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
set(CPACK_PACKAGE_CONTACT "ansg191@anshulg.com")
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Anshul Gupta")
set(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6 (>= 2.28), libcurl4 (>= 7.64), libcjson1 (>= 1.7.18)")

set(CPACK_GENERATOR "DEB")
include(CPack)