-
Notifications
You must be signed in to change notification settings - Fork 1
/
CMakeLists.txt
160 lines (132 loc) · 7.08 KB
/
CMakeLists.txt
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
148
149
150
151
152
153
154
155
156
157
158
159
160
cmake_minimum_required(VERSION 3.4.3)
project(AnyRtttl)
# Set the output folder where your program will be created
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin)
set( LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin)
##############################################################################################################################################
# Functions
##############################################################################################################################################
function(GIT_EXTERNAL DIR REPO_URL TAG)
# Find the name of the repository
get_filename_component(REPO_NAME ${REPO_URL} NAME_WE)
# Compute output directory
set(REPO_DIR "${DIR}/${REPO_NAME}")
if (EXISTS "${REPO_DIR}")
message(STATUS "Repository ${REPO_NAME} already exists in directory ${DIR}. Skipping git clone command.")
return()
endif()
# Clone the repository
message(STATUS "git clone ${REPO_URL} ${REPO_DIR}")
execute_process(
COMMAND "${GIT_EXECUTABLE}" clone ${REPO_URL} ${REPO_DIR}
RESULT_VARIABLE returncode ERROR_VARIABLE error
WORKING_DIRECTORY "${DIR}")
if(returncode)
message(FATAL_ERROR "Clone failed: ${error}\n")
endif()
message(STATUS "git clone completed")
# Checking out the required tag
message(STATUS "git checkout ${TAG}")
execute_process(
COMMAND "${GIT_EXECUTABLE}" checkout ${TAG}
RESULT_VARIABLE returncode ERROR_VARIABLE error
WORKING_DIRECTORY "${REPO_DIR}")
if(returncode)
message(FATAL_ERROR "Checkout failed: ${error}\n")
endif()
message(STATUS "git checkout completed")
# Delete the .git folder to simulate an export of the repository
message(STATUS "Deleting ${REPO_DIR}/.git")
file(REMOVE_RECURSE "${REPO_DIR}/.git")
endfunction()
function(add_example name)
# Create custom example.cpp file which includes the ino sketch file.
SET(SOURCE_INO_FILE "${PROJECT_SOURCE_DIR}/examples/${name}/${name}.ino")
CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/examples.cpp.in" "${PROJECT_BINARY_DIR}/${name}/examples.cpp")
add_executable(${name}
${ARDUINO_LIBRARY_SOURCE_FILES}
${SOURCE_INO_FILE}
"${PROJECT_BINARY_DIR}/${name}/examples.cpp"
)
target_include_directories(${name} PRIVATE ${PROJECT_SOURCE_DIR}/src ${BITREADER_SOURCE_DIR} win32arduino )
target_link_libraries(${name} PRIVATE win32arduino rapidassist)
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
set_target_properties(${name} PROPERTIES FOLDER "examples")
if(WIN32)
# 1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\include\ostream(743,1): warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc
# 1>D:\dev\AnyRtttl\master\third_parties\win32Arduino\install\include\win32arduino-2.4.0\SerialPrinter.h(202): message : see reference to function template instantiation 'std::basic_ostream<char,std::char_traits<char>> &std::operator <<<std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,const char *)' being compiled
set_target_properties(${name} PROPERTIES COMPILE_FLAGS "/wd4530")
endif()
endfunction()
##############################################################################################################################################
# Dependencies
##############################################################################################################################################
find_package(GTest REQUIRED)
find_package(rapidassist 0.5.0 REQUIRED)
find_package(win32arduino 2.3.1 REQUIRED)
find_package(Git REQUIRED)
# Arduino BitReader library dependency
file(MAKE_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/external")
GIT_EXTERNAL("${CMAKE_CURRENT_SOURCE_DIR}/external" "http://github.com/end2endzone/BitReader.git" "1.3.0")
set(BITREADER_SOURCE_DIR "${PROJECT_SOURCE_DIR}/external/BitReader/src")
##############################################################################################################################################
# Project settings
##############################################################################################################################################
# Build options
option(ANYRTTTL_BUILD_EXAMPLES "Build all example projects" OFF)
# Prevents annoying warnings on MSVC
if (WIN32)
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
endif()
# Find all library source and unit test files
file( GLOB ARDUINO_LIBRARY_SOURCE_FILES ${PROJECT_SOURCE_DIR}/src/*.cpp ${PROJECT_SOURCE_DIR}/src/*.h ${BITREADER_SOURCE_DIR}/*.cpp ${BITREADER_SOURCE_DIR}/*.h)
file( GLOB ARDUINO_LIBRARY_TEST_FILES ${PROJECT_SOURCE_DIR}/test/*.cpp ${PROJECT_SOURCE_DIR}/test/*.h )
# Create unit test executable
add_executable(anyrtttl_unittest
${ARDUINO_LIBRARY_SOURCE_FILES}
${ARDUINO_LIBRARY_TEST_FILES}
)
#include directories
target_include_directories(anyrtttl_unittest
PRIVATE ${PROJECT_SOURCE_DIR}/src # Arduino Library folder
${GTEST_INCLUDE_DIR}
${BITREADER_SOURCE_DIR}
win32arduino
)
# Unit test projects requires to link with pthread if also linking with gtest
if(NOT WIN32)
set(PTHREAD_LIBRARIES -pthread)
endif()
#link libraries
target_link_libraries(anyrtttl_unittest PRIVATE win32arduino rapidassist ${PTHREAD_LIBRARIES} ${GTEST_LIBRARIES} )
if(WIN32)
# 1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\include\ostream(743,1): warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc
# 1>D:\dev\AnyRtttl\master\third_parties\win32Arduino\install\include\win32arduino-2.4.0\SerialPrinter.h(202): message : see reference to function template instantiation 'std::basic_ostream<char,std::char_traits<char>> &std::operator <<<std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,const char *)' being compiled
set_target_properties(anyrtttl_unittest PROPERTIES COMPILE_FLAGS "/wd4530")
endif()
# Copy `expected_call_stack.log` to expected locations
configure_file(${PROJECT_SOURCE_DIR}/test/expected_call_stack.log ${PROJECT_BINARY_DIR}/expected_call_stack.log COPYONLY)
set(TEST_FILES_BINARY_DIR ${EXECUTABLE_OUTPUT_PATH})
if(WIN32)
set(TEST_FILES_BINARY_DIR ${TEST_FILES_BINARY_DIR}/${CMAKE_CFG_INTDIR})
endif()
add_custom_command(
TARGET anyrtttl_unittest POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
${PROJECT_SOURCE_DIR}/test/expected_call_stack.log
${TEST_FILES_BINARY_DIR}/expected_call_stack.log)
##############################################################################################################################################
# Add all samples to the project unless the user has specified otherwise.
##############################################################################################################################################
if(ANYRTTTL_BUILD_EXAMPLES)
add_example("Basic")
add_example("BlockingProgramMemoryRtttl")
add_example("BlockingRtttl")
add_example("BlockingWithNonBlocking")
add_example("NonBlockingProgramMemoryRtttl")
add_example("NonBlockingRtttl")
add_example("NonBlockingStopBeforeEnd")
add_example("Play10Bits")
add_example("Play16Bits")
add_example("Rtttl2Code")
endif()