Skip to content

Commit

Permalink
build: clean up cmake package file generation
Browse files Browse the repository at this point in the history
This also adds missing include path information. Closes oneapi-src#408 oneapi-src#409.

Co-authored-by: Alexander Grund <[email protected]>
  • Loading branch information
Roman Dubtsov and Flamefire committed Feb 25, 2019
1 parent 25959d1 commit ab126cd
Show file tree
Hide file tree
Showing 7 changed files with 85 additions and 87 deletions.
5 changes: 5 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@

cmake_minimum_required(VERSION 2.8)

if(POLICY CMP0022)
cmake_policy(SET CMP0022 NEW)
endif()

if(POLICY CMP0054)
cmake_policy(SET CMP0054 NEW)
endif()
Expand Down Expand Up @@ -65,6 +69,7 @@ set(CMAKE_EXAMPLE_CCXX_FLAGS) # EXAMPLE specifics
set(CMAKE_TEST_CCXX_FLAGS) # TESTS specifics

include(GNUInstallDirs)
include(CMakePackageConfigHelpers)

include("cmake/utils.cmake")
include("cmake/options.cmake")
Expand Down
7 changes: 7 additions & 0 deletions cmake/MKL.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,11 @@ function(detect_mkl LIBNAME)
set(MKLINC ${MKLINC} PARENT_SCOPE)
set(MKLLIB "${MKLLIB}" PARENT_SCOPE)
set(MKLDLL "${MKLDLL}" PARENT_SCOPE)
if(LIBNAME MATCHES "mklml")
set(MKLDNN_USES_MKL "MKLML:SHARED" PARENT_SCOPE)
else()
set(MKLDNN_USES_MKL "FULL:SHARED" PARENT_SCOPE)
endif()

set(MKLIOMP5LIB "${MKLIOMP5LIB}" PARENT_SCOPE)
set(MKLIOMP5DLL "${MKLIOMP5DLL}" PARENT_SCOPE)
Expand Down Expand Up @@ -219,6 +224,7 @@ function(set_static_mkl_libs libpath)
set(MKLLIB "${MKLLIB}" PARENT_SCOPE)
endfunction()

set(MKLDNN_USES_MKL "")
detect_mkl("mklml_intel")
detect_mkl("mklml_gnu")
detect_mkl("mklml")
Expand All @@ -230,6 +236,7 @@ if(HAVE_MKL)
get_filename_component(MKLLIBPATH "${MKLLIB}" PATH)
set_static_mkl_libs(${MKLLIBPATH})
list(APPEND EXTRA_STATIC_LIBS ${MKLLIB})
set(MKLDNN_USES_MKL "FULL:STATIC")
else()
list(APPEND EXTRA_SHARED_LIBS ${MKLLIB})
endif()
Expand Down
7 changes: 7 additions & 0 deletions cmake/OpenMP.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ set(OpenMP_cmake_included true)
include("cmake/Threading.cmake")
include("cmake/MKL.cmake")

set(MKLDNN_USES_INTEL_OPENMP FALSE)

