# pull dependencies from drivers
include $(RIOTBASE)/drivers/Makefile.dep

ifneq (,$(filter libcoap,$(USEPKG)))
    USEMODULE += posix_sockets
    USEMODULE += gnrc_conn_udp
endif

ifneq (,$(filter nhdp,$(USEMODULE)))
  USEMODULE += conn_udp
  USEMODULE += xtimer
  USEMODULE += oonf_rfc5444
endif

ifneq (,$(filter gnrc_netdev_default,$(USEMODULE)))
  USEMODULE += gnrc_netif
  USEMODULE += netdev_default
endif

ifneq (,$(filter cc110x,$(USEMODULE)))
  ifneq (,$(filter gnrc_netdev_default,$(USEMODULE)))
    USEMODULE += gnrc_cc110x
	# XXX: this can be modelled as a dependency for gnrc_netdev_default as soon
	# as all drivers are ported to netdev2
	USEMODULE += gnrc_netdev2
  endif
endif

ifneq (,$(filter kw2xrf,$(USEMODULE)))
  ifneq (,$(filter gnrc_netdev_default,$(USEMODULE)))
    USEMODULE += gnrc_nomac
  endif
endif

ifneq (,$(filter at86rf2%,$(USEMODULE)))
  USEMODULE += netdev2_ieee802154
  ifneq (,$(filter gnrc_netdev_default,$(USEMODULE)))
	# XXX: this can be modelled as a dependency for gnrc_netdev_default as soon
	# as all drivers are ported to netdev2
    USEMODULE += gnrc_netdev2
  endif
endif

ifneq (,$(filter netdev2_ieee802154,$(USEMODULE)))
  USEMODULE += ieee802154
endif

ifneq (,$(filter gnrc_%,$(filter-out gnrc_netapi gnrc_netreg gnrc_netif% gnrc_pktbuf,$(USEMODULE))))
  USEMODULE += gnrc
endif

ifneq (,$(filter gnrc_conn_%,$(USEMODULE)))
  USEMODULE += gnrc_conn
endif

ifneq (,$(filter gnrc_conn_udp,$(USEMODULE)))
  USEMODULE += gnrc_udp
endif

ifneq (,$(filter netdev2_tap,$(USEMODULE)))
  USEMODULE += netif
  USEMODULE += netdev2_eth
  ifneq (,$(filter gnrc_%,$(USEMODULE)))
    USEMODULE += gnrc_netdev2
  endif
endif

ifneq (,$(filter gnrc_zep,$(USEMODULE)))
  USEMODULE += hashes
  USEMODULE += ieee802154
  USEMODULE += gnrc_udp
  USEMODULE += random
  USEMODULE += vtimer
endif

ifneq (,$(filter gnrc_tftp,$(USEMODULE)))
  USEMODULE += gnrc_udp
  USEMODULE += xtimer
endif

ifneq (,$(filter gnrc_rpl,$(USEMODULE)))
  USEMODULE += fib
  USEMODULE += gnrc_ipv6_router_default
  USEMODULE += trickle
  USEMODULE += xtimer
endif

ifneq (,$(filter trickle,$(USEMODULE)))
  USEMODULE += xtimer
endif

ifneq (,$(filter ieee802154,$(USEMODULE)))
  ifneq (,$(filter gnrc_ipv6, $(USEMODULE)))
    USEMODULE += gnrc_sixlowpan
  endif
  ifneq (,$(filter gnrc_ipv6_router, $(USEMODULE)))
    USEMODULE += gnrc_sixlowpan_router
  endif
  ifneq (,$(filter gnrc_ipv6_default, $(USEMODULE)))
    USEMODULE += gnrc_sixlowpan_default
  endif
  ifneq (,$(filter gnrc_ipv6_router_default, $(USEMODULE)))
    USEMODULE += gnrc_sixlowpan_router_default
  endif
endif

ifneq (,$(filter gnrc_sixlowpan_default,$(USEMODULE)))
  USEMODULE += gnrc_ipv6_default
  USEMODULE += gnrc_sixlowpan
  USEMODULE += gnrc_sixlowpan_nd
  USEMODULE += gnrc_sixlowpan_frag
  USEMODULE += gnrc_sixlowpan_iphc
