if(NOT ESP_PLATFORM)
  
  if(CMAKE_SYSTEM_NAME MATCHES NintendoSwitch OR CMAKE_SYSTEM_NAME MATCHES Nintendo3DS OR CMAKE_SYSTEM_NAME MATCHES Dreamcast OR CMAKE_SYSTEM_NAME MATCHES NintendoGameCube OR CMAKE_SYSTEM_NAME MATCHES NintendoDS OR CMAKE_SYSTEM_NAME MATCHES NintendoWii OR CMAKE_SYSTEM_NAME MATCHES CafeOS)
    cmake_minimum_required(VERSION 3.13)
  elseif(VITA)
    cmake_minimum_required(VERSION 3.2)  
  elseif(PICO_BOARD)
    cmake_minimum_required(VERSION 3.12)
    message(STATUS "Configuring libsmb2 for ${PICO_BOARD}")
  else()
    cmake_minimum_required(VERSION 3.5)
  endif()

  if(NOT IOP AND BUILD_IRX)
    project(smb2man
            LANGUAGES C
            VERSION 2.3.0
    )
    set(VERSION 2.3.0)    
    set(PACKAGE "smb2man")
    set(PACKAGE_BUGREPORT "ronniesahlberg@gmail.com or andregui17@outlook.com")
    set(PACKAGE_NAME "smb2man")
    set(PACKAGE_VERSION "${VERSION}")
    set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}")
    set(PACKAGE_TARNAME "${PACKAGE}")
    set(PACKAGE_URL "https://github.com/sahlberg/libsmb2")
  elseif(PICO_BOARD)
    project(libsmb2 C CXX ASM)
  else()
    project(libsmb2
            LANGUAGES C
            VERSION 6.1.0
    )  
    set(VERSION 6.1.0)
    set(PACKAGE "libsmb2")
    set(PACKAGE_BUGREPORT "ronniesahlberg@gmail.com")
    set(PACKAGE_NAME "libsmb2")
    set(PACKAGE_VERSION "${VERSION}")
    set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}")
    set(PACKAGE_TARNAME "${PACKAGE}")
    set(PACKAGE_URL "https://github.com/sahlberg/libsmb2")
  endif()
  configure_file(libsmb2.pc.in libsmb2.pc @ONLY)
