# PICO_CMAKE_CONFIG: PICO_LWIP_PATH, Path to lwIP. Can be passed to CMake or set in your environment if you do not wish to use the version included with the SDK, type=string, default=<PICO_SDK_PATH>/lib/lwip, group=pico_lwip
if (DEFINED ENV{PICO_LWIP_PATH} AND (NOT PICO_LWIP_PATH))
    set(PICO_LWIP_PATH $ENV{PICO_LWIP_PATH})
    message("Using PICO_LWIP_PATH from environment ('${PICO_LWIP_PATH}')")
endif ()

set(LWIP_TEST_PATH "src/Filelists.cmake")
if (NOT PICO_LWIP_PATH)
    set(PICO_LWIP_PATH ${PICO_SDK_PATH}/lib/lwip)
    if (PICO_CYW43_SUPPORTED AND NOT EXISTS ${PICO_LWIP_PATH}/${LWIP_TEST_PATH})
        message(WARNING "LWIP submodule has not been initialized; Pico W wireless support will be unavailable
#hint: try 'git submodule update --init' from your SDK directory (${PICO_SDK_PATH}).")
    endif()
elseif (NOT EXISTS ${PICO_LWIP_PATH}/${LWIP_TEST_PATH})
    message(WARNING "PICO_LWIP_PATH specified but content not present.")
endif()

if (EXISTS ${PICO_LWIP_PATH}/${LWIP_TEST_PATH})
    message("lwIP available at ${PICO_LWIP_PATH}")

    # argh... wanted to use this, but they dump stuff into the source tree, which breaks parallel builds
    #set(LWIP_DIR ${PICO_LWIP_PATH})
    #include(${PICO_LWIP_PATH}/src/Filelists.cmake)

    pico_register_common_scope_var(PICO_LWIP_PATH)

    # The minimum set of files needed for lwIP.
    pico_add_library(pico_lwip_core NOFLAG)
    target_sources(pico_lwip_core INTERFACE
            ${PICO_LWIP_PATH}/src/core/init.c
            ${PICO_LWIP_PATH}/src/core/def.c
            ${PICO_LWIP_PATH}/src/core/dns.c
            ${PICO_LWIP_PATH}/src/core/inet_chksum.c
            ${PICO_LWIP_PATH}/src/core/ip.c
            ${PICO_LWIP_PATH}/src/core/mem.c
            ${PICO_LWIP_PATH}/src/core/memp.c
            ${PICO_LWIP_PATH}/src/core/netif.c
            ${PICO_LWIP_PATH}/src/core/pbuf.c
            ${PICO_LWIP_PATH}/src/core/raw.c
            ${PICO_LWIP_PATH}/src/core/stats.c
            ${PICO_LWIP_PATH}/src/core/sys.c
            ${PICO_LWIP_PATH}/src/core/altcp.c
            ${PICO_LWIP_PATH}/src/core/altcp_alloc.c
            ${PICO_LWIP_PATH}/src/core/altcp_tcp.c
            ${PICO_LWIP_PATH}/src/core/tcp.c
            ${PICO_LWIP_PATH}/src/core/tcp_in.c
            ${PICO_LWIP_PATH}/src/core/tcp_out.c
            ${PICO_LWIP_PATH}/src/core/timeouts.c
            ${PICO_LWIP_PATH}/src/core/udp.c
            )
    target_include_directories(pico_lwip_core_headers SYSTEM INTERFACE
            ${PICO_LWIP_PATH}/src/include)

    pico_add_library(pico_lwip_core4 NOFLAG)
    target_sources(pico_lwip_core4 INTERFACE
            ${PICO_LWIP_PATH}/src/core/ipv4/autoip.c
            ${PICO_LWIP_PATH}/src/core/ipv4/dhcp.c
            ${PICO_LWIP_PATH}/src/core/ipv4/etharp.c
            ${PICO_LWIP_PATH}/src/core/ipv4/icmp.c
            ${PICO_LWIP_PATH}/src/core/ipv4/igmp.c
            ${PICO_LWIP_PATH}/src/core/ipv4/ip4_frag.c
            ${PICO_LWIP_PATH}/src/core/ipv4/ip4.c
            ${PICO_LWIP_PATH}/src/core/ipv4/ip4_addr.c
            )

    # Doesn't exists in version earlier than 2.1.3
    if (EXISTS ${PICO_LWIP_PATH}/src/core/ipv4/acd.c)
        target_sources(pico_lwip_core4 INTERFACE
            ${PICO_LWIP_PATH}/src/core/ipv4/acd.c
            )
    endif()

    pico_add_library(pico_lwip_core6 NOFLAG)
    target_sources(pico_lwip_core6 INTERFACE
            ${PICO_LWIP_PATH}/src/core/ipv6/dhcp6.c
            ${PICO_LWIP_PATH}/src/core/ipv6/ethip6.c
            ${PICO_LWIP_PATH}/src/core/ipv6/icmp6.c
            ${PICO_LWIP_PATH}/src/core/ipv6/inet6.c
            ${PICO_LWIP_PATH}/src/core/ipv6/ip6.c
            ${PICO_LWIP_PATH}/src/core/ipv6/ip6_addr.c
            ${PICO_LWIP_PATH}/src/core/ipv6/ip6_frag.c
            ${PICO_LWIP_PATH}/src/core/ipv6/mld6.c
            ${PICO_LWIP_PATH}/src/core/ipv6/nd6.c
            )

    # APIFILES: The files which implement the sequential and socket APIs.
    pico_add_library(pico_lwip_api NOFLAG)
    target_sources(pico_lwip_api INTERFACE
            ${PICO_LWIP_PATH}/src/api/api_lib.c
            ${PICO_LWIP_PATH}/src/api/api_msg.c
            ${PICO_LWIP_PATH}/src/api/err.c
            ${PICO_LWIP_PATH}/src/api/if_api.c
            ${PICO_LWIP_PATH}/src/api/netbuf.c
            ${PICO_LWIP_PATH}/src/api/netdb.c
            ${PICO_LWIP_PATH}/src/api/netifapi.c
            ${PICO_LWIP_PATH}/src/api/sockets.c
            ${PICO_LWIP_PATH}/src/api/tcpip.c
            )

    # Files implementing various generic network interface functions
    pico_add_library(pico_lwip_netif NOFLAG)
    target_sources(pico_lwip_netif INTERFACE
            ${PICO_LWIP_PATH}/src/netif/ethernet.c
            ${PICO_LWIP_PATH}/src/netif/bridgeif.c
            ${PICO_LWIP_PATH}/src/netif/bridgeif_fdb.c
            ${PICO_LWIP_PATH}/src/netif/slipif.c
            )

    # 6LoWPAN
    pico_add_library(pico_lwip_sixlowpan NOFLAG)
    target_sources(pico_lwip_sixlowpan INTERFACE
            ${PICO_LWIP_PATH}/src/netif/lowpan6_common.c
            ${PICO_LWIP_PATH}/src/netif/lowpan6.c
            ${PICO_LWIP_PATH}/src/netif/lowpan6_ble.c
            ${PICO_LWIP_PATH}/src/netif/zepif.c
            )

    # PPP
    pico_add_library(pico_lwip_ppp NOFLAG)
    target_sources(pico_lwip_ppp INTERFACE
            ${PICO_LWIP_PATH}/src/netif/ppp/auth.c
            ${PICO_LWIP_PATH}/src/netif/ppp/ccp.c
            ${PICO_LWIP_PATH}/src/netif/ppp/chap-md5.c
            ${PICO_LWIP_PATH}/src/netif/ppp/chap_ms.c
            ${PICO_LWIP_PATH}/src/netif/ppp/chap-new.c
            ${PICO_LWIP_PATH}/src/netif/ppp/demand.c
            ${PICO_LWIP_PATH}/src/netif/ppp/eap.c
            ${PICO_LWIP_PATH}/src/netif/ppp/ecp.c
            ${PICO_LWIP_PATH}/src/netif/ppp/eui64.c
            ${PICO_LWIP_PATH}/src/netif/ppp/fsm.c
            ${PICO_LWIP_PATH}/src/netif/ppp/ipcp.c
            ${PICO_LWIP_PATH}/src/netif/ppp/ipv6cp.c
            ${PICO_LWIP_PATH}/src/netif/ppp/lcp.c
            ${PICO_LWIP_PATH}/src/netif/ppp/magic.c
            ${PICO_LWIP_PATH}/src/netif/ppp/mppe.c
            ${PICO_LWIP_PATH}/src/netif/ppp/multilink.c
            ${PICO_LWIP_PATH}/src/netif/ppp/ppp.c
            ${PICO_LWIP_PATH}/src/netif/ppp/pppapi.c
            ${PICO_LWIP_PATH}/src/netif/ppp/pppcrypt.c
            ${PICO_LWIP_PATH}/src/netif/ppp/pppoe.c
            ${PICO_LWIP_PATH}/src/netif/ppp/pppol2tp.c
            ${PICO_LWIP_PATH}/src/netif/ppp/pppos.c
            ${PICO_LWIP_PATH}/src/netif/ppp/upap.c
            ${PICO_LWIP_PATH}/src/netif/ppp/utils.c
            ${PICO_LWIP_PATH}/src/netif/ppp/vj.c
            ${PICO_LWIP_PATH}/src/netif/ppp/polarssl/arc4.c
            ${PICO_LWIP_PATH}/src/netif/ppp/polarssl/des.c
            ${PICO_LWIP_PATH}/src/netif/ppp/polarssl/md4.c
            ${PICO_LWIP_PATH}/src/netif/ppp/polarssl/md5.c
            ${PICO_LWIP_PATH}/src/netif/ppp/polarssl/sha1.c
            )

    # SNMPv3 agent
    pico_add_library(pico_lwip_snmp NOFLAG)
    target_sources(pico_lwip_snmp INTERFACE
            ${PICO_LWIP_PATH}/src/apps/snmp/snmp_asn1.c
            ${PICO_LWIP_PATH}/src/apps/snmp/snmp_core.c
            ${PICO_LWIP_PATH}/src/apps/snmp/snmp_mib2.c
            ${PICO_LWIP_PATH}/src/apps/snmp/snmp_mib2_icmp.c
            ${PICO_LWIP_PATH}/src/apps/snmp/snmp_mib2_interfaces.c
            ${PICO_LWIP_PATH}/src/apps/snmp/snmp_mib2_ip.c
            ${PICO_LWIP_PATH}/src/apps/snmp/snmp_mib2_snmp.c
            ${PICO_LWIP_PATH}/src/apps/snmp/snmp_mib2_system.c
            ${PICO_LWIP_PATH}/src/apps/snmp/snmp_mib2_tcp.c
            ${PICO_LWIP_PATH}/src/apps/snmp/snmp_mib2_udp.c
            ${PICO_LWIP_PATH}/src/apps/snmp/snmp_snmpv2_framework.c
            ${PICO_LWIP_PATH}/src/apps/snmp/snmp_snmpv2_usm.c
            ${PICO_LWIP_PATH}/src/apps/snmp/snmp_msg.c
            ${PICO_LWIP_PATH}/src/apps/snmp/snmpv3.c
            ${PICO_LWIP_PATH}/src/apps/snmp/snmp_netconn.c
            ${PICO_LWIP_PATH}/src/apps/snmp/snmp_pbuf_stream.c
            ${PICO_LWIP_PATH}/src/apps/snmp/snmp_raw.c
            ${PICO_LWIP_PATH}/src/apps/snmp/snmp_scalar.c
            ${PICO_LWIP_PATH}/src/apps/snmp/snmp_table.c
            ${PICO_LWIP_PATH}/src/apps/snmp/snmp_threadsync.c
            ${PICO_LWIP_PATH}/src/apps/snmp/snmp_traps.c
            )

    # HTTP server + client
    pico_add_library(pico_lwip_http NOFLAG)
    target_sources(pico_lwip_http INTERFACE
            ${PICO_LWIP_PATH}/src/apps/http/altcp_proxyconnect.c
            ${PICO_LWIP_PATH}/src/apps/http/fs.c
            ${PICO_LWIP_PATH}/src/apps/http/http_client.c
            ${PICO_LWIP_PATH}/src/apps/http/httpd.c
            )

    # MAKEFSDATA HTTP server host utility
    pico_add_library(pico_lwip_makefsdata NOFLAG)
    target_sources(pico_lwip_makefsdata INTERFACE
            ${PICO_LWIP_PATH}/src/apps/http/makefsdata/makefsdata.c
            )

    # iperf
    pico_add_library(pico_lwip_iperf NOFLAG)
    target_sources(pico_lwip_iperf INTERFACE
            ${PICO_LWIP_PATH}/src/apps/lwiperf/lwiperf.c
            )

    # SMTP client
    pico_add_library(pico_lwip_smtp NOFLAG)
    target_sources(pico_lwip_smtp INTERFACE
            ${PICO_LWIP_PATH}/src/apps/smtp/smtp.c
            )

    # SNTP client
    pico_add_library(pico_lwip_sntp NOFLAG)
    target_sources(pico_lwip_sntp INTERFACE
            ${PICO_LWIP_PATH}/src/apps/sntp/sntp.c
            )

    # MDNS responder
    pico_add_library(pico_lwip_mdns NOFLAG)
    target_sources(pico_lwip_mdns INTERFACE
            ${PICO_LWIP_PATH}/src/apps/mdns/mdns.c
            )

    # Old versions of lwip had everything in mdns.c
    if (EXISTS ${PICO_LWIP_PATH}/src/apps/mdns/mdns_out.c)
        target_sources(pico_lwip_mdns INTERFACE
                ${PICO_LWIP_PATH}/src/apps/mdns/mdns_out.c
                ${PICO_LWIP_PATH}/src/apps/mdns/mdns_domain.c
                )
    endif()

    # NetBIOS name server
    pico_add_library(pico_lwip_netbios NOFLAG)
    target_sources(pico_lwip_netbios INTERFACE
            ${PICO_LWIP_PATH}/src/apps/netbiosns/netbiosns.c
            )

    # TFTP server files
    pico_add_library(pico_lwip_tftp NOFLAG)
    target_sources(pico_lwip_tftp INTERFACE
            ${PICO_LWIP_PATH}/src/apps/tftp/tftp.c
            )


    # Mbed TLS files
    pico_add_library(pico_lwip_mbedtls NOFLAG)
    target_sources(pico_lwip_mbedtls INTERFACE
            ${PICO_LWIP_PATH}/src/apps/altcp_tls/altcp_tls_mbedtls_mem.c
            ${PICO_LWIP_PATH}/src/apps/snmp/snmpv3_mbedtls.c
            )

    # altcp_tls_mbedtls.c is not compatible with mbedtls 3.x so use a patched version until this is resolved
    # See https://savannah.nongnu.org/patch/index.php?10448
    if (MBEDTLS_VERSION_MAJOR AND MBEDTLS_VERSION_MAJOR GREATER_EQUAL  3)
        target_sources(pico_lwip_mbedtls INTERFACE
            ${CMAKE_CURRENT_LIST_DIR}/altcp_tls_mbedtls.c
            )
        target_include_directories(pico_lwip_mbedtls INTERFACE
            ${PICO_LWIP_PATH}/src/apps/altcp_tls
            )
    else()
        target_sources(pico_lwip_mbedtls INTERFACE
            ${PICO_LWIP_PATH}/src/apps/altcp_tls/altcp_tls_mbedtls.c
            )
    endif()

    # MQTT client files
    pico_add_library(pico_lwip_mqtt NOFLAG)
    target_sources(pico_lwip_mqtt INTERFACE
            ${PICO_LWIP_PATH}/src/apps/mqtt/mqtt.c
            )

    # All LWIP files without apps
    pico_add_library(pico_lwip NOFLAG)
    pico_mirrored_target_link_libraries(pico_lwip INTERFACE
        pico_lwip_core
        pico_lwip_core4
        pico_lwip_core6
        pico_lwip_api
        pico_lwip_netif
        pico_lwip_sixlowpan
        pico_lwip_ppp
    )

    # our arch/cc.h
    pico_add_library(pico_lwip_arch NOFLAG)
    target_include_directories(pico_lwip_arch_headers SYSTEM INTERFACE
            ${CMAKE_CURRENT_LIST_DIR}/include)
    pico_mirrored_target_link_libraries(pico_lwip_arch INTERFACE pico_rand)

    # our nosys impl
    pico_add_library(pico_lwip_nosys NOFLAG)
    target_sources(pico_lwip_nosys INTERFACE
            ${CMAKE_CURRENT_LIST_DIR}/lwip_nosys.c
            )
    pico_mirrored_target_link_libraries(pico_lwip_nosys INTERFACE
            pico_async_context_base
            pico_lwip_arch
            pico_lwip)

    if (NOT PICO_LWIP_CONTRIB_PATH)
        set(PICO_LWIP_CONTRIB_PATH ${PICO_LWIP_PATH}/contrib)
    endif()
    pico_register_common_scope_var(PICO_LWIP_CONTRIB_PATH)

    # Make lwip_contrib_freertos library, with the FreeRTOS/lwIP code from lwip-contrib
    pico_add_library(pico_lwip_contrib_freertos NOFLAG)
    target_sources(pico_lwip_contrib_freertos INTERFACE
            ${PICO_LWIP_CONTRIB_PATH}/ports/freertos/sys_arch.c
            )
    target_include_directories(pico_lwip_contrib_freertos_headers SYSTEM INTERFACE
            ${PICO_LWIP_CONTRIB_PATH}/ports/freertos/include
            )
    pico_mirrored_target_link_libraries(pico_lwip_contrib_freertos INTERFACE
            pico_lwip_arch)

    pico_add_library(pico_lwip_freertos NOFLAG)
    target_sources(pico_lwip_freertos INTERFACE
            ${CMAKE_CURRENT_LIST_DIR}/lwip_freertos.c
            )
    pico_mirrored_target_link_libraries(pico_lwip_freertos INTERFACE
            pico_async_context_base
            pico_lwip
            pico_lwip_contrib_freertos)

    pico_add_subdirectory(tools)
    pico_promote_common_scope_vars()
endif()
