185 lines
7.2 KiB
CMake
Executable file
185 lines
7.2 KiB
CMake
Executable file
#######################################
|
|
# Required CMake version #
|
|
#######################################
|
|
cmake_minimum_required( VERSION 3.18 )
|
|
|
|
#######################################
|
|
# Project name #
|
|
#######################################
|
|
project( OpENer LANGUAGES C VERSION 2.3 )
|
|
|
|
#######################################
|
|
# Project version #
|
|
#######################################
|
|
|
|
if( NOT DEFINED OpENer_Device_Config_Vendor_Id )
|
|
set( OpENer_Device_Config_Vendor_Id 1 CACHE STRING "Device Vendor ID" )
|
|
endif()
|
|
if( NOT DEFINED OpENer_Device_Config_Device_Type )
|
|
set( OpENer_Device_Config_Device_Type 12 CACHE STRING "Device Type ID" )
|
|
endif()
|
|
if( NOT DEFINED OpENer_Device_Config_Product_Code )
|
|
set( OpENer_Device_Config_Product_Code 65001 CACHE STRING "Device Product Code" )
|
|
endif()
|
|
if( NOT DEFINED OpENer_Device_Config_Device_Name )
|
|
set( OpENer_Device_Config_Device_Name "OpENer PC" CACHE STRING "Device Name" )
|
|
endif()
|
|
if(NOT DEFINED OpENer_Device_Major_Version)
|
|
set(OpENer_Device_Major_Version ${PROJECT_VERSION_MAJOR} CACHE STRING "Major Version")
|
|
endif()
|
|
if(NOT DEFINED OpENer_Device_Minor_Version)
|
|
set(OpENer_Device_Minor_Version ${PROJECT_VERSION_MINOR} CACHE STRING "Minor Version")
|
|
endif()
|
|
|
|
configure_file(
|
|
"${PROJECT_SOURCE_DIR}/src/ports/devicedata.h.in"
|
|
"${PROJECT_BINARY_DIR}/src/ports/devicedata.h"
|
|
)
|
|
|
|
find_path( OpENer_BUILDSUPPORT_DIR OpENer.cmake ${PROJECT_SOURCE_DIR}/buildsupport )
|
|
|
|
INCLUDE( ${OpENer_BUILDSUPPORT_DIR}/OpENer.cmake )
|
|
|
|
option(OPENER_RANDOMIZE_CONNECTION_ID "Use randomized connection IDs also for lower 16-bits?" FALSE)
|
|
option(OPENER_PRODUCED_DATA_HAS_RUN_IDLE_HEADER "Shall produced data from OpENer also include a run idle header?" FALSE)
|
|
option(OPENER_CONSUMED_DATA_HAS_RUN_IDLE_HEADER "Will consumed data from OpENer also include a run idle header?" TRUE)
|
|
option(OPENER_INSTALL_AS_LIB "Build and install OpENer as a library" FALSE)
|
|
option(BUILD_SHARED_LIBS "Build OpENer as shared library" FALSE)
|
|
|
|
if(OPENER_RANDOMIZE_CONNECTION_ID)
|
|
add_definitions(-DOPENER_RANDOMIZE_CONNECTION_ID)
|
|
endif()
|
|
|
|
if(OPENER_PRODUCED_DATA_HAS_RUN_IDLE_HEADER)
|
|
add_definitions(-DOPENER_PRODUCED_DATA_HAS_RUN_IDLE_HEADER)
|
|
endif()
|
|
|
|
if(OPENER_CONSUMED_DATA_HAS_RUN_IDLE_HEADER)
|
|
add_definitions(-DOPENER_CONSUMED_DATA_HAS_RUN_IDLE_HEADER)
|
|
endif()
|
|
|
|
option(OPENER_IS_DLR_DEVICE "Is OpENer built with support for a basic DLR device?" FALSE)
|
|
if (OPENER_IS_DLR_DEVICE)
|
|
add_definitions(-DOPENER_IS_DLR_DEVICE)
|
|
endif()
|
|
|
|
# This buffer size will be used for any received message.
|
|
# The same buffer is used for the replied explicit message.
|
|
# There are two uses in OpENer:
|
|
# 1. Explicit messages will use this buffer to store the data generated by the request
|
|
# 2. I/O Connections will use this buffer for the produced data
|
|
set( OPENER_ETHERNET_BUFFER_SIZE "512" CACHE STRING "Number of bytes used for the Ethernet message buffer")
|
|
add_definitions(-DPC_OPENER_ETHERNET_BUFFER_SIZE=${OPENER_ETHERNET_BUFFER_SIZE} )
|
|
|
|
#######################################
|
|
# Platform switches #
|
|
#######################################
|
|
set( OpENer_KNOWN_PLATFORMS "POSIX" "WIN32" "MINGW")
|
|
|
|
set( OpENer_PLATFORM CACHE STRING "Platform OpENer will be built for" )
|
|
set_property(CACHE OpENer_PLATFORM PROPERTY STRINGS ${OpENer_KNOWN_PLATFORMS} )
|
|
|
|
#######################################
|
|
# Platform-dependent functions check #
|
|
#######################################
|
|
INCLUDE( ${OpENer_BUILDSUPPORT_DIR}/OpENer_function_checks.cmake )
|
|
|
|
#######################################
|
|
# OpENer tracer switches #
|
|
#######################################
|
|
set( OpENer_TRACES OFF CACHE BOOL "Activate OpENer traces" )
|
|
if(OpENer_TRACES)
|
|
createTraceLevelOptions()
|
|
endif(OpENer_TRACES)
|
|
|
|
#######################################
|
|
# OpENer documentation target "doc" #
|
|
#######################################
|
|
|
|
# check if Doxygen is installed
|
|
find_package(Doxygen)
|
|
if (DOXYGEN_FOUND)
|
|
# set input and output files
|
|
set(DOXYGEN_IN ${OpENer_SOURCE_DIR}/opener.doxyfile.in)
|
|
set(DOXYGEN_OUT ${OpENer_BINARY_DIR}/opener.doxyfile)
|
|
|
|
# exclude subdirectories of non active platforms depending on OpENer_PLATFORM
|
|
set(OpENer_EXCLUDE_PATTERNS "")
|
|
if (NOT (${OpENer_PLATFORM} STREQUAL "POSIX"))
|
|
set(OpENer_EXCLUDE_PATTERNS "${OpENer_EXCLUDE_PATTERNS} */src/ports/POSIX/*")
|
|
endif ()
|
|
if (NOT (${OpENer_PLATFORM} STREQUAL "WIN32"))
|
|
set(OpENer_EXCLUDE_PATTERNS "${OpENer_EXCLUDE_PATTERNS} */src/ports/WIN32/*")
|
|
endif ()
|
|
if (NOT (${OpENer_PLATFORM} STREQUAL "MINGW"))
|
|
set(OpENer_EXCLUDE_PATTERNS "${OpENer_EXCLUDE_PATTERNS} */src/ports/MINGW/*")
|
|
endif ()
|
|
|
|
# request to configure the file
|
|
configure_file(${DOXYGEN_IN} ${DOXYGEN_OUT} @ONLY)
|
|
|
|
# note the option ALL which will build the docs always with the default target
|
|
add_custom_target( doc # ALL
|
|
COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYGEN_OUT}
|
|
WORKING_DIRECTORY ${OpENer_SOURCE_DIR}
|
|
COMMENT "Generating API documentation with Doxygen"
|
|
VERBATIM )
|
|
message("-- Doxygen setup done")
|
|
else (DOXYGEN_FOUND)
|
|
message("Doxygen needs to be installed to generate the Doxygen documentation")
|
|
endif (DOXYGEN_FOUND)
|
|
|
|
|
|
#######################################
|
|
# Test switch #
|
|
#######################################
|
|
set( OpENer_TESTS OFF CACHE BOOL "Enable tests to be built" )
|
|
if( OpENer_TESTS )
|
|
enable_testing()
|
|
enable_language( CXX )
|
|
set( CPPUTEST_HOME "" CACHE PATH "Path to CppUTest directory" )
|
|
INCLUDE( ${OpENer_BUILDSUPPORT_DIR}/OpENer_Tests.cmake )
|
|
INCLUDE( ${OpENer_BUILDSUPPORT_DIR}/CodeCoverage.cmake )
|
|
APPEND_COVERAGE_COMPILER_FLAGS()
|
|
# The used CppUTest framework does not support parallel jobs
|
|
SETUP_TARGET_FOR_COVERAGE_LCOV(NAME ${PROJECT_NAME}_coverage EXECUTABLE OpENer_Tests EXCLUDE "tests/*" "src/ports/*/sample_application/*" "${CPPUTEST_HOME}/*")
|
|
add_test_includes()
|
|
add_definitions( -DOPENER_UNIT_TEST )
|
|
add_subdirectory( tests )
|
|
endif( OpENer_TESTS )
|
|
|
|
#######################################
|
|
# OpENer C flags #
|
|
#######################################
|
|
if (OpENer_PLATFORM STREQUAL "WIN32")
|
|
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -W4" )
|
|
else ()
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wconversion")
|
|
endif ()
|
|
|
|
####################################################
|
|
# Internal cache holding the available CIP objects #
|
|
####################################################
|
|
|
|
# Add definitions for additional CIP Objects
|
|
string(COMPARE NOTEQUAL "${OpENer_ADD_CIP_OBJECTS}" "" OpENer_HAS_ADDITIONAL_OBJECT)
|
|
if (OpENer_HAS_ADDITIONAL_OBJECT)
|
|
string(REPLACE " " ";" OpENer_ADD_CIP_OBJECTS_LIST ${OpENer_ADD_CIP_OBJECTS})
|
|
foreach (CIP_OBJECT IN LISTS OpENer_ADD_CIP_OBJECTS_LIST)
|
|
add_definitions(-D${CIP_OBJECT})
|
|
endforeach ()
|
|
endif ()
|
|
|
|
set( OpENer_ADD_CIP_OBJECTS "" CACHE INTERNAL STRING )
|
|
set( OpENer_ADD_CIP_OBJECTS_INCLUDES "" CACHE INTERNAL STRING )
|
|
|
|
#######################################
|
|
# Add custom CIP objects #
|
|
#######################################
|
|
set( OpENer_CIP_OBJECTS_DIR ${PROJECT_SOURCE_DIR}/src/cip_objects )
|
|
include(${OpENer_BUILDSUPPORT_DIR}/OpENer_CIP_Object_generator.cmake)
|
|
|
|
# ######################################
|
|
# Add subdirectories #
|
|
# ######################################
|
|
add_subdirectory( src )
|