blob: c568974346ec7541614ee0a0715038bc0dac5dad [file] [log] [blame]
#*******************************************************************************
# Copyright (c) 2012 Profactor 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 - initial API and implementation and/or initial documentation
# *******************************************************************************/
# Just the File name
#GET_FILENAME_COMPONENT(FBLIB_FILE_WO_PATH ${FBLIB_FILE} NAME_WE)
STRING(REGEX REPLACE ".*/" "" FBLIB_FILE_WO_PATH ${FBLIB_FILE})
STRING(REGEX REPLACE "\\.cpp" ".h" FBLIB_FILE_WO_PATH_H ${FBLIB_FILE_WO_PATH})
STRING(REGEX REPLACE "\\." "_gen." FBLIB_FILE_NAME ${FBLIB_FILE_WO_PATH})
STRING(REGEX MATCH ".*stringlist\\.(cpp|h).*" REGEX_STRINGS ${FBLIB_FILE})
IF(NOT REGEX_STRINGS)
STRING(REGEX MATCH ".*forteinit\\.(cpp|h).*" REGEX_STRINGS ${FBLIB_FILE})
ENDIF(NOT REGEX_STRINGS)
IF(NOT REGEX_STRINGS)
FILE(READ ${FBLIB_FILE} FILE_STRING)
STRING(REGEX MATCHALL "g_nStringId([A-Za-z0-9_]*)" REGEX_STRINGS ${FILE_STRING})
STRING(REGEX MATCHALL "g_nStringId([0-9][A-Za-z0-9_]*)" REGEX_STRINGS_ERROR ${FILE_STRING})
# Remove already defined externals, those will be generated #defines in the sourcecode
STRING(REGEX MATCHALL "(DEFINE_GENERIC_FIRMWARE_FB|DEFINE_FIRMWARE_DATATYPE)[(]([A-Za-z0-9_]*)" REGEX_STRINGS_CODE_DEFINED ${FILE_STRING})
IF(REGEX_STRINGS_CODE_DEFINED)
STRING(REGEX REPLACE "(DEFINE_GENERIC_FIRMWARE_FB|DEFINE_FIRMWARE_DATATYPE)[(]" "" REGEX_STRINGS_CODE_DEFINED ${REGEX_STRINGS_CODE_DEFINED})
ENDIF(REGEX_STRINGS_CODE_DEFINED)
# remove template connections
# Do not pars stringlist, as these files will be generated
STRING(REGEX MATCH "conn\\.h" REGEX_TEMPLATE ${FBLIB_FILE_WO_PATH})
IF(NOT REGEX_TEMPLATE)
IF(FORTE_MODIFY_SOURCES_ON_MISSING_GENERATED_INCLUDES)
## CConnection::genConPortIdTemplate to GENERATE_CONNECTION_PORT_ID_2_ARG
STRING(REGEX MATCHALL "CConnection::genConPortIdTemplate<([A-Za-z0-9_,\t ]*)>::value" REGEX_TO_REPLACE "${FILE_STRING}")
IF(REGEX_TO_REPLACE)
FOREACH(ELEMENT ${REGEX_TO_REPLACE})
MESSAGE("${ELEMENT}")
STRING(REPLACE "CConnection::genConPortIdTemplate<" "GENERATE_CONNECTION_PORT_ID_2_ARG(" NEW_ELEMENT "${ELEMENT}")
STRING(REPLACE ">::value" ")" NEW_ELEMENT "${NEW_ELEMENT}")
MESSAGE("${NEW_ELEMENT}")
STRING(REPLACE "${ELEMENT}" "${NEW_ELEMENT}" FILE_STRING "${FILE_STRING}")
FILE(WRITE ${FBLIB_FILE} "${FILE_STRING}")
ENDFOREACH(ELEMENT)
ENDIF(REGEX_TO_REPLACE)
## CConnection::genConPortIdSingleTemplate to GENERATE_CONNECTION_PORT_ID_2_ARG
STRING(REGEX MATCHALL "CConnection::genConPortIdSingleTemplate<([A-Za-z0-9_\t ]*)>::value" REGEX_TO_REPLACE "${FILE_STRING}")
IF(REGEX_TO_REPLACE)
FOREACH(ELEMENT ${REGEX_TO_REPLACE})
MESSAGE("${ELEMENT}")
STRING(REPLACE "CConnection::genConPortIdSingleTemplate<" "GENERATE_CONNECTION_PORT_ID_1_ARG(" NEW_ELEMENT "${ELEMENT}")
STRING(REPLACE ">::value" ")" NEW_ELEMENT "${NEW_ELEMENT}")
MESSAGE("${NEW_ELEMENT}")
STRING(REPLACE "${ELEMENT}" "${NEW_ELEMENT}" FILE_STRING "${FILE_STRING}")
FILE(WRITE ${FBLIB_FILE} "${FILE_STRING}")
ENDFOREACH(ELEMENT)
ENDIF(REGEX_TO_REPLACE)
ENDIF(FORTE_MODIFY_SOURCES_ON_MISSING_GENERATED_INCLUDES)
ENDIF(NOT REGEX_TEMPLATE)
list(REMOVE_DUPLICATES REGEX_STRINGS)
list(REMOVE_ITEM REGEX_STRINGS "g_nStringId${REGEX_STRINGS_CODE_DEFINED}")
# Sanity check for old files
STRING(REGEX MATCHALL "#include \"${FBLIB_FILE_NAME}\"" REGEX_STRINGS_MISSING_INCLUDE ${FILE_STRING})
IF(REGEX_STRINGS)
IF(NOT REGEX_STRINGS_MISSING_INCLUDE)
IF(FORTE_MODIFY_SOURCES_ON_MISSING_GENERATED_INCLUDES)
MESSAGE(WARNING "${FBLIB_FILE}: Missing include statement. #include \"${FBLIB_FILE_NAME}\". Will be autogenerated")
MESSAGE("${FBLIB_FILE_WO_PATH_H}")
STRING(REGEX REPLACE "#include \"${FBLIB_FILE_WO_PATH_H}\"" "#include \"${FBLIB_FILE_WO_PATH_H}\"\n#ifdef FORTE_ENABLE_GENERATED_SOURCE_CPP\n#include \"${FBLIB_FILE_NAME}\"\n#endif" FILE_STRING "${FILE_STRING}")
FILE(WRITE ${FBLIB_FILE} "${FILE_STRING}")
ELSE(FORTE_MODIFY_SOURCES_ON_MISSING_GENERATED_INCLUDES)
MESSAGE(FATAL_ERROR "${FBLIB_FILE}: Missing include statement, add: #include \"${FBLIB_FILE_NAME}\". Not generating stringdict-externals file")
RETURN()
ENDIF(FORTE_MODIFY_SOURCES_ON_MISSING_GENERATED_INCLUDES)
ENDIF(NOT REGEX_STRINGS_MISSING_INCLUDE)
ENDIF(REGEX_STRINGS)
SET(scm_acLocalConstStringBuf "")
FOREACH(STR ${REGEX_STRINGS})
string(LENGTH ${STR} len)
math(EXPR len ${len}-11)
string(SUBSTRING ${STR} 11 ${len} OUTSTR)
list(APPEND scm_acLocalConstStringBuf ${OUTSTR})
ENDFOREACH(STR)
SET(${FBLIB_FILE}_externals "")
list(SORT scm_acLocalConstStringBuf)
list(REMOVE_DUPLICATES scm_acLocalConstStringBuf)
FOREACH(STR IN LISTS scm_acLocalConstStringBuf)
set(${FBLIB_FILE}_externals "${${FBLIB_FILE}_externals} extern const CStringDictionary::TStringId g_nStringId${STR};\n")
ENDFOREACH(STR)
#IF(NOT (${FBLIB_FILE}_externals STREQUAL ""))
#create generated file
CONFIGURE_FILE(${FORTE_SOURCE_DIR}/gen_include.cpp.in ${FORTE_BINARY_DIR}/${FBLIB_FILE_NAME}_new)
# only copy files if different
execute_process( COMMAND ${CMAKE_COMMAND} -E copy_if_different ${FORTE_BINARY_DIR}/${FBLIB_FILE_NAME}_new ${FORTE_BINARY_DIR}/${FBLIB_FILE_NAME} OUTPUT_QUIET ERROR_QUIET )
file(REMOVE ${FORTE_BINARY_DIR}/${FBLIB_FILE_NAME}_new)
#ENDIF(NOT (${FBLIB_FILE}_externals STREQUAL ""))
ENDIF(NOT REGEX_STRINGS)