| #*******************************************************************************
|
| # Copyright (c) 2010 -2014 Profactor GmbH, ACIN, fortiss GmbH
|
| # This program and the accompanying materials are made available under the |
| # terms of the Eclipse Public License 2.0 which is available at |
| # http://www.eclipse.org/legal/epl-2.0. |
| # |
| # SPDX-License-Identifier: EPL-2.0
|
| # |
| # Contributors: |
| # Michael Hofmann, Alois Zoitl, Gerhard Ebenhofer, Matthias Plash, Patrick Smejkal - initial API and implementation and/or initial documentation
|
| # *******************************************************************************/
|
|
|
| MACRO(forte_add_subdirectory DIRECTORY)
|
| SET(SOURCE_GROUP_BACKUP ${SOURCE_GROUP})
|
| SET(SOURCE_GROUP ${SOURCE_GROUP}\\${DIRECTORY})
|
| add_subdirectory(${DIRECTORY})
|
| SET(SOURCE_GROUP ${SOURCE_GROUP_BACKUP})
|
| ENDMACRO(forte_add_subdirectory)
|
|
|
| FUNCTION(forte_add_sourcefile_with_path_h)
|
| FOREACH(ARG ${ARGV})
|
| SET_SOURCE_FILES_PROPERTIES(${ARG} PROPERTIES HEADER_FILE_ONLY TRUE)
|
| SET_PROPERTY(GLOBAL APPEND PROPERTY FORTE_SOURCE_H ${ARG})
|
| SET_PROPERTY(GLOBAL APPEND PROPERTY FORTE_SOURCE_H_GROUP ${SOURCE_GROUP})
|
| ENDFOREACH(ARG)
|
| ENDFUNCTION(forte_add_sourcefile_with_path_h)
|
|
|
| FUNCTION(forte_add_sourcefile_with_path_cpp)
|
| FOREACH(ARG ${ARGV})
|
| SET_PROPERTY(GLOBAL APPEND PROPERTY FORTE_SOURCE_CPP ${ARG})
|
| SET_PROPERTY(GLOBAL APPEND PROPERTY FORTE_SOURCE_CPP_GROUP ${SOURCE_GROUP})
|
| ENDFOREACH(ARG)
|
| ENDFUNCTION(forte_add_sourcefile_with_path_cpp)
|
|
|
| FUNCTION(forte_add_sourcefile_with_path_hcpp)
|
| FOREACH(ARG ${ARGV})
|
| forte_add_sourcefile_with_path_h(${ARG}.h)
|
| forte_add_sourcefile_with_path_cpp(${ARG}.cpp)
|
| ENDFOREACH(ARG)
|
| ENDFUNCTION(forte_add_sourcefile_with_path_hcpp)
|
|
|
| FUNCTION(forte_add_sourcefile_h)
|
| FOREACH(ARG ${ARGV})
|
| forte_add_sourcefile_with_path_h(${CMAKE_CURRENT_SOURCE_DIR}/${ARG})
|
| ENDFOREACH(ARG)
|
| ENDFUNCTION(forte_add_sourcefile_h)
|
|
|
| FUNCTION(forte_add_sourcefile_with_path_hc)
|
| FOREACH(ARG ${ARGV})
|
| forte_add_sourcefile_with_path_h(${ARG}.h)
|
| forte_add_sourcefile_with_path_cpp(${ARG}.c)
|
| ENDFOREACH(ARG)
|
| ENDFUNCTION(forte_add_sourcefile_with_path_hc)
|
|
|
| FUNCTION(forte_add_sourcefile_hc)
|
| FOREACH(ARG ${ARGV})
|
| forte_add_sourcefile_with_path_hc(${CMAKE_CURRENT_SOURCE_DIR}/${ARG})
|
| ENDFOREACH(ARG)
|
| ENDFUNCTION(forte_add_sourcefile_hc)
|
|
|
| FUNCTION(forte_add_sourcefile_c)
|
| FOREACH(ARG ${ARGV})
|
| forte_add_sourcefile_with_path_c(${CMAKE_CURRENT_SOURCE_DIR}/${ARG})
|
| ENDFOREACH(ARG)
|
| ENDFUNCTION(forte_add_sourcefile_c)
|
|
|
| FUNCTION(forte_add_sourcefile_with_path_c)
|
| FOREACH(ARG ${ARGV})
|
| SET_PROPERTY(GLOBAL APPEND PROPERTY FORTE_SOURCE_C ${ARG})
|
| SET_PROPERTY(GLOBAL APPEND PROPERTY FORTE_SOURCE_C_GROUP ${SOURCE_GROUP})
|
| ENDFOREACH(ARG)
|
| ENDFUNCTION(forte_add_sourcefile_with_path_c)
|
|
|
| FUNCTION(forte_add_sourcefile_cpp)
|
| FOREACH(ARG ${ARGV})
|
| forte_add_sourcefile_with_path_cpp(${CMAKE_CURRENT_SOURCE_DIR}/${ARG})
|
| ENDFOREACH(ARG)
|
| ENDFUNCTION(forte_add_sourcefile_cpp)
|
|
|
| FUNCTION(forte_add_sourcefile_hcpp)
|
| FOREACH(ARG ${ARGV})
|
| forte_add_sourcefile_with_path_hcpp(${CMAKE_CURRENT_SOURCE_DIR}/${ARG})
|
| ENDFOREACH(ARG)
|
| ENDFUNCTION(forte_add_sourcefile_hcpp)
|
|
|
| FUNCTION(forte_add_include_directories)
|
| FOREACH(ARG ${ARGV})
|
| SET_PROPERTY(GLOBAL APPEND PROPERTY FORTE_INCLUDE_DIRECTORIES ${ARG})
|
| ENDFOREACH(ARG)
|
| ENDFUNCTION(forte_add_include_directories)
|
|
|
| FUNCTION(forte_add_include_system_directories) #avoid warnings on included folders
|
| FOREACH(ARG ${ARGV})
|
| SET_PROPERTY(GLOBAL APPEND PROPERTY FORTE_INCLUDE_SYSTEM_DIRECTORIES ${ARG})
|
| ENDFOREACH(ARG)
|
| ENDFUNCTION(forte_add_include_system_directories)
|
|
|
| FUNCTION(forte_remove_sourcefile_h)
|
| GET_PROPERTY(SOURCE_H GLOBAL PROPERTY FORTE_SOURCE_H)
|
| GET_PROPERTY(SOURCE_H_GROUP GLOBAL PROPERTY FORTE_SOURCE_H_GROUP)
|
| FOREACH(ARG ${ARGV})
|
| LIST(LENGTH SOURCE_H LIST_LEN)
|
| MATH(EXPR LIST_LEN ${LIST_LEN}-1)
|
| FOREACH(POS RANGE ${LIST_LEN}-1)
|
| LIST(GET SOURCE_H ${POS} FILENAME)
|
| STRING(REGEX MATCH ".*/${ARG}$" FOUND ${FILENAME})
|
| IF(FOUND)
|
| LIST(REMOVE_AT SOURCE_H ${POS})
|
| LIST(REMOVE_AT SOURCE_H_GROUP ${POS})
|
| BREAK()
|
| ENDIF(FOUND)
|
| ENDFOREACH(POS)
|
| ENDFOREACH(ARG)
|
| SET_PROPERTY(GLOBAL PROPERTY FORTE_SOURCE_H ${SOURCE_H})
|
| SET_PROPERTY(GLOBAL PROPERTY FORTE_SOURCE_H_GROUP ${SOURCE_H_GROUP})
|
| ENDFUNCTION(forte_remove_sourcefile_h)
|
|
|
| FUNCTION(forte_remove_sourcefile_cpp)
|
| GET_PROPERTY(SOURCE_CPP GLOBAL PROPERTY FORTE_SOURCE_CPP)
|
| GET_PROPERTY(SOURCE_CPP_GROUP GLOBAL PROPERTY FORTE_SOURCE_CPP_GROUP)
|
| FOREACH(ARG ${ARGV})
|
| LIST(LENGTH SOURCE_CPP LIST_LEN)
|
| MATH(EXPR LIST_LEN ${LIST_LEN}-1)
|
| FOREACH(POS RANGE ${LIST_LEN}-1)
|
| LIST(GET SOURCE_CPP ${POS} FILENAME)
|
| STRING(REGEX MATCH ".*/${ARG}$" FOUND ${FILENAME})
|
| IF(FOUND)
|
| LIST(REMOVE_AT SOURCE_CPP ${POS})
|
| LIST(REMOVE_AT SOURCE_CPP_GROUP ${POS})
|
| BREAK()
|
| ENDIF(FOUND)
|
| ENDFOREACH(POS)
|
| ENDFOREACH(ARG)
|
| SET_PROPERTY(GLOBAL PROPERTY FORTE_SOURCE_CPP ${SOURCE_CPP})
|
| SET_PROPERTY(GLOBAL PROPERTY FORTE_SOURCE_CPP_GROUP ${SOURCE_CPP_GROUP})
|
| ENDFUNCTION(forte_remove_sourcefile_cpp)
|
|
|
| FUNCTION(forte_replace_sourcefile_h)
|
| FOREACH(ARG ${ARGV})
|
| forte_remove_sourcefile_h(${ARG})
|
| forte_add_sourcefile_h(${ARG})
|
| ENDFOREACH(ARG)
|
| ENDFUNCTION(forte_replace_sourcefile_h)
|
|
|
| FUNCTION(forte_replace_sourcefile_cpp)
|
| FOREACH(ARG ${ARGV})
|
| forte_remove_sourcefile_cpp(${ARG})
|
| forte_add_sourcefile_cpp(${ARG})
|
| ENDFOREACH(ARG)
|
| ENDFUNCTION(forte_replace_sourcefile_cpp)
|
|
|
| FUNCTION(forte_set_timer) #don't append as only one timer can be present
|
| SET_PROPERTY(GLOBAL PROPERTY FORTE_TIMER_CPP ${CMAKE_CURRENT_SOURCE_DIR}/${ARGV}.cpp)
|
| SET_PROPERTY(GLOBAL PROPERTY FORTE_TIMER_H ${CMAKE_CURRENT_SOURCE_DIR}/${ARGV}.h)
|
| ENDFUNCTION(forte_set_timer)
|
|
|
| FUNCTION(forte_add_to_executable_h)
|
| FOREACH(ARG ${ARGV})
|
| SET_PROPERTY(GLOBAL APPEND PROPERTY FORTE_EXECUTABLE_H ${CMAKE_CURRENT_SOURCE_DIR}/${ARG}.h)
|
| ENDFOREACH(ARG)
|
| ENDFUNCTION(forte_add_to_executable_h)
|
|
|
| FUNCTION(forte_add_to_executable_cpp)
|
| FOREACH(ARG ${ARGV})
|
| SET_PROPERTY(GLOBAL APPEND PROPERTY FORTE_EXECUTABLE_CPP ${CMAKE_CURRENT_SOURCE_DIR}/${ARG}.cpp)
|
| ENDFOREACH(ARG)
|
| ENDFUNCTION(forte_add_to_executable_cpp)
|
|
|
| FUNCTION(forte_add_link_directories)
|
| FOREACH(ARG ${ARGV})
|
| SET_PROPERTY(GLOBAL APPEND PROPERTY FORTE_LINK_DIRECTORIES ${ARG})
|
| ENDFOREACH(ARG)
|
| ENDFUNCTION(forte_add_link_directories)
|
|
|
| FUNCTION(forte_add_link_library)
|
| FOREACH(ARG ${ARGV})
|
| set_property(GLOBAL APPEND PROPERTY FORTE_LINK_LIBRARY ${ARG})
|
| ENDFOREACH(ARG)
|
| ENDFUNCTION(forte_add_link_library)
|
|
|
| FUNCTION(forte_add_link_library_beginning)
|
| get_property(LINK_LIBRARY_1 GLOBAL PROPERTY FORTE_LINK_LIBRARY)
|
| set_property(GLOBAL PROPERTY FORTE_LINK_LIBRARY "")
|
| FOREACH(ARG ${ARGV})
|
| set_property(GLOBAL APPEND PROPERTY FORTE_LINK_LIBRARY ${ARG})
|
| ENDFOREACH(ARG)
|
| forte_add_link_library(${LINK_LIBRARY_1})
|
| ENDFUNCTION(forte_add_link_library_beginning)
|
|
|
| FUNCTION(forte_add_definition)
|
| FOREACH(ARG ${ARGV})
|
| set_property(GLOBAL APPEND PROPERTY FORTE_DEFINITION ${ARG})
|
| ENDFOREACH(ARG)
|
| ENDFUNCTION(forte_add_definition)
|
|
|
| FUNCTION(forte_add_link_flags)
|
| FOREACH(ARG ${ARGV})
|
| set_property(GLOBAL APPEND PROPERTY FORTE_LINK_FLAGS ${ARG})
|
| ENDFOREACH(ARG)
|
| ENDFUNCTION(forte_add_link_flags)
|
|
|
| FUNCTION(forte_add_architecture)
|
| FOREACH(ARG ${ARGV})
|
| set_property(GLOBAL APPEND PROPERTY FORTE_ARCHITECTURES ${ARG})
|
| ENDFOREACH(ARG)
|
| ENDFUNCTION(forte_add_architecture)
|
|
|
| MACRO(forte_add_network_layer NAME ONOFF CONFIGNAME CLASSNAME FILENAME DISCRIPTION)
|
| # TODO: parse filename from filename
|
| set(FORTE_COM_${NAME} ${ONOFF} CACHE BOOL "${DISCRIPTION}")
|
| IF(FORTE_COM_${NAME})
|
| FORTE_ADD_SOURCEFILE_HCPP(${FILENAME})
|
| set_property(GLOBAL APPEND PROPERTY FORTE_LAYER_CLASS ${CLASSNAME})
|
| set_property(GLOBAL APPEND PROPERTY FORTE_LAYER_CONFIGNAME ${CONFIGNAME})
|
| set_property(GLOBAL APPEND PROPERTY FORTE_LAYER_FILENAME "${FILENAME}.h")
|
| ENDIF(FORTE_COM_${NAME})
|
| ENDMACRO(forte_add_network_layer)
|
|
|
| MACRO(forte_add_handler CLASSNAME FILENAME)
|
| FORTE_ADD_SOURCEFILE_H(${FILENAME}.h)
|
| set_property(GLOBAL APPEND PROPERTY FORTE_HANDLER_CLASS ${CLASSNAME})
|
| set_property(GLOBAL APPEND PROPERTY FORTE_HANDLER_FILENAME "${FILENAME}.h")
|
| ENDMACRO(forte_add_handler)
|
|
|
| #MACRO(forte_add_module NAME DIRECTORY DISCRIPTION)
|
| # Additional parameters are interpreted as dependencies
|
| MACRO(forte_add_module NAME DISCRIPTION)
|
| set(FORTE_MODULE_${NAME} OFF CACHE BOOL "${DISCRIPTION}")
|
| FOREACH(dependencies ${ARGN})
|
| if(NOT ${dependencies})
|
| return()
|
| endif(NOT ${dependencies})
|
| ENDFOREACH(dependencies)
|
| if(NOT FORTE_MODULE_${NAME})
|
| return()
|
| endif(NOT FORTE_MODULE_${NAME})
|
| ENDMACRO(forte_add_module)
|
|
|
| #MACRO(forte_add_io NAME DIRECTORY DESCRIPTION)
|
| MACRO(forte_add_io NAME DESCRIPTION)
|
| set(FORTE_IO_${NAME} OFF CACHE BOOL "${DESCRIPTION}")
|
| if(NOT FORTE_IO_${NAME})
|
| return()
|
| endif(NOT FORTE_IO_${NAME})
|
| ENDMACRO(forte_add_io)
|
|
|
| FUNCTION(forte_create_modules_file FORTE_MODULE_DIR FORTE_EXTERNAL_MODULE_DIR)
|
| INCLUDE(${FORTE_BUILDSUPPORT_DIRECTORY}/generate_modules_cmake_file.cmake)
|
| ENDFUNCTION(forte_create_modules_file)
|
|
|
| FUNCTION(forte_replacefile_if_changed SOURCE DESTINATION)
|
| execute_process( COMMAND ${CMAKE_COMMAND} -E compare_files ${SOURCE} ${DESTINATION} RESULT_VARIABLE test_not_successful OUTPUT_QUIET ERROR_QUIET )
|
|
|
| IF( test_not_successful)
|
| file(REMOVE ${DESTINATION})
|
| file(RENAME ${SOURCE} ${DESTINATION})
|
| ENDIF( test_not_successful)
|
| ENDFUNCTION(forte_replacefile_if_changed SOURCE DESTINATION)
|
|
|
| FUNCTION(forte_add_extension_file)
|
| FOREACH(ARG ${ARGV})
|
| SET_PROPERTY(GLOBAL APPEND PROPERTY FORTE_EXTENSION_FILES ${ARG})
|
| ENDFOREACH(ARG)
|
| ENDFUNCTION(forte_add_extension_file)
|
|
|
| FUNCTION(forte_add_post_build_command)
|
| FOREACH(ARG ${ARGV})
|
| set_property(GLOBAL APPEND PROPERTY FORTE_POST_BUILD_COMMAND ${ARG})
|
| ENDFOREACH(ARG)
|
| ENDFUNCTION(forte_add_post_build_command)
|
|
|
| ## forte_add_systemtest_hard (test_name bootfile_name timeout)
|
| ## Fails if any error has been logged
|
| FUNCTION(forte_add_systemtest_hard arg1 arg2 arg3)
|
| FILE(TO_NATIVE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/${arg2}" file_str)
|
| STRING(REPLACE "\\" "\\\\" file_str ${file_str})
|
| ADD_TEST(NAME ${arg1} COMMAND $<TARGET_FILE:forte> -f ${file_str})
|
| set_tests_properties (${arg1} PROPERTIES TIMEOUT ${arg3})
|
| SET_TESTS_PROPERTIES(${arg1} PROPERTIES FAIL_REGULAR_EXPRESSION "ERROR: T|==ERROR") #==ERROR is the output when memore leak happens
|
| ENDFUNCTION(forte_add_systemtest_hard)
|
|
|
| ## forte_add_systemtest_soft (test_name bootfile_name timeout)
|
| ## Fails only by TEST_CONDITION FBs. This is for the case when a FB has to be tested in all
|
| ## its cases, and some of the cases produce logging error
|
| FUNCTION(forte_add_systemtest_soft arg1 arg2 arg3)
|
| FILE(TO_NATIVE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/${arg2}" file_str)
|
| STRING(REPLACE "\\" "\\\\" file_str ${file_str})
|
| ADD_TEST(NAME ${arg1} COMMAND $<TARGET_FILE:forte> -f ${file_str})
|
| set_tests_properties (${arg1} PROPERTIES TIMEOUT ${arg3})
|
| SET_TESTS_PROPERTIES(${arg1} PROPERTIES FAIL_REGULAR_EXPRESSION "TEST_CONDITION_FAILED|==ERROR") #==ERROR is the output when memore leak happens
|
| ENDFUNCTION(forte_add_systemtest_soft)
|
|
|
| ## forte_add_2dev_systemtests (test_name bootfile_name1 bootfile_name2 extraArgs1 extraArgs2 timeout)
|
| ## Two fortes are executed
|
| ## The bootfiles are added to the args. The first forte is executed in port 61499 and the second in 61500
|
| ## if extraArgs are empty
|
|
|
| FUNCTION(forte_add_2dev_systemtests test_name bootfile_name1 bootfile_name2 arg1 arg2 timeout isHard)
|
| FILE(TO_NATIVE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/${bootfile_name1}" file_str1)
|
| STRING(REPLACE "\\" "\\\\" file_str1 ${file_str1})
|
|
|
| FILE(TO_NATIVE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/${bootfile_name2}" file_str2)
|
| STRING(REPLACE "\\" "\\\\" file_str2 ${file_str2})
|
|
|
| FILE(TO_NATIVE_PATH "${CMAKE_SOURCE_DIR}/buildsupport/multi_test_2.cmake" scriptFile)
|
| STRING(REPLACE "\\" "\\\\" scriptFile ${scriptFile})
|
|
|
| if (arg1 STREQUAL "")
|
| set(arg1 "-c localhost:61499")
|
| endif()
|
|
|
| if (arg2 STREQUAL "")
|
| set(arg2 "-c localhost:61500")
|
| endif()
|
|
|
|
|
| ADD_TEST(NAME ${test_name} COMMAND ${CMAKE_COMMAND}
|
| -DCMD=$<TARGET_FILE:forte>
|
| -DBOOT1=${file_str1}
|
| -DBOOT2=${file_str2}
|
| -DARG1=${arg1}
|
| -DARG2=${arg2}
|
| -P ${scriptFile})
|
|
|
| set_tests_properties (${test_name} PROPERTIES TIMEOUT ${timeout})
|
|
|
| IF(${isHard})
|
| SET_TESTS_PROPERTIES(${test_name} PROPERTIES FAIL_REGULAR_EXPRESSION "ERROR: T|==ERROR") #==ERROR is the output when memore leak happens
|
| ELSE(${isHard})
|
| SET_TESTS_PROPERTIES(${test_name} PROPERTIES FAIL_REGULAR_EXPRESSION "TEST_CONDITION_FAILED|==ERROR") #==ERROR is the output when memore leak happens
|
| ENDIF(${isHard})
|
| ENDFUNCTION(forte_add_2dev_systemtests)
|
|
|
| FUNCTION(forte_add_env_file test file)
|
| FILE(TO_NATIVE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/${file}" file_str)
|
| STRING(REPLACE "\\" "\\\\" file_str ${file_str})
|
| set_tests_properties(${test} PROPERTIES ENVIRONMENT "FORTE_BOOT_FILE=${file_str}")
|
| ENDFUNCTION(forte_add_env_file)
|
|
|
| FUNCTION(forte_add_custom_configuration arg1)
|
| SET_PROPERTY(GLOBAL APPEND_STRING PROPERTY FORTE_CUSTOM_CONFIGURATIONS_GLOBAL "${arg1}" \n\n)
|
| ENDFUNCTION(forte_add_custom_configuration)
|
|
|
| INCLUDE(${FORTE_BUILDSUPPORT_DIRECTORY}/opcua.cmake)
|