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

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

ifneq (,$(filter ccn-lite,$(USEPKG)))
    export CFLAGS += -DCCNL_RIOT
endif

ifneq (,$(filter csma_sender,$(USEMODULE)))
  USEMODULE += random
  USEMODULE += xtimer
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 netdev2_ieee802154,$(USEMODULE)))
  USEMODULE += ieee802154
endif

ifneq (,$(filter gnrc_uhcpc,$(USEMODULE)))
    USEMODULE += uhcpc
    USEMODULE += gnrc_conn_udp
    USEMODULE += fmt
endif

ifneq (,$(filter nordic_softdevice_ble,$(USEPKG)))
    USEMODULE += softdevice_handler
    USEMODULE += ble_common
    USEMODULE += ble_6lowpan
    USEMODULE += gnrc_sixlowpan
    USEMODULE += gnrc_sixlowpan_iphc
    USEMODULE += gnrc_ipv6_default
    USEMODULE += gnrc_netdev2
    USEMODULE += gnrc_ipv6_netif
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 += xtimer
endif

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

ifneq (,$(filter gnrc_rpl_p2p,$(USEMODULE)))
  USEMODULE += gnrc_rpl
endif

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

ifneq (,$(filter trickle,$(USEMODULE)))
  USEMODULE += random
  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
  ifneq (,$(filter lwip%, $(USEMODULE)))
    USEMODULE += lwip_sixlowpan
  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
  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 emb6_conn_udp,$(USEMODULE)))
  USEMODULE += emb6_sock
endif

ifneq (,$(filter emb6_%,$(USEMODULE)))
  USEMODULE += emb6
endif

ifneq (,$(filter emb6,$(USEMODULE)))
  USEPKG += emb6
  USEMODULE += emb6_bsp
  USEMODULE += emb6_common
  USEMODULE += emb6_contrib
  USEMODULE += emb6_ipv6
  USEMODULE += emb6_ipv6_multicast
  USEMODULE += emb6_llsec
  USEMODULE += emb6_mac
  USEMODULE += emb6_netdev2
  USEMODULE += emb6_rpl
  USEMODULE += emb6_sicslowpan
  USEMODULE += emb6_utils
endif

ifneq (,$(filter lwip_sixlowpan,$(USEMODULE)))
  USEMODULE += lwip_ipv6_autoconfig
endif

ifneq (,$(filter lwip_ipv6_autoconfig lwip_ipv6_mld,$(USEMODULE)))
  USEMODULE += lwip_ipv6
endif

ifneq (,$(filter lwip_ipv6,$(USEMODULE)))
  USEMODULE += random
endif

ifneq (,$(filter lwip_udplite,$(USEMODULE)))
  USEMODULE += lwip_udp
endif

ifneq (,$(filter lwip_conn_%,$(USEMODULE)))
  USEMODULE += lwip_conn
endif

ifneq (,$(filter lwip_conn_ip,$(USEMODULE)))
  USEMODULE += lwip_raw
endif

ifneq (,$(filter lwip_conn_udp,$(USEMODULE)))
  USEMODULE += lwip_udp
endif

ifneq (,$(filter lwip_%,$(USEMODULE)))
  USEMODULE += lwip
endif

ifneq (,$(filter lwip,$(USEMODULE)))
  USEPKG += lwip
  USEMODULE += lwip_api
  USEMODULE += lwip_contrib
  USEMODULE += lwip_core
  USEMODULE += lwip_netif
  ifeq (,$(filter lwip_ipv4 lwip_ipv6,$(USEMODULE)))
    USEMODULE += lwip_ipv4
  endif
  ifeq (,$(filter lwip_tcp lwip_udp lwip_udplite,$(USEMODULE)))
    USEMODULE += lwip_raw
  endif
endif

ifneq (,$(filter lwip_ppp,$(USEMODULE)))
  USEMODULE += lwip_polarssl
endif

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

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


ifneq (,$(filter libfixmath-unittests,$(USEMODULE)))
  USEPKG += libfixmath
  USEMODULE += 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 netstats_%, $(USEMODULE)))
  USEMODULE += netstats
endif

ifneq (,$(filter pthread,$(USEMODULE)))
    USEMODULE += xtimer
    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 random,$(USEMODULE)))
    # select default prng
    ifeq (,$(filter prng_%,$(USEMODULE)))
        USEMODULE += prng_tinymt32
    endif

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