endif()

  if(NOT ESP_PLATFORM)
    set(SOVERSION 1 CACHE STRING "" FORCE)
    if(NOT IOP AND NOT BUILD_IRX)
      set(INSTALL_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}" CACHE PATH "Installation directory for libraries")
      set(INSTALL_INC_DIR "${CMAKE_INSTALL_PREFIX}/include" CACHE PATH "Installation directory for headers")
      set(INSTALL_PKGCONFIG_DIR "${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}/pkgconfig" CACHE PATH "Installation directory for pkgconfig (.pc) files")
      set(INSTALL_CMAKE_DIR "${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}/cmake/libsmb2" CACHE PATH "Installation directory for cmake (.cmake) files")
    endif()
    if(CMAKE_SYSTEM_NAME MATCHES NintendoSwitch OR CMAKE_SYSTEM_NAME MATCHES Nintendo3DS OR PS4 OR PS2 OR VITA OR CMAKE_SYSTEM_NAME MATCHES Dreamcast OR CMAKE_SYSTEM_NAME MATCHES NintendoGameCube OR CMAKE_SYSTEM_NAME MATCHES NintendoDS OR CMAKE_SYSTEM_NAME MATCHES NintendoWii OR CMAKE_SYSTEM_NAME MATCHES CafeOS)
      option(BUILD_SHARED_LIBS "Build shared libraries" OFF)  
    else()
      option(BUILD_SHARED_LIBS "Build shared libraries" ON)
    endif()
      option(ENABLE_EXAMPLES "Build example programs" OFF)
      option(ENABLE_LIBKRB5 "Enable libkrb5 support" ON)
      option(ENABLE_GSSAPI "Enable gssapi support" ON)
      list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/Modules)
  endif()

  if(CMAKE_SYSTEM_NAME MATCHES Linux)
    if (ENABLE_LIBKRB5)
      find_package(LibKrb5)
    endif()
  elseif(IOS)
    if (ENABLE_GSSAPI)
      find_package(GSSAPI)  
    endif()
  endif()

  if(NOT ESP_PLATFORM)
      include(cmake/ConfigureChecks.cmake)
  endif()

  if(PICO_BOARD)
      include_directories(libsmb2 STATIC
            ${PICO_SDK_PATH}/lib/lwip/src/include
            ${PICO_SDK_PATH}/src/rp2_common/pico_lwip/include
            lib
            include
            include/smb2
            include/picow
    )
    elseif(ESP_PLATFORM)
      set(COMPONENT_ADD_INCLUDEDIRS
      "lib"
      include
      include/smb2
      include/esp
     )
    else()
      include_directories(${CMAKE_CURRENT_BINARY_DIR}
                        include
                        include/smb2
      )
    endif()
    
    if(CMAKE_SYSTEM_NAME MATCHES Linux)
      if (ENABLE_LIBKRB5)
        set(core_DEPENDS ${LIBKRB5_LIBRARY} CACHE STRING "" FORCE)  
      endif()
    elseif(IOS)
      if (ENABLE_GSSAPI)
        set(core_DEPENDS ${GSSAPI_LIBRARIES} CACHE STRING "" FORCE)   
      endif()
    endif()

    if(MSVC AND BUILD_SHARED_LIBS)
      # If we are building dll with msvc, then generate a def file according to the syms file
      set(SYMS_FILE_PATH "${PROJECT_SOURCE_DIR}/lib/libsmb2.syms")
      set(DEF_FILE_PATH "${PROJECT_BINARY_DIR}/lib/libsmb2.def")
      file(READ ${SYMS_FILE_PATH} EXPORT_SYMBOLS)
      file(WRITE ${DEF_FILE_PATH} "LIBRARY smb2\nEXPORTS\n\n${EXPORT_SYMBOLS}")
      # Pass def file to the linker
      set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /DEF:${DEF_FILE_PATH}")
    endif()

    if(CMAKE_SYSTEM_NAME MATCHES Windows)
      list(APPEND CORE_LIBRARIES ws2_32.lib)
      add_definitions(-DWIN32_LEAN_AND_MEAN -D_CRT_SECURE_NO_WARNINGS -DHAVE_LINGER -DNEED_GETLOGIN_R -DNEED_GETPID -DNEED_RANDOM -DNEED_SRANDOM)
    elseif(CMAKE_SYSTEM_NAME MATCHES NintendoSwitch)
      add_definitions(-DARM11 -DSWITCH -D__SWITCH__ -DNEED_READV -DNEED_WRITEV -DNEED_GETLOGIN_R)
      set(ARCH "-march=armv8-a -mtp=soft -fPIE")
      set(CMAKE_C_FLAGS "-g -Wall -O2 -ffast-math ${ARCH}")
      set(CMAKE_C_FLAGS "-Wno-unused-variable")
      set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} -fno-rtti -std=gnu11")
      set(CMAKE_C_LDFLAGS "${CMAKE_C_FLAGS} -specs=switch.specs -g ${ARCH} -Wl,-Map,$(notdir $*.map)")
      add_compile_options("${CMAKE_C_FLAGS} ${CMAKE_LDFLAGS}")
    elseif(CMAKE_SYSTEM_NAME MATCHES Nintendo3DS)
      add_definitions(-DARM11 -D_3DS -D__3DS__ -DNEED_READV -DNEED_WRITEV -DNEED_GETLOGIN_R)
      set(ARCH "-march=armv6k -mfloat-abi=hard -mtune=mpcore -mtp=soft -fPIE")
      set(CMAKE_C_FLAGS "-Wno-unused-variable -g -Wall -O2 -mword-relocations -fomit-frame-pointer -ffast-math ${ARCH}")
      set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} -fno-rtti -fno-exceptions -std=gnu11")
      set(CMAKE_C_LDFLAGS "${CMAKE_C_FLAGS} -specs=3dsx.specs -g ${ARCH} -Wl,-Map,$(notdir $*.map)")
      add_compile_options("${CMAKE_C_FLAGS} ${CMAKE_LDFLAGS}")
    elseif(CMAKE_SYSTEM_NAME MATCHES NintendoDS)
      add_definitions(-DARM9 -D__NDS__ -DNEED_READV -DHAVE_SOCKADDR_STORAGE -DNEED_WRITEV -DNEED_GETLOGIN_R -DNEED_GETADDRINFO -DNEED_FREEADDRINFO -DNEED_POLL)
      set(CMAKE_C_FLAGS "-Wno-format -Wpointer-arith")      
      set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} -fno-rtti -fno-exceptions -std=gnu11")
      set(CMAKE_C_LDFLAGS "${CMAKE_C_FLAGS} -specs=ds_arm9.specs -g")
      add_compile_options("${CMAKE_C_FLAGS} ${CMAKE_LDFLAGS}")      
    elseif(CMAKE_SYSTEM_NAME MATCHES NintendoGameCube)      
      add_definitions(-DGEKKO -D__GC__ -DNEED_READV -DNEED_WRITEV -DNEED_GETLOGIN_R -DNEED_GETADDRINFO -DNEED_FREEADDRINFO -DNEED_POLL)
      set(CMAKE_C_FLAGS "-g")
      #-O3 -Wall      
      add_compile_options("${CMAKE_C_FLAGS}")    
    elseif(CMAKE_SYSTEM_NAME MATCHES NintendoWii)
      add_definitions(-DGEKKO -D__WII__ -DNEED_READV -DNEED_WRITEV -DNEED_GETLOGIN_R -DNEED_GETADDRINFO -DNEED_FREEADDRINFO -DNEED_POLL)
      set(CMAKE_C_FLAGS "-g")
      #-O3 -Wall      
      add_compile_options("${CMAKE_C_FLAGS}")
    elseif(CMAKE_SYSTEM_NAME MATCHES CafeOS)
      add_definitions(-D__WIIU__ -DNEED_READV -DNEED_WRITEV -DNEED_GETLOGIN_R)
      set(CMAKE_C_FLAGS "-g")
      #-O3 -Wall      
      add_compile_options("${CMAKE_C_FLAGS}")    
    elseif(PS4)
      add_definitions(-DPS4_PLATFORM)
      set(CMAKE_C_FLAGS "-funwind-tables")
      #-fuse-init-array -emit-llvm broken...
      set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS}")    
      add_compile_options("${CMAKE_C_FLAGS}")
    elseif(EE)
      add_definitions(-DNEED_BE64TOH -DNEED_POLL -DNEED_WRITEV -DNEED_READV -DNEED_GETLOGIN_R)
      if(EE AND PS2RPC)
        add_definitions(-DPS2RPC)
      endif()      
    elseif(IOP)
      add_definitions(-DHAVE_CONFIG_H -DNEED_BE64TOH -DNEED_STRDUP -DNEED_READV -DNEED_WRITEV -DNEED_POLL -DNEED_GETPID -DNEED_RANDOM -DNEED_SRANDOM -DNEED_GETLOGIN_R -DHAVE_STRING_H -DHAVE_SYS_FCNTL_H)
      if(IOP AND BUILD_IRX)
        add_definitions(-D__ps2sdk_iop__)
        if(DEBUG)
          add_definitions(-DDEBUG)
        endif()
        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -fno-builtin")
        set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s")                
      endif()
      set(CMAKE_C_FLAGS "-Wall") 
      include_directories(${CMAKE_CURRENT_BINARY_DIR} include/ps2)
      add_compile_options("${CMAKE_C_FLAGS}")
    elseif(VITA)
      add_definitions(-DNEED_READV -DNEED_WRITEV -DNEED_GETLOGIN_R)  
    elseif(PICO_BOARD)
      add_definitions(-DNEED_BE64TOH -DNEED_POLL -DNEED_GETLOGIN_R)
    elseif(ESP_PLATFORM)    
      if(NOT CMAKE_BUILD_EARLY_EXPANSION)
        add_definitions(-DHAVE_CONFIG_H)
      endif()
      add_definitions(-DNEED_READV -DNEED_WRITEV -DNEED_GETLOGIN_R -DNEED_RANDOM -DNEED_SRANDOM)    
    elseif(CMAKE_SYSTEM_NAME MATCHES Dreamcast)
      add_definitions(-DNEED_WRITEV -DNEED_READV -DHAVE_CONFIG_H -DNEED_GETLOGIN_R)             
    elseif(CMAKE_SYSTEM_NAME STREQUAL Solaris)
      find_library(SOCKET_LIBRARY socket)
      find_library(NSL_LIBRARY nsl)
      list(APPEND CORE_LIBRARIES ${SOCKET_LIBRARY} ${NSL_LIBRARY})
    endif()


    if(ENABLE_EXAMPLES)
      add_subdirectory(examples)
    endif()

    add_subdirectory(lib)

  if(NOT PICO_BOARD OR ESP_PLATFORM)
      include(CMakePackageConfigHelpers)
      write_basic_package_version_file(${CMAKE_CURRENT_BINARY_DIR}/libsmb2-config-version.cmake
                                    VERSION ${PROJECT_VERSION}
                                    COMPATIBILITY AnyNewerVersion)
    if(NOT IOP AND NOT BUILD_IRX)
      configure_file(cmake/libsmb2.pc.cmake
                  ${CMAKE_CURRENT_BINARY_DIR}/libsmb2.pc @ONLY)

      install(DIRECTORY include/smb2
            DESTINATION ${INSTALL_INC_DIR})

      install(FILES cmake/FindSMB2.cmake
                  ${CMAKE_CURRENT_BINARY_DIR}/libsmb2-config-version.cmake
            DESTINATION ${INSTALL_CMAKE_DIR})

      install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libsmb2.pc
            DESTINATION ${INSTALL_PKGCONFIG_DIR})
    endif()
  endif() 

