boothifier/lib/AnyRtttl/CMakeLists.txt

160 lines
7.1 KiB
CMake

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()