diff --git a/CMakeLists.txt b/CMakeLists.txt index 0243f68..bbe98e9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -94,13 +94,12 @@ project(fbgemm VERSION 0.1 LANGUAGES CXX C) include(GNUInstallDirs) # Load Python -find_package(PythonInterp) - -set(FBGEMM_LIBRARY_TYPE "default" - CACHE STRING - "Type of library (shared, static, or default) to build") +if(BUILD_SHARED_LIBS) +set(FBGEMM_LIBRARY_TYPE "shared") +else() +set(FBGEMM_LIBRARY_TYPE "static") +endif() -set_property(CACHE FBGEMM_LIBRARY_TYPE PROPERTY STRINGS default static shared) option(FBGEMM_BUILD_TESTS "Build fbgemm unit tests" ON) option(FBGEMM_BUILD_BENCHMARKS "Build fbgemm benchmarks" ON) option(FBGEMM_BUILD_DOCS "Build fbgemm documentation" OFF) @@ -178,11 +177,12 @@ add_dependencies(fbgemm_autovec defs.bzl) # 2) MSVC uses /MD in default cxx compiling flags, # Need to change it to /MT in static case if(MSVC) - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4244 /wd4267 /wd4305 /wd4309") + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4244 /wd4267 /wd4305 /wd4309 /wd4703 /bigobj") if(FBGEMM_LIBRARY_TYPE STREQUAL "static") target_compile_definitions(fbgemm_generic PRIVATE ASMJIT_STATIC) target_compile_definitions(fbgemm_avx2 PRIVATE ASMJIT_STATIC) target_compile_definitions(fbgemm_avx512 PRIVATE ASMJIT_STATIC) +if(FALSE) foreach(flag_var CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) @@ -190,6 +190,7 @@ if(MSVC) string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}") endif(${flag_var} MATCHES "/MD") endforeach(flag_var) +endif() endif() target_compile_options(fbgemm_avx2 PRIVATE "/arch:AVX2") target_compile_options(fbgemm_avx512 PRIVATE "/arch:AVX512") @@ -199,7 +200,6 @@ if(MSVC) else(MSVC) string(APPEND CMAKE_CXX_FLAGS " -Wall") string(APPEND CMAKE_CXX_FLAGS " -Wextra") - string(APPEND CMAKE_CXX_FLAGS " -Werror") string(APPEND CMAKE_CXX_FLAGS " -Wno-deprecated-declarations") string(APPEND CMAKE_CXX_FLAGS " -Wunknown-pragmas") string(APPEND CMAKE_CXX_FLAGS " -Wimplicit-fallthrough") @@ -247,6 +247,8 @@ message(WARNING "CMAKE_CXX_FLAGS_DEBUG is ${CMAKE_CXX_FLAGS_DEBUG}") message(WARNING "CMAKE_CXX_FLAGS_RELEASE is ${CMAKE_CXX_FLAGS_RELEASE}") message(WARNING "==========") +find_package(asmjit CONFIG REQUIRED) # target 'asmjit::asmjit' +add_library(asmjit ALIAS asmjit::asmjit) if(NOT TARGET asmjit) # Download asmjit from github if ASMJIT_SRC_DIR is not specified. if(NOT DEFINED ASMJIT_SRC_DIR) @@ -280,6 +282,8 @@ if(NOT TARGET asmjit) endif() endif() +find_package(cpuinfo CONFIG REQUIRED) # target 'cpuinfo::cpuinfo' +add_library(cpuinfo ALIAS cpuinfo::cpuinfo) if(NOT TARGET cpuinfo) #Download cpuinfo from github if CPUINFO_SOURCE_DIR is not specified. if(NOT DEFINED CPUINFO_SOURCE_DIR) @@ -301,26 +305,26 @@ endif() target_include_directories(fbgemm_generic BEFORE PUBLIC $ PUBLIC $ - PRIVATE "${ASMJIT_SRC_DIR}/src" - PRIVATE "${CPUINFO_SOURCE_DIR}/include") +) +target_link_libraries(fbgemm_generic PUBLIC asmjit::asmjit cpuinfo::cpuinfo) target_include_directories(fbgemm_avx2 BEFORE PUBLIC $ PUBLIC $ - PRIVATE "${ASMJIT_SRC_DIR}/src" - PRIVATE "${CPUINFO_SOURCE_DIR}/include") +) +target_link_libraries(fbgemm_avx2 PUBLIC asmjit::asmjit cpuinfo::cpuinfo) target_include_directories(fbgemm_avx512 BEFORE PUBLIC $ PUBLIC $ - PRIVATE "${ASMJIT_SRC_DIR}/src" - PRIVATE "${CPUINFO_SOURCE_DIR}/include") +) +target_link_libraries(fbgemm_avx512 PUBLIC asmjit::asmjit cpuinfo::cpuinfo) target_include_directories(fbgemm_autovec BEFORE PUBLIC $ PUBLIC $ - PRIVATE "${ASMJIT_SRC_DIR}/src" - PRIVATE "${CPUINFO_SOURCE_DIR}/include") +) +target_link_libraries(fbgemm_autovec PUBLIC asmjit::asmjit cpuinfo::cpuinfo) if(FBGEMM_LIBRARY_TYPE STREQUAL "default") add_library(fbgemm @@ -338,6 +342,7 @@ elseif(FBGEMM_LIBRARY_TYPE STREQUAL "shared") set_property(TARGET fbgemm_avx2 PROPERTY POSITION_INDEPENDENT_CODE ON) set_property(TARGET fbgemm_avx512 PROPERTY POSITION_INDEPENDENT_CODE ON) set_property(TARGET fbgemm_autovec PROPERTY POSITION_INDEPENDENT_CODE ON) + set_target_properties(fbgemm PROPERTIES CXX_VISIBILITY_PRESET hidden) elseif(FBGEMM_LIBRARY_TYPE STREQUAL "static") add_library(fbgemm STATIC $ @@ -346,11 +351,11 @@ elseif(FBGEMM_LIBRARY_TYPE STREQUAL "static") $) #MSVC need to define FBGEMM_STATIC for fbgemm_generic also to #avoid generating _dllimport functions. - target_compile_definitions(fbgemm_generic PRIVATE FBGEMM_STATIC) - target_compile_definitions(fbgemm_avx2 PRIVATE FBGEMM_STATIC) - target_compile_definitions(fbgemm_avx512 PRIVATE FBGEMM_STATIC) - target_compile_definitions(fbgemm_autovec PRIVATE FBGEMM_STATIC) - target_compile_definitions(fbgemm PRIVATE FBGEMM_STATIC) + target_compile_definitions(fbgemm_generic PUBLIC FBGEMM_STATIC) + target_compile_definitions(fbgemm_avx2 PUBLIC FBGEMM_STATIC) + target_compile_definitions(fbgemm_avx512 PUBLIC FBGEMM_STATIC) + target_compile_definitions(fbgemm_autovec PUBLIC FBGEMM_STATIC) + target_compile_definitions(fbgemm PUBLIC FBGEMM_STATIC) else() message(FATAL_ERROR "Unsupported library type ${FBGEMM_LIBRARY_TYPE}") endif() @@ -364,20 +369,15 @@ target_include_directories(fbgemm BEFORE PUBLIC $ PUBLIC $) -target_link_libraries(fbgemm - $ - $) -add_dependencies(fbgemm - asmjit - cpuinfo) +target_link_libraries(fbgemm PUBLIC asmjit::asmjit cpuinfo::cpuinfo) if(OpenMP_FOUND) - target_link_libraries(fbgemm OpenMP::OpenMP_CXX) + target_link_libraries(fbgemm PUBLIC OpenMP::OpenMP_CXX) endif() install( TARGETS fbgemm - EXPORT fbgemmLibraryConfig + EXPORT unofficial-fbgemm-config-targets ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) #For windows @@ -387,11 +387,16 @@ install( DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/fbgemm") install( - EXPORT fbgemmLibraryConfig - DESTINATION share/cmake/fbgemm - FILE fbgemmLibraryConfig.cmake) + EXPORT unofficial-fbgemm-config-targets + FILE unofficial-fbgemm-config-targets.cmake + DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/fbgemmLibrary) -if(MSVC) +include(CMakePackageConfigHelpers) +configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in "${CMAKE_CURRENT_BINARY_DIR}/fbgemmLibraryConfig.cmake" INSTALL_DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/fbgemmLibrary) +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/fbgemmLibraryConfig.cmake DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/fbgemmLibrary) + + +if(FALSE) if(FBGEMM_LIBRARY_TYPE STREQUAL "shared") install( FILES $ $ diff --git a/Config.cmake.in b/Config.cmake.in new file mode 100644 index 0000000..e2e187d --- /dev/null +++ b/Config.cmake.in @@ -0,0 +1,8 @@ +@PACKAGE_INIT@ + +include(CMakeFindDependencyMacro) +find_dependency(asmjit) +find_dependency(cpuinfo) + + +include ( "${CMAKE_CURRENT_LIST_DIR}/unofficial-fbgemm-config-targets.cmake" )