endif

ifneq (,$(filter gnrc_sixlowpan_router_default,$(USEMODULE)))
  USEMODULE += gnrc_ipv6_router_default
  USEMODULE += gnrc_sixlowpan_router
  USEMODULE += gnrc_sixlowpan_frag
  USEMODULE += gnrc_sixlowpan_iphc
endif

ifneq (,$(filter gnrc_sixlowpan_border_router_default,$(USEMODULE)))
  USEMODULE += gnrc_ipv6_router_default
  USEMODULE += gnrc_sixlowpan_nd_border_router
  USEMODULE += gnrc_sixlowpan_router
  USEMODULE += gnrc_sixlowpan_frag
  USEMODULE += gnrc_sixlowpan_iphc
endif

ifneq (,$(filter gnrc_sixlowpan_router,$(USEMODULE)))
  USEMODULE += gnrc_sixlowpan_nd_router
endif

ifneq (,$(filter gnrc_sixlowpan_frag,$(USEMODULE)))
  USEMODULE += gnrc_sixlowpan
  USEMODULE += xtimer
endif

ifneq (,$(filter gnrc_sixlowpan_iphc,$(USEMODULE)))
  USEMODULE += gnrc_sixlowpan
  USEMODULE += gnrc_sixlowpan_ctx
  # NHC is broken, so disable it for now. See #4544 and #4462.
  #USEMODULE += gnrc_sixlowpan_iphc_nhc
endif

ifneq (,$(filter gnrc_sixlowpan,$(USEMODULE)))
  USEMODULE += gnrc_ipv6
  USEMODULE += gnrc_sixlowpan_netif
  USEMODULE += sixlowpan
endif

ifneq (,$(filter gnrc_sixlowpan_ctx,$(USEMODULE)))
  USEMODULE += ipv6_addr
  USEMODULE += xtimer
endif

ifneq (,$(filter gnrc_sixlowpan_nd_border_router,$(USEMODULE)))
  USEMODULE += gnrc_sixlowpan_nd_router
endif

ifneq (,$(filter gnrc_sixlowpan_nd_router,$(USEMODULE)))
  USEMODULE += gnrc_sixlowpan_nd
endif

ifneq (,$(filter gnrc_sixlowpan_nd,$(USEMODULE)))
  USEMODULE += gnrc_ndp
  USEMODULE += gnrc_ndp_internal
  USEMODULE += gnrc_sixlowpan_ctx
  USEMODULE += random
  USEMODULE += xtimer
endif

ifneq (,$(filter gnrc_ipv6_default,$(USEMODULE)))
  USEMODULE += gnrc_ipv6
  USEMODULE += gnrc_icmpv6
  ifeq (1,$(GNRC_NETIF_NUMOF))
    ifeq (,$(filter gnrc_sixlowpan_nd,$(USEMODULE)))
      USEMODULE += gnrc_ndp_host
    endif
  else
    USEMODULE += gnrc_ndp_host
  endif
endif

ifneq (,$(filter gnrc_ipv6_router_default,$(USEMODULE)))
  USEMODULE += gnrc_ipv6_router
  USEMODULE += gnrc_icmpv6
  ifeq (1,$(GNRC_NETIF_NUMOF))
    ifeq (,$(filter gnrc_sixlowpan_nd_router,$(USEMODULE)))
      USEMODULE += gnrc_ndp_router
    endif
  else
    USEMODULE += gnrc_ndp_router
  endif
endif

ifneq (,$(filter gnrc_ndp_host,$(USEMODULE)))
  USEMODULE += gnrc_ndp_node
  USEMODULE += random
  USEMODULE += xtimer
endif

ifneq (,$(filter gnrc_ndp_router,$(USEMODULE)))
  USEMODULE += gnrc_ndp_node
  USEMODULE += random
  USEMODULE += xtimer
endif

ifneq (,$(filter gnrc_ndp_node,$(USEMODULE)))
  USEMODULE += gnrc_ndp_internal
endif

ifneq (,$(filter gnrc_ndp_%,$(USEMODULE)))
  USEMODULE += gnrc_ndp
