# SPDX-License-Identifier: LGPL-2.1-or-later

if(MSVC)
    add_definitions(-DFCAppMaterial -DHAVE_ACOSH -DHAVE_ASINH -DHAVE_ATANH)
else(MSVC)
    add_definitions(-DHAVE_LIMITS_H -DHAVE_CONFIG_H)
endif(MSVC)

add_definitions(-DYAML_CPP_STATIC_DEFINE)

if(BUILD_MATERIAL_EXTERNAL)
    add_definitions(-DBUILD_MATERIAL_EXTERNAL)
endif(BUILD_MATERIAL_EXTERNAL)

set(Materials_LIBS
    FreeCADApp
)

list(APPEND Materials_LIBS
    ${QtConcurrent_LIBRARIES}
)

if(yaml-cpp_VERSION VERSION_LESS 0.8.0)
    list(APPEND Materials_LIBS
        ${YAML_CPP_LIBRARIES}
    )
else()
    list(APPEND Materials_LIBS
        yaml-cpp::yaml-cpp
    )
endif()

generate_from_py(Array2D)
generate_from_py(Array3D)
generate_from_py(MaterialFilter)
generate_from_py(MaterialFilterOptions)
generate_from_py(MaterialLibrary)
generate_from_py(MaterialManager)
generate_from_py(Material)
generate_from_py(ModelManager)
generate_from_py(ModelProperty)
generate_from_py(MaterialProperty)
generate_from_py(Model)
generate_from_py(UUIDs)

SET(MaterialsAPI_Files
    MaterialAPI/__init__.py
    MaterialAPI/MaterialManagerExternal.py
)

SET(MaterialsAPI_Files
    MaterialAPI/__init__.py
    MaterialAPI/MaterialManagerExternal.py
)

SET(Python_SRCS
    Exceptions.cpp
    Array2D.pyi
    Array2DPyImp.cpp
    Array3D.pyi
    Array3DPyImp.cpp
    MaterialFilterOptions.pyi
    MaterialFilterOptionsPyImp.cpp
    MaterialFilter.pyi
    MaterialFilterPyImp.cpp
    MaterialLibrary.pyi
    MaterialLibraryPyImp.cpp
    MaterialManager.pyi
    MaterialManagerPyImp.cpp
    MaterialProperty.pyi
    MaterialPropertyPyImp.cpp
    Material.pyi
    MaterialPyImp.cpp
    ModelManager.pyi
    ModelManagerPyImp.cpp
    ModelProperty.pyi
    ModelPropertyPyImp.cpp
    Model.pyi
    ModelPyImp.cpp
    UUIDs.pyi
    UUIDsPyImp.cpp
)
SOURCE_GROUP("Python" FILES ${Python_SRCS})

SET(Materials_SRCS
    ${Python_SRCS}
    AppMaterial.cpp
    FolderTree.h
    Library.cpp
    Library.h
    MaterialConfigLoader.cpp
    MaterialConfigLoader.h
    MaterialFilter.cpp
    MaterialFilter.h
    MaterialLibrary.cpp
    MaterialLibrary.h
    MaterialLoader.cpp
    MaterialLoader.h
    MaterialManager.cpp
    MaterialManager.h
    MaterialManagerLocal.cpp
    MaterialManagerLocal.h
    Materials.cpp
    Materials.h
    MaterialValue.cpp
    MaterialValue.h
    Model.cpp
    Model.h
    ModelLibrary.cpp
    ModelLibrary.h
    ModelLoader.cpp
    ModelLoader.h
    ModelManager.cpp
    ModelManager.h
    ModelManagerLocal.cpp
    ModelManagerLocal.h
    ModelUuids.cpp
    ModelUuids.h
    PreCompiled.h
    PropertyMaterial.cpp
    PropertyMaterial.h
    PyVariants.cpp
    PyVariants.h
    trim.h
)

if(BUILD_MATERIAL_EXTERNAL)
    list(APPEND Materials_SRCS
        ExternalManager.cpp
        ExternalManager.h
        MaterialManagerExternal.cpp
        MaterialManagerExternal.h
        ModelManagerExternal.cpp
        ModelManagerExternal.h
    )
endif(BUILD_MATERIAL_EXTERNAL)

add_library(Materials SHARED ${Materials_SRCS})

if(FREECAD_USE_PCH)
    target_precompile_headers(Materials PRIVATE
            $<$<COMPILE_LANGUAGE:CXX>:"${CMAKE_CURRENT_LIST_DIR}/PreCompiled.h">
    )
endif(FREECAD_USE_PCH)

target_include_directories(
    Materials
    PRIVATE
    ${CMAKE_BINARY_DIR}
    ${CMAKE_BINARY_DIR}/src
    ${CMAKE_SOURCE_DIR}/src
    ${CMAKE_CURRENT_BINARY_DIR}
    ${CMAKE_CURRENT_SOURCE_DIR}
)

target_include_directories(
    Materials
    SYSTEM
    PUBLIC
    ${YAML_CPP_INCLUDE_DIR}
    ${QtConcurrent_INCLUDE_DIRS}
)

if(BUILD_MATERIAL_EXTERNAL)
    target_include_directories(Materials PUBLIC ${CMAKE_SOURCE_DIR}/src/3rdParty/lru-cache/include)
endif(BUILD_MATERIAL_EXTERNAL)

target_link_directories(Materials PUBLIC ${YAML_CPP_LIBRARY_DIR})
target_link_libraries(Materials ${Materials_LIBS})

if (MSVC)
    target_compile_options(Materials PRIVATE /wd4251 /wd4273)
endif()

if(FREECAD_WARN_ERROR)
    target_compile_warn_error(Materials)
endif()

SET_BIN_DIR(Materials Materials /Mod/Material)
SET_PYTHON_PREFIX_SUFFIX(Materials)

INSTALL(TARGETS Materials DESTINATION ${CMAKE_INSTALL_LIBDIR})

ADD_CUSTOM_TARGET(MaterialsAPILib ALL
    SOURCES ${MaterialsAPI_Files} ${Material_QRC_SRCS}
)

fc_target_copy_resource(MaterialsAPILib
    ${CMAKE_CURRENT_SOURCE_DIR}
    ${CMAKE_BINARY_DIR}/Mod/Material
    ${MaterialsAPI_Files})

INSTALL(FILES ${MaterialsAPI_Files} DESTINATION Mod/Material/MaterialAPI)