if (APPLE AND CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
# OSX Clang doesn't have OpenMP by default.
# But we still want to build the library.
Expand All @@ -49,6 +51,7 @@ endmacro()
macro(use_intel_omp_rt)
# fast return
if (CMAKE_CXX_COMPILER_ID STREQUAL "Intel")
set(MKLDNN_USES_INTEL_OPENMP TRUE)
return()
endif()

Expand Down Expand Up @@ -119,6 +122,10 @@ if (MKLDNN_THREADING MATCHES "OMP")
else()
use_intel_omp_rt()
endif()

if(MKLIOMP5LIB)
set(MKLDNN_USES_INTEL_OPENMP TRUE)
endif()
else()
# Compilation happens with OpenMP to enable `#pragma omp simd`
# but during linkage OpenMP dependency should be avoided
Expand Down
6 changes: 6 additions & 0 deletions cmake/config.cmake.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
@PACKAGE_INIT@
include("${CMAKE_CURRENT_LIST_DIR}/@[email protected]")
set(MKLDNN_THREADING "@MKLDNN_THREADING@")
set(MKLDNN_USES_INTEL_OPENMP @MKLDNN_USES_INTEL_OPENMP@)
set(MKLDNN_USES_MKL "@MKLDNN_USES_MKL@")
check_required_components("@LIB_NAME@")
23 changes: 16 additions & 7 deletions cmake/utils.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -105,10 +105,19 @@ macro(append_to_windows_path_list path_list path)
endif()
endmacro()

# Strip path from all files in a list
macro(strip_paths out_list path_list)
foreach(item ${path_list})
get_filename_component(basename "${item}" NAME)
list(APPEND ${out_list} "${basename}")
endforeach(item)
endmacro()
function(target_link_libraries_private target list)
# Foreach is required for compatibility with 2.8.11 ways
foreach(lib ${list})
target_link_libraries(${target} LINK_PRIVATE
"$<BUILD_INTERFACE:${lib}>")
endforeach(lib)
endfunction()

function(target_link_libraries_public target list)
# Foreach is required for compatibility with 2.8.11 ways
foreach(lib ${list})
get_filename_component(base "${lib}" NAME)
target_link_libraries(${target} LINK_PUBLIC
"$<INSTALL_INTERFACE:${base}>")
endforeach(lib)
endfunction()
120 changes: 44 additions & 76 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,6 @@
# limitations under the License.
#===============================================================================

set(TARGET_NAME ${LIB_NAME})

file(GLOB_RECURSE HEADERS
${PROJECT_BINARY_DIR}/include/*.h
${CMAKE_CURRENT_SOURCE_DIR}/../include/*.h
Expand Down Expand Up @@ -91,61 +89,56 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL "Intel")
endif()
endif()

### Installation (https://github.com/forexample/package-example) {

# Introduce variables:
# * CMAKE_INSTALL_LIBDIR
# * CMAKE_INSTALL_BINDIR
# * CMAKE_INSTALL_INCLUDEDIR
add_library(${LIB_NAME} ${MKLDNN_LIBRARY_TYPE} ${HEADERS} ${SOURCES})
set_property(TARGET ${LIB_NAME} PROPERTY CXX_STANDARD 11)
set_property(TARGET ${LIB_NAME} PROPERTY CXX_STANDARD_REQUIRED ON)
set_property(TARGET ${LIB_NAME} PROPERTY VERSION "${PROJECT_VERSION}.0")
set_property(TARGET ${LIB_NAME} PROPERTY SOVERSION "0")
set_property(TARGET ${LIB_NAME} PROPERTY PUBLIC_HEADER ${HEADERS})

set(config_install_dir "${CMAKE_INSTALL_LIBDIR}/cmake/${LIB_NAME}")
set(generated_dir "${CMAKE_CURRENT_BINARY_DIR}/generated")
set(version_config "${generated_dir}/${LIB_NAME}ConfigVersion.cmake")
set(project_config "${generated_dir}/${LIB_NAME}Config.cmake")
set(TARGETS_EXPORT_NAME "${LIB_NAME}Targets")
set(namespace "${LIB_NAME}::")
target_include_directories(${LIB_NAME} PUBLIC
$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/../include>
# $<INSTALL_PREFIX> is required for compatibility with cmake 2.8
$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/${CMAKE_INSTALL_INCLUDEDIR}>
)

include(CMakePackageConfigHelpers)
target_link_libraries_private(${LIB_NAME}
"${EXTRA_SHARED_LIBS};${EXTRA_STATIC_LIBS}")
target_link_libraries_public(${LIB_NAME} "${EXTRA_SHARED_LIBS}")
if(MKLDNN_LIBRARY_TYPE STREQUAL "STATIC")
target_link_libraries_public(${LIB_NAME} "${EXTRA_STATIC_LIBS}")
endif()

set(LIB_EXPORT_NAME "${LIB_NAME}-targets")
install(TARGETS ${LIB_NAME}
EXPORT "${LIB_EXPORT_NAME}"
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")

# Write version and package config files
set(LIB_CONFIG_GENERATE_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated")
set(LIB_CONFIG_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/${LIB_NAME}")
set(LIB_VERSION_FILE
"${LIB_CONFIG_GENERATE_DIR}/${LIB_NAME}-config-version.cmake")
set(LIB_CONFIG_FILE
"${LIB_CONFIG_GENERATE_DIR}/${LIB_NAME}-config.cmake")
write_basic_package_version_file(
"${version_config}"
"${LIB_VERSION_FILE}"
VERSION ${PROJECT_VERSION}
COMPATIBILITY SameMajorVersion
)

# Use:
# * TARGETS_EXPORT_NAME
# * LIB_NAME
COMPATIBILITY SameMajorVersion)
configure_package_config_file(
"cmake/template/Config.cmake.in"
"${project_config}"
INSTALL_DESTINATION "${config_install_dir}"
)

install(
FILES "${project_config}" "${version_config}"
DESTINATION "${config_install_dir}"
)

install(
EXPORT "${TARGETS_EXPORT_NAME}"
NAMESPACE "${namespace}"
DESTINATION "${config_install_dir}"
)

### }

add_library(${TARGET_NAME} ${MKLDNN_LIBRARY_TYPE} ${HEADERS} ${SOURCES})
if (NOT ${CMAKE_VERSION_MAJOR} LESS 3)
add_library(${namespace}${TARGET_NAME} ALIAS ${TARGET_NAME})
endif()

target_include_directories(
${TARGET_NAME}
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/../include>
$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include>
)
"../cmake/config.cmake.in"
"${LIB_CONFIG_FILE}"
INSTALL_DESTINATION ${LIB_CONFIG_INSTALL_DIR})
install(FILES ${LIB_CONFIG_FILE} ${LIB_VERSION_FILE}
DESTINATION ${LIB_CONFIG_INSTALL_DIR})
string(TOUPPER "${LIB_NAME}::" LIB_NAMESPACE)
install(EXPORT ${LIB_EXPORT_NAME}
NAMESPACE ${LIB_NAMESPACE}
DESTINATION ${LIB_CONFIG_INSTALL_DIR})

# On Windows we need to add mkldnn.dll path to CTESTCONFIG_PATH which is later
# passed to ctest and Visual Studio solutions
Expand All @@ -161,28 +154,3 @@ if(WIN32)
endif()
set(CTESTCONFIG_PATH "${CTESTCONFIG_PATH}" PARENT_SCOPE)
endif()

# This is rather ugly, but required for the generator expressions to
# expand correctly
foreach(l IN LISTS EXTRA_SHARED_LIBS EXTRA_STATIC_LIBS)
target_link_libraries(${TARGET_NAME} LINK_PRIVATE $<BUILD_INTERFACE:${l}>)
endforeach()
strip_paths(EXTRA_SHARED_LIBS_PUBLIC "${EXTRA_SHARED_LIBS}")
foreach(l IN LISTS EXTRA_SHARED_LIBS_PUBLIC)
target_link_libraries(${TARGET_NAME} LINK_PUBLIC $<INSTALL_INTERFACE:${l}>)
endforeach()

set_property(TARGET ${TARGET_NAME} PROPERTY CXX_STANDARD 11)
set_property(TARGET ${TARGET_NAME} PROPERTY CXX_STANDARD_REQUIRED ON)
set_property(TARGET ${TARGET_NAME} PROPERTY VERSION "${PROJECT_VERSION}.0")
set_property(TARGET ${TARGET_NAME} PROPERTY SOVERSION "0")
set_property(TARGET ${TARGET_NAME} PROPERTY PUBLIC_HEADER ${HEADERS})

install(TARGETS ${TARGET_NAME}
EXPORT "${TARGETS_EXPORT_NAME}"
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
)
install(FILES ${HEADERS} DESTINATION include)
4 changes: 0 additions & 4 deletions src/cmake/template/Config.cmake.in

This file was deleted.

0 comments on commit ab126cd

Please sign in to comment.