###
#
# @file GenPkgConfig.cmake
#
# @copyright 2009-2014 The University of Tennessee and The University of
#                      Tennessee Research Foundation. All rights reserved.
# @copyright 2012-2021 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
#                      Univ. Bordeaux. All rights reserved.
#
###
#
#  @project CHAMELEON
#  CHAMELEON is a software package provided by:
#     Inria Bordeaux - Sud-Ouest,
#     Univ. of Tennessee,
#     King Abdullah Univesity of Science and Technology
#     Univ. of California Berkeley,
#     Univ. of Colorado Denver.
#
# @version 1.1.0
#  @author Cedric Castagnede
#  @author Emmanuel Agullo
#  @author Mathieu Faverge
#  @author Florent Pruvost
#  @date 2021-01-04
#
###

###
#
# CONVERT_LIBSTYLE_TO_PKGCONFIG: convert a libraries list to follow the pkg-config style
#                                used in CLEAN_LIB_LIST
#
###
MACRO(CONVERT_LIBSTYLE_TO_PKGCONFIG _liblist)
    set(${_liblist}_CPY "${${_liblist}}")
    set(${_liblist} "")
    foreach(_dep ${${_liblist}_CPY})
        if (${_dep} MATCHES "^/")
            get_filename_component(dep_libname ${_dep} NAME)
            get_filename_component(dep_libdir  ${_dep} DIRECTORY)
            STRING(REPLACE "lib"    "" dep_libname "${dep_libname}")
            STRING(REPLACE ".so"    "" dep_libname "${dep_libname}")
            STRING(REPLACE ".a"     "" dep_libname "${dep_libname}")
            STRING(REPLACE ".dylib" "" dep_libname "${dep_libname}")
            STRING(REPLACE ".dll"   "" dep_libname "${dep_libname}")
            list(APPEND ${_liblist} -L${dep_libdir} -l${dep_libname})
        elseif(NOT ${_dep} MATCHES "^-")
            list(APPEND ${_liblist} "-l${_dep}")
        else()
            list(APPEND ${_liblist} ${_dep})
        endif()
    endforeach()
ENDMACRO(CONVERT_LIBSTYLE_TO_PKGCONFIG)

###
#
# CLEAN_LIB_LIST: clean libraries lists to follow the pkg-config style
#                 used in GENERATE_PKGCONFIG_FILE
#
###
MACRO(CLEAN_LIB_LIST _package)
    list(REMOVE_DUPLICATES ${_package}_PKGCONFIG_LIBS)
    list(REMOVE_DUPLICATES ${_package}_PKGCONFIG_LIBS_PRIVATE)
    list(REMOVE_DUPLICATES ${_package}_PKGCONFIG_REQUIRED)
    list(REMOVE_DUPLICATES ${_package}_PKGCONFIG_REQUIRED_PRIVATE)
    CONVERT_LIBSTYLE_TO_PKGCONFIG(${_package}_PKGCONFIG_LIBS)
    CONVERT_LIBSTYLE_TO_PKGCONFIG(${_package}_PKGCONFIG_LIBS_PRIVATE)
    STRING(REPLACE ";" " " ${_package}_PKGCONFIG_LIBS "${${_package}_PKGCONFIG_LIBS}")
    STRING(REPLACE ";" " " ${_package}_PKGCONFIG_LIBS_PRIVATE "${${_package}_PKGCONFIG_LIBS_PRIVATE}")
    STRING(REPLACE ";" " " ${_package}_PKGCONFIG_REQUIRED "${${_package}_PKGCONFIG_REQUIRED}")
    STRING(REPLACE ";" " " ${_package}_PKGCONFIG_REQUIRED_PRIVATE "${${_package}_PKGCONFIG_REQUIRED_PRIVATE}")
ENDMACRO(CLEAN_LIB_LIST)