endif

ifneq (,$(filter gnrc_ndp,$(USEMODULE)))
  ifneq (,$(filter gnrc_sixlowpan,$(USEMODULE)))
    USEMODULE += gnrc_sixlowpan_nd
  else
    USEMODULE += gnrc_ndp_node
  endif
  USEMODULE += gnrc_ndp_internal
  USEMODULE += gnrc_icmpv6
  USEMODULE += random
  USEMODULE += xtimer
endif

ifneq (,$(filter gnrc_icmpv6_echo,$(USEMODULE)))
  USEMODULE += gnrc_icmpv6
endif

ifneq (,$(filter gnrc_icmpv6_error,$(USEMODULE)))
  USEMODULE += gnrc_icmpv6
endif

ifneq (,$(filter gnrc_icmpv6,$(USEMODULE)))
  USEMODULE += inet_csum
  USEMODULE += gnrc_ipv6
endif

ifneq (,$(filter gnrc_rpl_srh,$(USEMODULE)))
  USEMODULE += ipv6_ext_rh
endif

ifneq (,$(filter ipv6_ext_rh,$(USEMODULE)))
  USEMODULE += ipv6_ext
endif

ifneq (,$(filter gnrc_ipv6_ext,$(USEMODULE)))
  USEMODULE += gnrc_ipv6
endif

ifneq (,$(filter gnrc_ipv6_whitelist,$(USEMODULE)))
  USEMODULE += ipv6_addr
endif

ifneq (,$(filter gnrc_ipv6_blacklist,$(USEMODULE)))
  USEMODULE += ipv6_addr
endif

ifneq (,$(filter gnrc_ipv6_router,$(USEMODULE)))
  USEMODULE += gnrc_ipv6
endif

ifneq (,$(filter gnrc_ipv6,$(USEMODULE)))
  USEMODULE += inet_csum
  USEMODULE += ipv6_addr
  USEMODULE += gnrc_ipv6_hdr
  USEMODULE += gnrc_ipv6_nc
  USEMODULE += gnrc_ipv6_netif
endif

ifneq (,$(filter gnrc_ipv6_hdr,$(USEMODULE)))
  USEMODULE += ipv6_hdr
  USEMODULE += gnrc_pktbuf
endif

ifneq (,$(filter sixlowpan,$(USEMODULE)))
  USEMODULE += ipv6_hdr
endif

ifneq (,$(filter ipv6_hdr,$(USEMODULE)))
  USEMODULE += inet_csum
  USEMODULE += ipv6_addr
endif

ifneq (,$(filter gnrc_ipv6_nc,$(USEMODULE)))
  USEMODULE += ipv6_addr
endif

ifneq (,$(filter gnrc_ipv6_netif,$(USEMODULE)))
  USEMODULE += ipv6_addr
  USEMODULE += gnrc_netif
  USEMODULE += bitfield
  USEMODULE += xtimer
endif

ifneq (,$(filter gnrc_udp,$(USEMODULE)))
  USEMODULE += inet_csum
  USEMODULE += udp
endif

ifneq (,$(filter gnrc_nettest,$(USEMODULE)))
  USEMODULE += gnrc_netapi
  USEMODULE += gnrc_netreg
  USEMODULE += gnrc_netif
  USEMODULE += gnrc_pktbuf
  USEMODULE += xtimer
endif

ifneq (,$(filter gnrc_pktdump,$(USEMODULE)))
  USEMODULE += gnrc_pktbuf
  USEMODULE += od
endif

ifneq (,$(filter newlib_nano,$(USEMODULE)))
  USEMODULE += newlib
endif

ifneq (,$(filter newlib,$(USEMODULE)))
  # allow custom newlib syscalls implementations by adding
  # newlib_syscalls_XXX to USEMODULE
  ifeq (,$(filter newlib_syscalls_%,$(USEMODULE)))
    USEMODULE += newlib_syscalls_default
  endif
  USEMODULE += uart_stdio
endif

ifneq (,$(filter posix_sockets,$(USEMODULE)))
  USEMODULE += posix
  USEMODULE += random
endif

ifneq (,$(filter uart_stdio,$(USEMODULE)))
  USEMODULE += tsrb
