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

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

ifneq (,$(filter nhdp,$(USEMODULE)))
  USEMODULE += conn_udp
  USEMODULE += vtimer
  USEMODULE += oonf_rfc5444
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 schedstatistics,$(USEMODULE)))
  USEMODULE += xtimer
endif

ifneq (,$(filter gnrc_netif_default,$(USEMODULE)))
  USEMODULE += gnrc_netif
endif

ifneq (,$(filter netdev2_tap,$(USEMODULE)))
  USEMODULE += netif
endif

ifneq (,$(filter gnrc_zep,$(USEMODULE)))
  USEMODULE += hashes
  USEMODULE += ieee802154
  USEMODULE += gnrc_udp
  USEMODULE += random
  USEMODULE += vtimer
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 += vtimer
endif

ifneq (,$(filter gnrc_sixlowpan_iphc,$(USEMODULE)))
  USEMODULE += gnrc_sixlowpan
  USEMODULE += gnrc_sixlowpan_ctx
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 += vtimer
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 += vtimer
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 += vtimer
endif

ifneq (,$(filter gnrc_ndp_router,$(USEMODULE)))
  USEMODULE += gnrc_ndp_node
  USEMODULE += random
  USEMODULE += vtimer
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)))
  USEMODULE += gnrc_icmpv6
  USEMODULE += random
  USEMODULE += timex
  USEMODULE += vtimer
endif

ifneq (,$(filter gnrc_icmpv6_echo,$(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 += ipv6_ext
  USEMODULE += gnrc_ipv6
endif

ifneq (,$(filter gnrc_ipv6_whitelist,$(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
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 += vtimer
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 += vtimer
endif

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

ifneq (,$(filter newlib,$(USEMODULE)))
  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 += timex
  USEMODULE += vtimer
endif

ifneq (,$(filter posix_semaphore,$(USEMODULE)))
  USEMODULE += sem
  USEMODULE += vtimer
endif

ifneq (,$(filter sem,$(USEMODULE)))
  USEMODULE += vtimer
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 += vtimer
  USEMODULE += timex
  FEATURES_REQUIRED += cpp
endif

ifneq (,$(filter gnrc_netdev_eth,$(USEMODULE)))
  USEMODULE += gnrc_pktbuf
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
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 xtimer,$(USEMODULE)))
    FEATURES_REQUIRED += periph_timer
endif