###
#
# GENERATE_PKGCONFIG_FILE: generate files chameleon.pc, coreblas.pc and cudablas.pc
#
###
MACRO(GENERATE_PKGCONFIG_FILE)

    # The definitions that should be given to users (change the API)
    set(CHAMELEON_PKGCONFIG_DEFINITIONS "")
    set(COREBLAS_PKGCONFIG_DEFINITIONS "")
    set(CUDABLAS_PKGCONFIG_DEFINITIONS "")

    # The link flags specific to this package and any required libraries
    # that don't support PkgConfig
    set(CHAMELEON_PKGCONFIG_LIBS "-lchameleon")
    set(COREBLAS_PKGCONFIG_LIBS  "-lcoreblas")
    set(CUDABLAS_PKGCONFIG_LIBS  "-lcudablas")

    # The link flags for private libraries required by this package but not
    # exposed to applications
    set(CHAMELEON_PKGCONFIG_LIBS_PRIVATE "")
    set(COREBLAS_PKGCONFIG_LIBS_PRIVATE  "")
    set(CUDABLAS_PKGCONFIG_LIBS_PRIVATE  "")

    # A list of packages required by this package
    set(CHAMELEON_PKGCONFIG_REQUIRED "hqr")
    set(COREBLAS_PKGCONFIG_REQUIRED  "")
    set(CUDABLAS_PKGCONFIG_REQUIRED  "")

    # A list of private packages required by this package but not exposed to
    # applications
    set(CHAMELEON_PKGCONFIG_REQUIRED_PRIVATE "")
    set(COREBLAS_PKGCONFIG_REQUIRED_PRIVATE  "")
    set(CUDABLAS_PKGCONFIG_REQUIRED_PRIVATE  "")

    if(CHAMELEON_SCHED_STARPU)
        list(APPEND CHAMELEON_PKGCONFIG_LIBS -lchameleon_starpu)
        if ( CHAMELEON_USE_MPI )
            list(APPEND CHAMELEON_PKGCONFIG_REQUIRED_PRIVATE starpumpi-${CHAMELEON_STARPU_VERSION})
        else()
            list(APPEND CHAMELEON_PKGCONFIG_REQUIRED_PRIVATE starpu-${CHAMELEON_STARPU_VERSION})
        endif()
    elseif(CHAMELEON_SCHED_QUARK)
        list(APPEND CHAMELEON_PKGCONFIG_LIBS -lchameleon_quark)
        list(APPEND CHAMELEON_PKGCONFIG_LIBS_PRIVATE "${QUARK_LIBRARIES_DEP}")
    endif()

    if(NOT CHAMELEON_SIMULATION)

        list(APPEND COREBLAS_PKGCONFIG_LIBS_PRIVATE
        ${LAPACKE_LIBRARIES_DEP}
        ${CBLAS_LIBRARIES_DEP}
        )
        list(APPEND CHAMELEON_PKGCONFIG_LIBS_PRIVATE
        ${EXTRA_LIBRARIES}
        )
        list(APPEND CHAMELEON_PKGCONFIG_REQUIRED "coreblas")

        if(CHAMELEON_USE_CUDA)
            list(APPEND CUDABLAS_PKGCONFIG_LIBS_PRIVATE ${EXTRA_LIBRARIES_CUDA})
            list(APPEND CHAMELEON_PKGCONFIG_REQUIRED "cudablas")
        endif()

    else(NOT CHAMELEON_SIMULATION)

        if(CHAMELEON_USE_CUDA)
            list(APPEND CHAMELEON_PKGCONFIG_LIBS -lcudablas)
        endif()
        list(APPEND CHAMELEON_PKGCONFIG_LIBS
        -lcoreblas
        ${EXTRA_LIBRARIES}
        )

    endif(NOT CHAMELEON_SIMULATION)

    # Define required package
    # -----------------------
    CLEAN_LIB_LIST(CHAMELEON)
    CLEAN_LIB_LIST(COREBLAS)
    if(CHAMELEON_USE_CUDA)
        CLEAN_LIB_LIST(CUDABLAS)
    endif()

    # Create .pc file
    # ---------------
    SET(_output_chameleon_file "${CMAKE_BINARY_DIR}/chameleon.pc")
    SET(_output_coreblas_file "${CMAKE_BINARY_DIR}/coreblas.pc")
    if(CHAMELEON_USE_CUDA)
        SET(_output_cudablas_file "${CMAKE_BINARY_DIR}/cudablas.pc")
    endif()

    # TODO: add url of CHAMELEON releases in .pc file
    CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/lib/pkgconfig/chameleon.pc.in" "${_output_chameleon_file}" @ONLY)
    CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/lib/pkgconfig/coreblas.pc.in"  "${_output_coreblas_file}" @ONLY)
    if(CHAMELEON_USE_CUDA)
        CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/lib/pkgconfig/cudablas.pc.in"  "${_output_cudablas_file}" @ONLY)
    endif()

    # installation
    # ------------
    INSTALL(FILES ${_output_chameleon_file} DESTINATION lib/pkgconfig)
    INSTALL(FILES ${_output_coreblas_file}  DESTINATION lib/pkgconfig)
    INSTALL(FILES ${_output_cudablas_file}  DESTINATION lib/pkgconfig)

ENDMACRO(GENERATE_PKGCONFIG_FILE)

##
## @end file GenPkgConfig.cmake
##