endif

ifneq (,$(filter posix,$(USEMODULE)))
  USEMODULE += xtimer
endif

ifneq (,$(filter posix_semaphore,$(USEMODULE)))
  USEMODULE += sema
  USEMODULE += xtimer
endif

ifneq (,$(filter sema,$(USEMODULE)))
  USEMODULE += xtimer
endif

ifneq (,$(filter vtimer,$(USEMODULE)))
  USEMODULE += xtimer
  USEMODULE += timex
endif

ifneq (,$(filter libfixmath-unittests,$(USEMODULE)))
  USEPKG += libfixmath
endif

ifneq (,$(filter fib,$(USEMODULE)))
  USEMODULE += universal_address
  USEMODULE += xtimer
endif

ifneq (,$(filter oonf_rfc5444,$(USEMODULE)))
  USEMODULE += oonf_common
endif

ifneq (,$(filter oonf_common,$(USEMODULE)))
  USEPKG += oonf_api
  USEMODULE += posix_sockets
endif

ifneq (,$(filter %_conn_ip,$(USEMODULE)))
  USEMODULE += conn_ip
endif

ifneq (,$(filter %_conn_tcp,$(USEMODULE)))
  USEMODULE += conn_tcp
endif

ifneq (,$(filter %_conn_udp,$(USEMODULE)))
  USEMODULE += conn_udp
endif

ifneq (,$(filter conn_%,$(USEMODULE)))
  USEMODULE += conn
endif

# if any log_* is used, also use LOG pseudomodule
ifneq (,$(filter log_%,$(USEMODULE)))
  USEMODULE += log
endif

ifneq (,$(filter cpp11-compat,$(USEMODULE)))
  USEMODULE += xtimer
  USEMODULE += timex
  FEATURES_REQUIRED += cpp
endif

ifneq (,$(filter gnrc,$(USEMODULE)))
  USEMODULE += gnrc_netapi
  USEMODULE += gnrc_netreg
  USEMODULE += gnrc_netif
  USEMODULE += gnrc_netif_hdr
  USEMODULE += gnrc_pktbuf
endif

ifneq (,$(filter gnrc_pktbuf, $(USEMODULE)))
  ifeq (,$(filter gnrc_pktbuf_%, $(USEMODULE)))
    USEMODULE += gnrc_pktbuf_static
  endif
  USEMODULE += gnrc_pkt
endif

ifneq (,$(filter gnrc_pktbuf_%, $(USEMODULE)))
  USEMODULE += gnrc_pktbuf # make MODULE_GNRC_PKTBUF macro available for all implementations
endif

ifneq (,$(filter gnrc_netdev2,$(USEMODULE)))
  USEMODULE += netopt
endif

ifneq (,$(filter pthread,$(USEMODULE)))
    USEMODULE += xtimer
    USEMODULE += vtimer
    USEMODULE += timex
endif

ifneq (,$(filter schedstatistics,$(USEMODULE)))
    USEMODULE += xtimer
endif

ifneq (,$(filter arduino,$(USEMODULE)))
    FEATURES_REQUIRED += arduino
    FEATURES_REQUIRED += cpp
    USEMODULE += xtimer
endif

ifneq (,$(filter xtimer,$(USEMODULE)))
    FEATURES_REQUIRED += periph_timer
endif

ifneq (,$(filter saul_reg,$(USEMODULE)))
  USEMODULE += saul
endif

ifneq (,$(filter saul_default,$(USEMODULE)))
  USEMODULE += saul
endif

ifneq (,$(filter saul,$(USEMODULE)))
  USEMODULE += phydat
endif

ifneq (,$(filter phydat,$(USEMODULE)))
  USEMODULE += fmt
endif

ifneq (,$(filter ethos,$(USEMODULE)))
    USEMODULE += netdev2_eth
endif

ifneq (,$(filter random,$(USEMODULE)))
    # select default prng
    ifeq (,$(filter prng_%,$(USEMODULE)))
        USEMODULE += prng_tinymt32
    endif

    ifneq (,$(filter prng_tinymt32,$(USEMODULE)))
        USEMODULE += tinymt32
    endif
endif