# config.mk - generated from ansible/roles/genconfig/templates/config.mk.j2
# ** DO NOT EDIT THIS FILE MANUALLY! **
# Edit the Pod Config (or Scenario) and rerun `make config` to regenerate it

# Scenario specific config
{% if vagrant_vms is defined %}
VAGRANT_VMS             = {{ vagrant_vms | join(' ') }}
{% endif %}
{% if headnode is defined %}
HEADNODE                = {{ headnode }}
{% endif %}
{% if buildnode is defined %}
BUILDNODE               = {{ buildnode }}
{% endif %}
{% if deploy_docker_tag is defined %}
DEPLOY_DOCKER_TAG       = {{ deploy_docker_tag }}
{% endif %}
{% if config_cord_profile_dir is defined %}
CONFIG_CORD_PROFILE_DIR = {{ config_cord_profile_dir }}
{% endif %}

# Targets and prerequisties
{% if build_targets is defined %}
BUILD_TARGETS           = $(M)/{{ build_targets | join(" $(M)/") }}
{% endif %}
{% if vagrant_up_prereqs is defined %}
VAGRANT_UP_PREREQS      = $(M)/{{ vagrant_up_prereqs | join(" $(M)/") }}
{% endif %}
{% if cord_config_prereqs is defined %}
CORD_CONFIG_PREREQS     = $(M)/{{ cord_config_prereqs | join(" $(M)/") }}
{% endif %}
{% if copy_config_prereqs is defined %}
COPY_CONFIG_PREREQS     = $(M)/{{ copy_config_prereqs | join(" $(M)/") }}
{% endif %}
{% if prep_buildnode_prereqs is defined %}
PREP_BUILDNODE_PREREQS  = $(M)/{{ prep_buildnode_prereqs | join(" $(M)/") }}
{% endif %}
{% if prep_headnode_prereqs is defined %}
PREP_HEADNODE_PREREQS   = $(M)/{{ prep_headnode_prereqs | join(" $(M)/") }}
{% endif %}
{% if start_xos_prereqs is defined %}
START_XOS_PREREQS       = $(M)/{{ start_xos_prereqs | join(" $(M)/") }}
{% endif %}
{% if deploy_onos_prereqs is defined %}
DEPLOY_ONOS_PREREQS     = $(M)/{{ deploy_onos_prereqs | join(" $(M)/") }}
{% endif %}

