include(GNUInstallDirs)

set(GDXDIR ../../../../ThirdPartyLibs/gdx)

add_library(gdx STATIC
    # P3 runtime library
    ${GDXDIR}/src/rtl/dtoaLoc.c
    ${GDXDIR}/src/rtl/p3io.cpp
    ${GDXDIR}/src/rtl/p3utils.cpp
    ${GDXDIR}/src/rtl/sysutils_p3.cpp
    ${GDXDIR}/src/rtl/system_p3.cpp
    ${GDXDIR}/src/rtl/p3platform.cpp
    ${GDXDIR}/src/rtl/math_p3.cpp

    # gdlib essential units
    ${GDXDIR}/src/gdlib/gmsstrm.cpp
    ${GDXDIR}/src/gdlib/utils.cpp
    ${GDXDIR}/src/gdlib/strutilx.cpp

    # GDX specific units
    ${GDXDIR}/src/gxfile.cpp
)

# Set Intel compiler flags for this library only. This allows std::is_nan checks to not be optimized for the gdx lib.
if(CMAKE_CXX_COMPILER_ID STREQUAL "Intel" OR
   CMAKE_CXX_COMPILER_ID STREQUAL "IntelLLVM")
    set(STRUTILX_SRC "${GDXDIR}/src/gdlib/strutilx.cpp")
    set(GXFILE_SRC   "${GDXDIR}/src/gxfile.cpp")

    set_source_files_properties(
        ${STRUTILX_SRC} ${GXFILE_SRC}
        PROPERTIES COMPILE_FLAGS "-fp-model precise")
endif()

set_source_files_properties("${GDXDIR}/src/rtl/dtoaLoc.c" PROPERTIES COMPILE_FLAGS "-Wno-implicit-fallthrough")
set_source_files_properties("${GDXDIR}/src/gxfile.cpp" PROPERTIES COMPILE_FLAGS "-Wno-cast-function-type")

target_include_directories(gdx PRIVATE ${GDXDIR}/src ${GDXDIR}/src/rtl ${GDXDIR}/src/gdlib ${GDXDIR}/src/global ${GDXDIR}/generated)

target_link_libraries(gdx PRIVATE ZLIB::ZLIB)

add_library(gmspipsio STATIC gmspipsio.C)

target_link_libraries(gmspipsio PRIVATE gdx)

target_include_directories(gmspipsio PUBLIC ${GDXDIR}/src ${GDXDIR}/src/gdlib ${GDXDIR}/generated)

list(TRANSFORM includes_for_interface PREPEND "../../../" OUTPUT_VARIABLE includes_for_gmspips)

########### gmpipsreader ###########
add_library(gmspips_read_write STATIC gmspips_reader.cpp)

target_include_directories(gmspips_read_write PRIVATE ${includes_for_gmspips})

target_link_libraries(gmspips_read_write
        PRIVATE gmspipsio
        PRIVATE pips-ipmpp
        )

############## gmschk ##############
add_executable(gmschk
        gmspipschk.cpp
        )

target_link_libraries(gmschk
        PRIVATE gmspipsio
        PRIVATE OpenMP::OpenMP_CXX
        )

install(TARGETS gmschk
        LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
        ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
        INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})

set_target_properties(gmschk PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE)
set_target_properties(gmschk PROPERTIES INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}")

############## gmspips ##############
add_executable(gmspips gmspips.cpp)

target_include_directories(gmspips PRIVATE ${includes_for_gmspips})

target_link_libraries(gmspips
        PRIVATE pips-ipmpp
        PRIVATE gmspips_read_write
        )

install(TARGETS gmspips
        LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
        ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
        INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})

set_target_properties(gmspips PROPERTIES INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}")
set_target_properties(gmspips PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE)
