cmake_minimum_required(VERSION 3.0)

project(Commander)
if (CMAKE_HOST_WIN32)
    set(WINDOWS 1)
elseif(CMAKE_HOST_APPLE)
    set(MACOS 1)
elseif(CMAKE_HOST_UNIX)
    set(LINUX 1)
endif()

set(CompileMode "User")
# set(CompileMode "Developer")

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 -Wall -Weffc++ -fPIC")

#find include path
include_directories(include)
if(CompileMode STREQUAL "User")
    link_directories(${PROJECT_SOURCE_DIR}/../lib)
endif()

if(WINDOWS)
    find_package(Lua51 REQUIRED)
    include_directories(${LUA_INCLUDE_DIR})
    
    if(CompileMode STREQUAL "Developer")
        find_package(pybind11 REQUIRED)

        find_package(Python 3.6 EXACT REQUIRED)
        include_directories(${PYTHON_INCLUDE_DIRS})
    endif()
elseif(LINUX)
    find_package(Python 3.6 EXACT REQUIRED)
    include_directories(${PYTHON_INCLUDE_DIRS})
endif()

#add source files to variable xxx_SOURCE_FILES
if(CompileMode STREQUAL "Developer")
    aux_source_directory(GameMap GameMap_SOURCE_FILES)
    aux_source_directory(System System_SOURCE_FILES)
    aux_source_directory(Verification Verification_SOURCE_FILES)
    set(PythonSDK_SOURCE_FILES PythonSDK/PyAPI.cpp)
    set(PythonSDK_LUAAPI_FILES PythonSDK/API.cpp)
    aux_source_directory(UserAPI UserAPI_SOURCE_FILES)
endif()
#aux_source_directory(UserImplementation UserImplementation_SOURCE_FILES)
set(UserImplementation_SOURCE_FILES UserImplementation/API.cpp)

#generate .so/.dll files
if(CompileMode STREQUAL "Developer")
    add_library(GameMap SHARED ${GameMap_SOURCE_FILES})
    add_library(System SHARED ${System_SOURCE_FILES})
    add_library(Verification SHARED ${Verification_SOURCE_FILES})
    add_library(PythonAPI SHARED ${PythonSDK_LUAAPI_FILES})
    add_library(UserAPI SHARED ${UserAPI_SOURCE_FILES})
endif()
add_library(UserImplementation SHARED ${UserImplementation_SOURCE_FILES})

if(WINDOWS)
    if(CompileMode STREQUAL "Developer")
        target_link_libraries(Verification ${LUA_LIBRARIES})
        target_link_libraries(GameMap Verification ${LUA_LIBRARIES})
        target_link_libraries(System GameMap ${LUA_LIBRARIES})
        target_link_libraries(UserAPI GameMap ${LUA_LIBRARIES})
        target_link_libraries(UserImplementation UserAPI GameMap Verification ${LUA_LIBRARIES})
        target_link_libraries(PythonAPI UserAPI GameMap Verification ${LUA_LIBRARIES} ${PYTHON_LIBRARIES})
    elseif(CompileMode STREQUAL "User")
        target_link_libraries(UserImplementation UserAPI.dll GameMap.dll Verification.dll ${LUA_LIBRARIES})
    endif()
elseif(LINUX)
    if(CompileMode STREQUAL "Developer")
        target_link_libraries(GameMap Verification)
        target_link_libraries(System GameMap)
        target_link_libraries(UserAPI GameMap)
        target_link_libraries(UserImplementation UserAPI GameMap Verification)
        target_link_libraries(PythonAPI UserAPI GameMap Verification)
    elseif(CompileMode STREQUAL "User")
        target_link_libraries(UserImplementation UserAPI.so GameMap.so Verification.so)
    endif()
endif()
#change name: e.g. libmat.so->lib_mat.so
if(CompileMode STREQUAL "Developer")
    set_target_properties(UserAPI GameMap System Verification UserAPI UserImplementation PythonAPI PROPERTIES PREFIX "")
elseif(CompileMode STREQUAL "User")
    set_target_properties(UserImplementation PROPERTIES PREFIX "")
endif()

if(CompileMode STREQUAL "Developer")
    # Python接口
    pybind11_add_module(Commander ${PythonSDK_SOURCE_FILES})
    set_target_properties(Commander PROPERTIES LINK_FLAGS "-static-libgcc -static-libstdc++ -Wl,-Bstatic,--whole-archive -lwinpthread -Wl,--no-whole-archive")
    target_link_libraries(Commander PUBLIC UserAPI GameMap Verification ${LUA_LIBRARIES})
endif()

if(CompileMode STREQUAL "Developer")
    install(TARGETS GameMap System Verification UserAPI PythonAPI RUNTIME DESTINATION ${PROJECT_SOURCE_DIR}/../lib)
    install(TARGETS Commander DESTINATION ${PROJECT_SOURCE_DIR}/../Client/AI)
endif()

install(TARGETS UserImplementation RUNTIME DESTINATION ${PROJECT_SOURCE_DIR}/../lib)