CMakeLists.txt 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. #######################################
  2. # Required CMake version #
  3. #######################################
  4. cmake_minimum_required( VERSION 3.3 )
  5. #######################################
  6. # Project name #
  7. #######################################
  8. project( OpENer LANGUAGES C VERSION 2.3 )
  9. #######################################
  10. # Project version #
  11. #######################################
  12. if( NOT DEFINED OpENer_Device_Config_Vendor_Id )
  13. set( OpENer_Device_Config_Vendor_Id 1 CACHE STRING "Device Vendor ID" )
  14. endif()
  15. if( NOT DEFINED OpENer_Device_Config_Device_Type )
  16. set( OpENer_Device_Config_Device_Type 12 CACHE STRING "Device Type ID" )
  17. endif()
  18. if( NOT DEFINED OpENer_Device_Config_Product_Code )
  19. set( OpENer_Device_Config_Product_Code 65001 CACHE STRING "Device Product Code" )
  20. endif()
  21. if( NOT DEFINED OpENer_Device_Config_Device_Name )
  22. set( OpENer_Device_Config_Device_Name "OpENer PC" CACHE STRING "Device Name" )
  23. endif()
  24. configure_file(
  25. "${PROJECT_SOURCE_DIR}/src/ports/devicedata.h.in"
  26. "${PROJECT_BINARY_DIR}/src/ports/devicedata.h"
  27. )
  28. find_path( OpENer_BUILDSUPPORT_DIR OpENer.cmake ${PROJECT_SOURCE_DIR}/buildsupport )
  29. INCLUDE( ${OpENer_BUILDSUPPORT_DIR}/OpENer.cmake )
  30. option(OPENER_PRODUCED_DATA_HAS_RUN_IDLE_HEADER "Shall produced data from OpENer also include a run idle header?" FALSE)
  31. option(OPENER_CONSUMED_DATA_HAS_RUN_IDLE_HEADER "Will consumed data from OpENer also include a run idle header?" TRUE)
  32. if(OPENER_PRODUCED_DATA_HAS_RUN_IDLE_HEADER)
  33. add_definitions(-DOPENER_PRODUCED_DATA_HAS_RUN_IDLE_HEADER)
  34. endif()
  35. if(OPENER_CONSUMED_DATA_HAS_RUN_IDLE_HEADER)
  36. add_definitions(-DOPENER_CONSUMED_DATA_HAS_RUN_IDLE_HEADER)
  37. endif()
  38. option(OPENER_IS_DLR_DEVICE "Is OpENer built with support for a basic DLR device?" FALSE)
  39. if (OPENER_IS_DLR_DEVICE)
  40. add_definitions(-DOPENER_IS_DLR_DEVICE)
  41. endif()
  42. # The number of bytes used for the buffer that will be used for generating any reply data of messages.
  43. # There are two uses in OpENer:
  44. # 1. Explicit messages will use this buffer to store the data generated by the request
  45. # 2. I/O Connections will use this buffer for the produced data
  46. set( OPENER_MESSAGE_DATA_REPLY_BUFFER "200" CACHE STRING "The number of bytes used for the reply message buffer")
  47. add_definitions(-DOPENER_MESSAGE_DATA_REPLY_BUFFER=${OPENER_MESSAGE_DATA_REPLY_BUFFER} )
  48. #######################################
  49. # Platform switches #
  50. #######################################
  51. set( OpENer_KNOWN_PLATFORMS "POSIX" "WIN32" "MINGW")
  52. set( OpENer_PLATFORM CACHE STRING "Platform OpENer will be built for" )
  53. set_property(CACHE OpENer_PLATFORM PROPERTY STRINGS ${OpENer_KNOWN_PLATFORMS} )
  54. #######################################
  55. # Platform-dependent functions check #
  56. #######################################
  57. INCLUDE( ${OpENer_BUILDSUPPORT_DIR}/OpENer_function_checks.cmake )
  58. #######################################
  59. # OpENer tracer switches #
  60. #######################################
  61. set( OpENer_TRACES OFF CACHE BOOL "Activate OpENer traces" )
  62. if(OpENer_TRACES)
  63. createTraceLevelOptions()
  64. endif(OpENer_TRACES)
  65. #######################################
  66. # OpENer library mode switch #
  67. #######################################
  68. set( OPENER_BUILD_SHARED_LIBS OFF CACHE BOOL "Builds OpENer as separate lib and sample application" )
  69. #######################################
  70. # OpENer documentation target "doc" #
  71. #######################################
  72. # check if Doxygen is installed
  73. find_package(Doxygen)
  74. if (DOXYGEN_FOUND)
  75. # set input and output files
  76. set(DOXYGEN_IN ${OpENer_SOURCE_DIR}/opener.doxyfile.in)
  77. set(DOXYGEN_OUT ${OpENer_BINARY_DIR}/opener.doxyfile)
  78. # exclude subdirectories of non active platforms depending on OpENer_PLATFORM
  79. set(OpENer_EXCLUDE_PATTERNS "")
  80. if (NOT (${OpENer_PLATFORM} STREQUAL "POSIX"))
  81. set(OpENer_EXCLUDE_PATTERNS "${OpENer_EXCLUDE_PATTERNS} */src/ports/POSIX/*")
  82. endif ()
  83. if (NOT (${OpENer_PLATFORM} STREQUAL "WIN32"))
  84. set(OpENer_EXCLUDE_PATTERNS "${OpENer_EXCLUDE_PATTERNS} */src/ports/WIN32/*")
  85. endif ()
  86. if (NOT (${OpENer_PLATFORM} STREQUAL "MINGW"))
  87. set(OpENer_EXCLUDE_PATTERNS "${OpENer_EXCLUDE_PATTERNS} */src/ports/MINGW/*")
  88. endif ()
  89. # request to configure the file
  90. configure_file(${DOXYGEN_IN} ${DOXYGEN_OUT} @ONLY)
  91. # note the option ALL which will build the docs always with the default target
  92. add_custom_target( doc # ALL
  93. COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYGEN_OUT}
  94. WORKING_DIRECTORY ${OpENer_SOURCE_DIR}
  95. COMMENT "Generating API documentation with Doxygen"
  96. VERBATIM )
  97. message("-- Doxygen setup done")
  98. else (DOXYGEN_FOUND)
  99. message("Doxygen needs to be installed to generate the Doxygen documentation")
  100. endif (DOXYGEN_FOUND)
  101. #######################################
  102. # Test switch #
  103. #######################################
  104. set( OpENer_TESTS OFF CACHE BOOL "Enable tests to be built" )
  105. if( OpENer_TESTS )
  106. enable_testing()
  107. enable_language( CXX )
  108. set( CPPUTEST_HOME "" CACHE PATH "Path to CppUTest directory" )
  109. INCLUDE( ${OpENer_BUILDSUPPORT_DIR}/OpENer_Tests.cmake )
  110. INCLUDE( ${OpENer_BUILDSUPPORT_DIR}/CodeCoverage.cmake )
  111. APPEND_COVERAGE_COMPILER_FLAGS()
  112. # The used CppUTest framework does not support parallel jobs
  113. SETUP_TARGET_FOR_COVERAGE_LCOV(NAME ${PROJECT_NAME}_coverage EXECUTABLE OpENer_Tests EXCLUDE "tests/*" "src/ports/*/sample_application/*" "${CPPUTEST_HOME}/*")
  114. add_test_includes()
  115. add_subdirectory( tests )
  116. endif( OpENer_TESTS )
  117. #######################################
  118. # OpENer C flags #
  119. #######################################
  120. set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall" )
  121. ####################################################
  122. # Internal cache holding the available CIP objects #
  123. ####################################################
  124. # Add definitions for additional CIP Objects
  125. string(COMPARE NOTEQUAL "${OpENer_ADD_CIP_OBJECTS}" "" OpENer_HAS_ADDITIONAL_OBJECT)
  126. if (OpENer_HAS_ADDITIONAL_OBJECT)
  127. string(REPLACE " " ";" OpENer_ADD_CIP_OBJECTS_LIST ${OpENer_ADD_CIP_OBJECTS})
  128. foreach (CIP_OBJECT IN LISTS OpENer_ADD_CIP_OBJECTS_LIST)
  129. add_definitions(-D${CIP_OBJECT})
  130. endforeach ()
  131. endif ()
  132. set( OpENer_ADD_CIP_OBJECTS "" CACHE INTERNAL STRING )
  133. set( OpENer_ADD_CIP_OBJECTS_INCLUDES "" CACHE INTERNAL STRING )
  134. #######################################
  135. # Add custom CIP objects #
  136. #######################################
  137. set( OpENer_CIP_OBJECTS_DIR ${PROJECT_SOURCE_DIR}/src/cip_objects )
  138. include(${OpENer_BUILDSUPPORT_DIR}/OpENer_CIP_Object_generator.cmake)
  139. #######################################
  140. # Add subdirectories #
  141. #######################################
  142. add_subdirectory( src )