GenPkgConfig.cmake 6.43 KB
Newer Older
1 2
###
#
3 4
# @file GenPkgConfig.cmake
#
Mathieu Faverge's avatar
Mathieu Faverge committed
5 6
# @copyright 2009-2014 The University of Tennessee and The University of
#                      Tennessee Research Foundation. All rights reserved.
7 8
# @copyright 2012-2017 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
#                      Univ. Bordeaux. All rights reserved.
9 10 11 12 13 14 15 16 17
#
###
#
#  @project MORSE
#  MORSE is a software package provided by:
#     Inria Bordeaux - Sud-Ouest,
#     Univ. of Tennessee,
#     King Abdullah Univesity of Science and Technology
#     Univ. of California Berkeley,
18
#     Univ. of Colorado Denver.
19
#
Mathieu Faverge's avatar
Mathieu Faverge committed
20
# @version 1.0.0
21 22 23 24
#  @author Cedric Castagnede
#  @author Emmanuel Agullo
#  @author Mathieu Faverge
#  @author Florent Pruvost
Mathieu Faverge's avatar
Mathieu Faverge committed
25
#  @date 2014-11-10
26 27 28 29 30
#
###

###
#
PRUVOST Florent's avatar
PRUVOST Florent committed
31 32
# CONVERT_LIBSTYLE_TO_PKGCONFIG: convert a libraries list to follow the pkg-config style
#                                used in CLEAN_LIB_LIST
33 34
#
###
PRUVOST Florent's avatar
PRUVOST Florent committed
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
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
59
#                 used in GENERATE_PKGCONFIG_FILE
PRUVOST Florent's avatar
PRUVOST Florent committed
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
#
###
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)
81

82 83 84 85
    # The definitions that should be given to users (change the API)
    set(CHAMELEON_PKGCONFIG_DEFINITIONS "")
    set(COREBLAS_PKGCONFIG_DEFINITIONS "")
    set(CUDABLAS_PKGCONFIG_DEFINITIONS "")
86

87 88
    # The link flags specific to this package and any required libraries
    # that don't support PkgConfig
PRUVOST Florent's avatar
PRUVOST Florent committed
89 90 91 92
    set(CHAMELEON_PKGCONFIG_LIBS "-lchameleon")
    set(COREBLAS_PKGCONFIG_LIBS  "-lcoreblas")
    set(CUDABLAS_PKGCONFIG_LIBS  "-lcudablas")

93 94 95
    # The link flags for private libraries required by this package but not
    # exposed to applications
    set(CHAMELEON_PKGCONFIG_LIBS_PRIVATE "")
PRUVOST Florent's avatar
PRUVOST Florent committed
96 97 98
    set(COREBLAS_PKGCONFIG_LIBS_PRIVATE  "")
    set(CUDABLAS_PKGCONFIG_LIBS_PRIVATE  "")

99
    # A list of packages required by this package
100
    set(CHAMELEON_PKGCONFIG_REQUIRED "hqr")
PRUVOST Florent's avatar
PRUVOST Florent committed
101 102
    set(COREBLAS_PKGCONFIG_REQUIRED  "")
    set(CUDABLAS_PKGCONFIG_REQUIRED  "")
103

104 105 106
    # A list of private packages required by this package but not exposed to
    # applications
    set(CHAMELEON_PKGCONFIG_REQUIRED_PRIVATE "")
PRUVOST Florent's avatar
PRUVOST Florent committed
107 108
    set(COREBLAS_PKGCONFIG_REQUIRED_PRIVATE  "")
    set(CUDABLAS_PKGCONFIG_REQUIRED_PRIVATE  "")
109 110 111 112

    if(CHAMELEON_SCHED_STARPU)
        list(APPEND CHAMELEON_PKGCONFIG_LIBS -lchameleon_starpu)
        if ( CHAMELEON_USE_MPI )
PRUVOST Florent's avatar
PRUVOST Florent committed
113
            list(APPEND CHAMELEON_PKGCONFIG_REQUIRED_PRIVATE starpumpi-${STARPU_VERSION})
114
        else()
PRUVOST Florent's avatar
PRUVOST Florent committed
115
            list(APPEND CHAMELEON_PKGCONFIG_REQUIRED_PRIVATE starpu-${STARPU_VERSION})
116 117 118
        endif()
    elseif(CHAMELEON_SCHED_QUARK)
        list(APPEND CHAMELEON_PKGCONFIG_LIBS -lchameleon_quark)
PRUVOST Florent's avatar
PRUVOST Florent committed
119
        list(APPEND CHAMELEON_PKGCONFIG_LIBS_PRIVATE "${QUARK_LIBRARIES_DEP}")
120 121 122 123
    endif()

    if(NOT CHAMELEON_SIMULATION)

PRUVOST Florent's avatar
PRUVOST Florent committed
124 125 126 127 128
        list(APPEND COREBLAS_PKGCONFIG_LIBS_PRIVATE
        ${LAPACKE_LIBRARIES_DEP}
        ${CBLAS_LIBRARIES_DEP}
        )
        list(APPEND CHAMELEON_PKGCONFIG_LIBS_PRIVATE
129 130
        ${EXTRA_LIBRARIES}
        )
PRUVOST Florent's avatar
PRUVOST Florent committed
131
        list(APPEND CHAMELEON_PKGCONFIG_REQUIRED "coreblas")
132

PRUVOST Florent's avatar
PRUVOST Florent committed
133
        if(CHAMELEON_USE_CUDA)
PRUVOST Florent's avatar
PRUVOST Florent committed
134
            list(APPEND CUDABLAS_PKGCONFIG_LIBS_PRIVATE ${EXTRA_LIBRARIES_CUDA})
PRUVOST Florent's avatar
PRUVOST Florent committed
135 136
            list(APPEND CHAMELEON_PKGCONFIG_REQUIRED "cudablas")
        endif()
137 138 139

    else(NOT CHAMELEON_SIMULATION)

PRUVOST Florent's avatar
PRUVOST Florent committed
140 141 142
        if(CHAMELEON_USE_CUDA)
            list(APPEND CHAMELEON_PKGCONFIG_LIBS -lcudablas)
        endif()
143
        list(APPEND CHAMELEON_PKGCONFIG_LIBS
144 145 146 147 148 149 150 151
        -lcoreblas
        ${EXTRA_LIBRARIES}
        )

    endif(NOT CHAMELEON_SIMULATION)

    # Define required package
    # -----------------------
PRUVOST Florent's avatar
PRUVOST Florent committed
152 153 154 155 156
    CLEAN_LIB_LIST(CHAMELEON)
    CLEAN_LIB_LIST(COREBLAS)
    if(CHAMELEON_USE_CUDA)
        CLEAN_LIB_LIST(CUDABLAS)
    endif()
157

158 159
    # Create .pc file
    # ---------------
PRUVOST Florent's avatar
PRUVOST Florent committed
160 161 162 163 164 165
    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()

166
    # TODO: add url of MORSE releases in .pc file
PRUVOST Florent's avatar
PRUVOST Florent committed
167 168 169 170 171
    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()
172 173 174

    # installation
    # ------------
PRUVOST Florent's avatar
PRUVOST Florent committed
175 176 177
    INSTALL(FILES ${_output_chameleon_file} DESTINATION lib/pkgconfig)
    INSTALL(FILES ${_output_coreblas_file}  DESTINATION lib/pkgconfig)
    INSTALL(FILES ${_output_cudablas_file}  DESTINATION lib/pkgconfig)
178 179 180 181 182 183

ENDMACRO(GENERATE_PKGCONFIG_FILE)

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