#function(switch_expr INPUT OUTPUT) # list(LENGTH ARGN N) # math(EXPR EVEN "${N} % 2") # if (NOT EVEN EQUAL 0) # message(FATAL_ERROR "Expr must be a list of string pairs, ${EVEN}") # endif () # math(EXPR N_ "${N}-1") # foreach (idx RANGE 0 ${N_} 2) # math(EXPR KEY_IDX "${idx} + 0") # math(EXPR VALUE_IDX "${idx} + 1") # list(GET ARGN ${KEY_IDX} KEY) # list(GET ARGN ${VALUE_IDX} VALUE) # if (${KEY} STREQUAL ${INPUT}) # set(${OUTPUT} ${VALUE} PARENT_SCOPE) # break() # endif () # endforeach () #endfunction() # macro(wipe_gcc_style_optimisation_flags VAR) string(REGEX REPLACE "([\\/\\-]O.)" "" ${VAR} ${${VAR}}) endmacro() macro(register_link_library) list(APPEND LINK_LIBRARIES ${ARGN}) endmacro() macro(register_append_cxx_flags CONFIG) if ("${CONFIG}" STREQUAL "RELEASE" OR "${CONFIG}" STREQUAL "ANY") list(APPEND DEFAULT_RELEASE_FLAGS ${ARGN}) elseif ("${CONFIG}" STREQUAL "DEBUG" OR "${CONFIG}" STREQUAL "ANY") list(APPEND DEFAULT_DEBUG_FLAGS ${ARGN}) else () message(FATAL_ERROR "register_flags supports only RELEASE, DEBUG, or ANY for all configs, got `${CONFIG}`") endif () endmacro() macro(register_append_link_flags) list(APPEND LINK_FLAGS ${ARGN}) endmacro() macro(register_append_compiler_and_arch_specific_cxx_flags PREFIX CXX ARCH) string(TOUPPER ${CXX} _CXX) string(TOUPPER ${ARCH} _ARCH) set(_CXX_ARCH_SPECIFIC_FLAGS "${${PREFIX}_${_CXX}_${_ARCH}}") if (_CXX_ARCH_SPECIFIC_FLAGS) register_append_cxx_flags(ANY ${_CXX_ARCH_SPECIFIC_FLAGS}) endif () set(_CXX_ARCH_SPECIFIC_FLAGS "${${PREFIX}_${_CXX}}") if (_CXX_ARCH_SPECIFIC_FLAGS) register_append_cxx_flags(ANY ${_CXX_ARCH_SPECIFIC_FLAGS}) endif () endmacro() macro(register_definitions) list(APPEND IMPL_DEFINITIONS ${ARGN}) endmacro() macro(register_flag_required NAME DESCRIPTION) list(APPEND CUSTOM_FLAGS_TRIPLE "${NAME}" "${DESCRIPTION}" ON "") endmacro() macro(register_flag_optional NAME DESCRIPTION DEFAULT) list(APPEND CUSTOM_FLAGS_TRIPLE "${NAME}" "${DESCRIPTION}" OFF "${DEFAULT}") endmacro() function(registered_flags_action ACTION OUT) list(LENGTH CUSTOM_FLAGS_TRIPLE NFLAGS) if (NOT NFLAGS EQUAL "0") if (${ACTION} STREQUAL "print") set(LINE "Supported flags:\n\n") elseif (${ACTION} STREQUAL "check") set(LINE "Picked up model specific flags for this build:\n\n") endif () math(EXPR NFLAGS "${NFLAGS}-1") foreach (idx RANGE 0 ${NFLAGS} 4) math(EXPR NAME_IDX "${idx} + 0") math(EXPR DESCRIPTION_IDX "${idx} + 1") math(EXPR REQUIRED_IDX "${idx} + 2") math(EXPR DEFAULT_VALUE_IDX "${idx} + 3") list(GET CUSTOM_FLAGS_TRIPLE ${NAME_IDX} NAME) list(GET CUSTOM_FLAGS_TRIPLE ${DESCRIPTION_IDX} DESCRIPTION) list(GET CUSTOM_FLAGS_TRIPLE ${REQUIRED_IDX} REQUIRED) list(GET CUSTOM_FLAGS_TRIPLE ${DEFAULT_VALUE_IDX} DEFAULT_VALUE) if (${ACTION} STREQUAL "print") if (${REQUIRED}) set(DEFAULT_VALUE "(required)") else () set(DEFAULT_VALUE "(optional, default=${DEFAULT_VALUE})") endif () set(LINE "${LINE} ${NAME} ${DEFAULT_VALUE}: ${DESCRIPTION}\n") elseif (${ACTION} STREQUAL "check") if (${REQUIRED}) # required flag if (NOT DEFINED ${NAME}) message(FATAL_ERROR "`${NAME}` is not set! (${DESCRIPTION})") endif () else () # optional flag with default if (NOT DEFINED ${NAME}) set(${NAME} "${DEFAULT_VALUE}" PARENT_SCOPE) # setting PARENT_SCOPE does not affect local scope set(${NAME} "${DEFAULT_VALUE}") endif () endif () set(LINE "${LINE} ${NAME} = `${${NAME}}`\n") else () message(FATAL_ERROR "action `${ACTION}` not supported") endif () endforeach () endif () set(${OUT} "${LINE}" PARENT_SCOPE) endfunction() macro(register_model NAME PREPROCESSOR_NAME) string(TOUPPER ${NAME} MODEL_UPPER) list(APPEND REGISTERED_MODELS "${NAME}") list(APPEND IMPL_${MODEL_UPPER}_SOURCES "${ARGN}") list(APPEND IMPL_${MODEL_UPPER}_DEFINITIONS "${PREPROCESSOR_NAME}") endmacro() macro(load_model MODEL) string(TOUPPER "${MODEL}" MODEL_UPPER) if ("${MODEL_UPPER}" IN_LIST REGISTERED_MODELS) set(MODEL_FILE ${CMAKE_CURRENT_SOURCE_DIR}/${MODEL_UPPER}.cmake) if (NOT EXISTS ${MODEL_FILE}) message(FATAL_ERROR "${MODEL_FILE} not found, perhaps it needs to be implemented?") endif () include(${MODEL_FILE}) list(APPEND IMPL_SOURCES ${IMPL_${MODEL_UPPER}_SOURCES}) list(APPEND IMPL_DEFINITIONS ${IMPL_${MODEL_UPPER}_DEFINITIONS}) string(TOLOWER ${MODEL} MODEL_LOWER) set(EXE_NAME ${MODEL_LOWER}-stream) else () message(FATAL_ERROR "Unsupported model: ${MODEL}") endif () endmacro()