-
Notifications
You must be signed in to change notification settings - Fork 144
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #151 from gocarlos/feat--add-cmake-support
build: add cmake support
- Loading branch information
Showing
25 changed files
with
551 additions
and
411 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
/_build | ||
/build |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
name: CMake | ||
|
||
on: [push, pull_request] | ||
|
||
jobs: | ||
build: | ||
runs-on: ubuntu-latest | ||
|
||
steps: | ||
- uses: actions/checkout@v2 | ||
- name: build examples and tests | ||
run: rm -rf build || true && mkdir build && cd build && cmake .. -DLIBMBUS_BUILD_EXAMPLES=ON -DLIBMBUS_BUILD_TESTS=ON -DLIBMBUS_ENABLE_COVERAGE=ON && cmake --build . -j && cd .. | ||
|
||
- name: generate test frames | ||
run: ./test/generate-xml.sh test/test-frames | ||
|
||
- name: install and run gcovr | ||
run: sudo pip install gcovr && gcovr build/. | ||
|
||
debian: | ||
runs-on: ubuntu-latest | ||
|
||
steps: | ||
- uses: actions/checkout@v2 | ||
- name: build debian package | ||
run: rm -rf build || true && mkdir build && cd build && cmake .. -DLIBMBUS_PACKAGE_DEB=ON && cpack .. && sudo dpkg -i *.deb && ls /usr/lib | ||
|
||
doc: | ||
runs-on: ubuntu-latest | ||
|
||
steps: | ||
- uses: actions/checkout@v2 | ||
- name: build doxygen documentation | ||
run: sudo apt install -y doxygen | ||
|
||
- name: build doxygen documentation | ||
run: rm -rf build || true && mkdir build && cd build && cmake .. -DLIBMBUS_BUILD_DOCS=ON && cmake --build . --target doc | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,294 @@ | ||
cmake_minimum_required(VERSION 3.5) | ||
|
||
project( | ||
libmbus | ||
LANGUAGES CXX C | ||
VERSION "0.9.0") | ||
|
||
if(CMAKE_BUILD_TYPE STREQUAL "") | ||
message(STATUS "CMAKE_BUILD_TYPE empty setting to Debug") | ||
set(CMAKE_BUILD_TYPE "Debug") | ||
endif() | ||
|
||
# ############################################################################## | ||
# default options -> changed with e.g. cd build && cmake .. | ||
# -DLIBMBUS_BUILD_TESTS=ON | ||
# ############################################################################## | ||
|
||
option(LIBMBUS_BUILD_EXAMPLES "build examples" OFF) | ||
option(LIBMBUS_BUILD_TESTS "build tests" OFF) | ||
option(LIBMBUS_ENABLE_COVERAGE "build with coverage support" OFF) | ||
option(LIBMBUS_RUN_CLANG_TIDY "use Clang-Tidy for static analysis" OFF) | ||
option(LIBMBUS_PACKAGE_DEB "build debian package" OFF) | ||
option(LIBMBUS_PACKAGE_RPM "build rpm package" OFF) | ||
option(LIBMBUS_BUILD_DOCS "build documentation" OFF) | ||
option(BUILD_SHARED_LIBS "build shared lib" ON) | ||
|
||
set(CMAKE_CXX_STANDARD 17) | ||
set(CMAKE_CXX_STANDARD_REQUIRED ON) | ||
set(CMAKE_CXX_EXTENSIONS OFF) | ||
set(CMAKE_C_STANDARD 11) | ||
|
||
# Append our module directory to CMake | ||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" "${CMAKE_BINARY_DIR}") | ||
|
||
# Set the output of the libraries and executables. | ||
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) | ||
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) | ||
|
||
# ############################################################################## | ||
# static analysis | ||
# ############################################################################## | ||
|
||
if(LIBMBUS_RUN_CLANG_TIDY) | ||
find_program( | ||
CLANG_TIDY_EXE | ||
NAMES "clang-tidy" | ||
DOC "/usr/bin/clang-tidy") | ||
if(NOT CLANG_TIDY_EXE) | ||
message(WARNING "clang-tidy not found.") | ||
else() | ||
message(STATUS "clang-tidy found: ${CLANG_TIDY_EXE}") | ||
endif() | ||
endif(LIBMBUS_RUN_CLANG_TIDY) | ||
|
||
if(LIBMBUS_ENABLE_COVERAGE) | ||
if(NOT CMAKE_BUILD_TYPE MATCHES "(Debug)|(RelWithDebInfo)") | ||
message(WARNING "Code coverage results with an optimised (non-Debug) build may be misleading") | ||
endif() | ||
|
||
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") | ||
# using Clang | ||
message(STATUS "Not doing coverage...") | ||
elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") | ||
# using GCC | ||
message(STATUS "Building with code coverage...") | ||
set(CMAKE_BUILD_TYPE DEBUG) | ||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -ggdb3 -O0 --coverage -fprofile-arcs -ftest-coverage") | ||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC -ggdb3 -O0 --coverage -fprofile-arcs -ftest-coverage ") | ||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_CXX_FLAGS} --coverage -fprofile-arcs -ftest-coverage ") | ||
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_CXX_FLAGS} --coverage -fprofile-arcs -ftest-coverage ") | ||
link_libraries(-lgcov) | ||
endif() | ||
endif() | ||
|
||
include(CheckIncludeFile) | ||
|
||
check_include_file(dlfcn.h HAVE_DLFCN_H) | ||
check_include_file(inttypes.h HAVE_INTTYPES_H) | ||
check_include_file(memory.h HAVE_MEMORY_H) | ||
check_include_file(stdlib.h HAVE_STDINT_H) | ||
check_include_file(stdint.h HAVE_STDLIB_H) | ||
check_include_file(strings.h HAVE_STRINGS_H) | ||
check_include_file(string.h HAVE_STRING_H) | ||
check_include_file(sys/stat.h HAVE_SYS_STAT_H) | ||
check_include_file(sys/types.h HAVE_SYS_TYPES_H) | ||
check_include_file(unistd.h HAVE_UNISTD_H) | ||
|
||
# ############################################################################## | ||
# library | ||
# ############################################################################## | ||
|
||
set(PACKAGE_STRING "${PROJECT_NAME} ${PROJECT_VERSION}") | ||
|
||
set(PACKAGE_VERSION "${PROJECT_VERSION}") | ||
set(VERSION "${PROJECT_VERSION}") | ||
configure_file(${CMAKE_CURRENT_LIST_DIR}/mbus/config.h.in ${CMAKE_CURRENT_LIST_DIR}/config.h @ONLY) | ||
|
||
add_library( | ||
${PROJECT_NAME} | ||
"${CMAKE_CURRENT_LIST_DIR}/mbus/mbus-protocol.c" | ||
"${CMAKE_CURRENT_LIST_DIR}/mbus/mbus-protocol.h" | ||
"${CMAKE_CURRENT_LIST_DIR}/mbus/mbus-tcp.c" | ||
"${CMAKE_CURRENT_LIST_DIR}/mbus/mbus-tcp.h" | ||
"${CMAKE_CURRENT_LIST_DIR}/mbus/mbus.c" | ||
"${CMAKE_CURRENT_LIST_DIR}/mbus/mbus.h" | ||
"${CMAKE_CURRENT_LIST_DIR}/mbus/mbus-protocol-aux.c" | ||
"${CMAKE_CURRENT_LIST_DIR}/mbus/mbus-protocol-aux.h" | ||
"${CMAKE_CURRENT_LIST_DIR}/mbus/mbus-serial.c" | ||
"${CMAKE_CURRENT_LIST_DIR}/mbus/mbus-serial.h") | ||
target_include_directories( | ||
${PROJECT_NAME} | ||
PUBLIC "$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}>" "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>" | ||
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>") | ||
if(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR CMAKE_SYSTEM_NAME STREQUAL "Android") | ||
target_link_libraries(${PROJECT_NAME} PRIVATE m) | ||
endif() | ||
if(NOT MSVC) | ||
target_compile_options(${PROJECT_NAME} PRIVATE -Wall -Wextra -Wno-pedantic) | ||
endif() | ||
|
||
if(CLANG_TIDY_EXE) | ||
set_target_properties(${PROJECT_NAME} PROPERTIES CXX_CLANG_TIDY "${CLANG_TIDY_EXE}") | ||
endif() | ||
|
||
add_library(${PROJECT_NAME}::${PROJECT_NAME} ALIAS ${PROJECT_NAME}) | ||
|
||
# ############################################################################## | ||
# examples | ||
# ############################################################################## | ||
|
||
if(LIBMBUS_BUILD_EXAMPLES) | ||
message(STATUS "building examples") | ||
add_subdirectory(bin) | ||
endif() | ||
|
||
# ############################################################################## | ||
# tests | ||
# ############################################################################## | ||
|
||
if(LIBMBUS_BUILD_TESTS) | ||
message(STATUS "building tests") | ||
enable_testing() | ||
add_subdirectory(test) | ||
endif() | ||
|
||
# ############################################################################## | ||
# install | ||
# ############################################################################## | ||
|
||
include(GNUInstallDirs) | ||
include(CMakePackageConfigHelpers) | ||
|
||
set(INSTALL_PKGCONFIG_DIR | ||
"${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig" | ||
CACHE PATH "Installation directory for pkgconfig (.pc) files") | ||
set(INSTALL_INC_DIR | ||
"${CMAKE_INSTALL_INCLUDEDIR}/mbus" | ||
CACHE PATH "Installation directory for headers") | ||
set(INSTALL_LIB_DIR | ||
"${CMAKE_INSTALL_LIBDIR}" | ||
CACHE PATH "Installation directory for libraries") | ||
|
||
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libmbus.pc.in ${CMAKE_CURRENT_BINARY_DIR}/libmbus.pc @ONLY) | ||
install( | ||
FILES ${CMAKE_CURRENT_BINARY_DIR}/libmbus.pc | ||
DESTINATION "${INSTALL_PKGCONFIG_DIR}" | ||
COMPONENT dev) | ||
|
||
set(LIBMBUS_CONFIG_INSTALL_DIR ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}) | ||
install( | ||
TARGETS ${PROJECT_NAME} | ||
EXPORT ${PROJECT_NAME}Targets | ||
LIBRARY DESTINATION "${INSTALL_LIB_DIR}" COMPONENT lib | ||
ARCHIVE DESTINATION "${INSTALL_LIB_DIR}" COMPONENT dev | ||
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT lib) | ||
install( | ||
EXPORT ${PROJECT_NAME}Targets | ||
DESTINATION "${LIBMBUS_CONFIG_INSTALL_DIR}" | ||
NAMESPACE ${PROJECT_NAME}:: | ||
COMPONENT dev) | ||
|
||
configure_package_config_file(cmake/Config.cmake.in ${PROJECT_NAME}Config.cmake INSTALL_DESTINATION | ||
"${LIBMBUS_CONFIG_INSTALL_DIR}") | ||
write_basic_package_version_file(${PROJECT_NAME}ConfigVersion.cmake COMPATIBILITY SameMajorVersion) | ||
install( | ||
FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake | ||
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake | ||
DESTINATION "${LIBMBUS_CONFIG_INSTALL_DIR}" | ||
COMPONENT dev) | ||
|
||
install( | ||
DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/mbus/" | ||
DESTINATION "${INSTALL_INC_DIR}" | ||
COMPONENT dev | ||
FILES_MATCHING | ||
PATTERN "*.h") | ||
|
||
# ############################################################################## | ||
# package | ||
# mkdir build ; cd build ; cmake .. -DLIBMBUS_PACKAGE_DEB=ON ; cpack .. | ||
# ############################################################################## | ||
|
||
include(InstallRequiredSystemLibraries) | ||
|
||
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Open source M-bus (Meter-Bus) library.") | ||
set(CPACK_PACKAGE_DESCRIPTION | ||
"libmbus is an open source library for the M-bus (Meter-Bus) protocol. | ||
The Meter-Bus is a standard for reading out meter data from electricity meters, | ||
heat meters, gas meters, etc. The M-bus standard deals with both the electrical | ||
signals on the M-Bus, and the protocol and data format used in transmissions | ||
on the M-Bus. The role of libmbus is to decode/encode M-bus data, and to handle | ||
the communication with M-Bus devices. | ||
For more information see http://www.rscada.se/libmbus") | ||
|
||
set(CPACK_PACKAGE_VENDOR "Raditex Control AB") | ||
set(CPACK_PACKAGE_CONTACT "Stefan Wahren <[email protected]>") | ||
set(CPACK_PACKAGE_HOMEPAGE_URL "https://github.com/rscada/libmbus/") | ||
set(CPACK_RESOURCE_FILE_LICENSE ${PROJECT_SOURCE_DIR}/LICENSE) | ||
set(CPACK_PACKAGE_VERSION_MAJOR "${PROJECT_VERSION_MAJOR}") | ||
set(CPACK_PACKAGE_VERSION_MINOR "${PROJECT_VERSION_MINOR}") | ||
set(CPACK_PACKAGE_VERSION_PATCH "${PROJECT_VERSION_PATCH}") | ||
set(CPACK_DEB_COMPONENT_INSTALL ON) | ||
set(CPACK_DEBIAN_PACKAGE_DEBUG ON) | ||
set(CPACK_PACKAGE_RELEASE 1) | ||
|
||
# create 2 components, libmbus, libmbus-dev | ||
set(CPACK_COMPONENTS_ALL lib dev) | ||
set(CPACK_COMPONENT_LIB_DESCRIPTION "FreeSCADA M-Bus Library. | ||
A free and open-source library for M-Bus (Meter Bus) from the rSCADA project.") | ||
set(CPACK_DEBIAN_LIB_PACKAGE_SECTION libs) | ||
|
||
set(CPACK_COMPONENT_DEVEL_DESCRIPTION | ||
"FreeSCADA M-Bus Library Development files. | ||
A free and open-source library for M-Bus (Meter Bus) from the rSCADA project, | ||
including development files.") | ||
set(CPACK_DEBIAN_DEVEL_PACKAGE_SECTION libdevel) | ||
|
||
set(CPACK_COMPONENT_DEVEL_DEPENDS lib) | ||
|
||
set(CPACK_PACKAGE_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}") | ||
set(CPACK_PACKAGE_FILE_NAME | ||
"${CMAKE_PROJECT_NAME}_${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}") | ||
|
||
if(LIBMBUS_PACKAGE_DEB) | ||
set(CPACK_GENERATOR "DEB") | ||
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Stefan Wahren <[email protected]>") | ||
set(CPACK_DEBIAN_PACKAGE_SECTION "Development/Languages/C and C++") | ||
set(CPACK_DEBIAN_ARCHITECTURE ${CMAKE_SYSTEM_PROCESSOR}) | ||
set(CPACK_DEBIAN_PACKAGE_VERSION | ||
"${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}-${CPACK_PACKAGE_RELEASE}" | ||
) | ||
endif() | ||
|
||
if(LIBMBUS_PACKAGE_RPM) | ||
set(CPACK_GENERATOR "RPM") | ||
set(CPACK_RPM_PACKAGE_LICENSE "BSD") | ||
endif() | ||
|
||
include(CPack) | ||
|
||
# ############################################################################## | ||
# doc | ||
# mkdir build ; cd build ; cmake .. -DLIBMBUS_BUILD_DOCS=ON ; cmake --build . --target doc | ||
# ############################################################################## | ||
|
||
if(LIBMBUS_BUILD_DOCS) | ||
message(STATUS "building with documentation") | ||
# Generate targets for documentation | ||
# check if Doxygen is installed | ||
find_package(Doxygen) | ||
|
||
if(Doxygen_FOUND) | ||
# set input and output files | ||
set(DOXYGEN_IN ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in) | ||
set(DOXYGEN_OUT ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile) | ||
|
||
# request to configure the file | ||
configure_file(${DOXYGEN_IN} ${DOXYGEN_OUT} @ONLY) | ||
|
||
# note the option ALL which allows to build the docs together with the application | ||
add_custom_target( | ||
doc ALL | ||
COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYGEN_OUT} | ||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} | ||
COMMENT "Generating API documentation with Doxygen" | ||
VERBATIM) | ||
|
||
message(STATUS "Setup up the Doxygen documention build") | ||
|
||
else(Doxygen_FOUND) | ||
message(WARNING "Doxygen need to be installed to generate the doxygen documentation") | ||
endif(Doxygen_FOUND) | ||
endif() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
# docker build . -f Dockerfile.deb -t deb_builder | ||
|
||
FROM ubuntu | ||
|
||
RUN apt update -y && apt install -y cmake gcc g++ make | ||
COPY . /tmp | ||
RUN cd /tmp && \ | ||
mkdir build && \ | ||
cd build && \ | ||
cmake .. -DLIBMBUS_PACKAGE_DEB=ON && \ | ||
cpack .. && \ | ||
ls -al && \ | ||
dpkg -i *.deb | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
# docker build . -f Dockerfile.rpm -t rpm_builder | ||
|
||
FROM fedora | ||
|
||
RUN dnf install -y cmake gcc g++ make rpm-build | ||
COPY . /tmp | ||
RUN cd /tmp && \ | ||
mkdir build && \ | ||
cd build && \ | ||
cmake .. -DLIBMBUS_PACKAGE_RPM=ON && \ | ||
cpack .. && \ | ||
ls -al && \ | ||
rpm -i *.rpm | ||
|
Oops, something went wrong.