set( LIB_NAME_BASE oapv ) set( LIB_SOVERSION 1) file (GLOB LIB_INC "../inc/*.h") file (GLOB LIB_API_SRC "oapv.c") file (GLOB LIB_BASE_SRC "oapv_*.c") file (GLOB LIB_BASE_INC "oapv_*.h" ) file (GLOB LIB_SSE_SRC "../src/sse/oapv_*.c") file (GLOB LIB_SSE_INC "../src/sse/oapv_*.h" ) file (GLOB LIB_NEON_SRC "../src/neon/oapv_*.c") file (GLOB LIB_NEON_INC "../src/neon/oapv_*.h" ) file (GLOB LIB_AVX_SRC "../src/avx/oapv_*.c") file (GLOB LIB_AVX_INC "../src/avx/oapv_*.h" ) include(GenerateExportHeader) include_directories("${CMAKE_BINARY_DIR}/include") message("SYSTEM_PROCESSOR=${CMAKE_SYSTEM_PROCESSOR}") if(${CMAKE_SYSTEM_PROCESSOR} MATCHES "^(arm|aarch)") message(" ARM processor") # add_definitions (-mfloat-abi=softfp -mfpu=neon) add_definitions(-DARM=1) set(ARM "TRUE") elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "^(x86|ia64|i386|i686)") message(" X86 processor") add_definitions(-DX86=1) set(X86 "TRUE") endif() if( ${CMAKE_SYSTEM_PROCESSOR} MATCHES "64" ) message(" 64-bit") add_compile_definitions( _IS64BIT) endif() if(ARM) add_library( ${LIB_NAME_BASE} STATIC ${LIB_API_SRC} ${LIB_INC} ${LIB_BASE_SRC} ${LIB_BASE_INC} ${LIB_NEON_SRC} ${LIB_NEON_INC} ) add_library( ${LIB_NAME_BASE}_dynamic SHARED ${LIB_API_SRC} ${LIB_INC} ${LIB_BASE_SRC} ${LIB_BASE_INC} ${LIB_NEON_SRC} ${LIB_NEON_INC} ) else() add_library( ${LIB_NAME_BASE} STATIC ${LIB_API_SRC} ${LIB_INC} ${LIB_BASE_SRC} ${LIB_BASE_INC} ${LIB_SSE_SRC} ${LIB_SSE_INC} ${LIB_AVX_SRC} ${LIB_AVX_INC} ) add_library( ${LIB_NAME_BASE}_dynamic SHARED ${LIB_API_SRC} ${LIB_INC} ${LIB_BASE_SRC} ${LIB_BASE_INC} ${LIB_SSE_SRC} ${LIB_SSE_INC} ${LIB_AVX_SRC} ${LIB_AVX_INC} ) endif() set_target_properties(${LIB_NAME_BASE}_dynamic PROPERTIES VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR} SOVERSION ${LIB_SOVERSION}) # @todo Consider using WINDOWS_EXPORT_ALL_SYMBOLS instead of generate_export_header # @see https://cmake.org/cmake/help/latest/prop_tgt/WINDOWS_EXPORT_ALL_SYMBOLS.html#prop_tgt:WINDOWS_EXPORT_ALL_SYMBOLS #if(MSVC) # @see https://blog.kitware.com/create-dlls-on-windows-without-declspec-using-new-cmake-export-all-feature/ # @see https://cmake.org/cmake/help/v3.3/module/GenerateExportHeader.html # #set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS TRUE) #set(BUILD_SHARED_LIBS TRUE) #endif() # Generate export macros for libraries generate_export_header(${LIB_NAME_BASE}_dynamic BASE_NAME OAPV EXPORT_FILE_NAME ${CMAKE_BINARY_DIR}/include/oapv/oapv_exports.h) # This will cause the export macros to expand to nothing when building the static library. set_target_properties(${LIB_NAME_BASE} PROPERTIES COMPILE_FLAGS -DLIBSHARED_AND_STATIC_STATIC_DEFINE) source_group("base\\header" FILES ${LIB_BASE_INC} ${LIB_INC}) source_group("base\\source" FILES ${LIB_BASE_SRC} ${LIB_API_SRC}) source_group("base\\sse\\header" FILES ${LIB_SSE_INC}) source_group("base\\sse\\source" FILES ${LIB_SSE_SRC}) source_group("base\\neon\\header" FILES ${LIB_NEON_INC}) source_group("base\\neon\\source" FILES ${LIB_NEON_SRC}) source_group("base\\avx\\header" FILES ${LIB_AVX_INC}) source_group("base\\avx\\source" FILES ${LIB_AVX_SRC}) if(ARM) include_directories( ${LIB_NAME_BASE} PUBLIC . .. ../inc ./neon) else() include_directories( ${LIB_NAME_BASE} PUBLIC . .. ../inc ./sse ./avx) endif() set_target_properties(${LIB_NAME_BASE} PROPERTIES FOLDER lib ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set( SSE ${BASE_INC_FILES} ${LIB_SSE_SRC}) set( AVX ${LIB_AVX_SRC} ) set( NEON ${LIB_NEON_SRC} ${LIB_NEON_INC}) set_target_properties(${LIB_NAME_BASE}_dynamic PROPERTIES OUTPUT_NAME ${LIB_NAME_BASE}) if( MSVC ) target_compile_definitions( ${LIB_NAME_BASE} PUBLIC ANY _CRT_SECURE_NO_WARNINGS ) set_target_properties(${LIB_NAME_BASE}_dynamic PROPERTIES FOLDER lib RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) elseif( UNIX OR MINGW ) if (ARM) set_property( SOURCE ${NEON} APPEND PROPERTY COMPILE_FLAGS "-flax-vector-conversions" ) else() set_property( SOURCE ${SSE} APPEND PROPERTY COMPILE_FLAGS "-msse4.1" ) set_property( SOURCE ${AVX} APPEND PROPERTY COMPILE_FLAGS " -mavx2" ) endif() set_target_properties(${LIB_NAME_BASE}_dynamic PROPERTIES FOLDER lib LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) target_compile_definitions( ${LIB_NAME_BASE} PUBLIC ANY LINUX ) target_link_libraries(${LIB_NAME_BASE} m) endif() # Install rules # # Set DCMAKE_INSTALL_PREFIX to change default install prefix # e.g cmake .. -DSET_PROF=BASE -DCMAKE_INSTALL_PREFIX='/home/user/bin/' # List the headers we want to declare as public for installation. set(OAPV_PUBLIC_HEADERS "${LIB_INC}") set_target_properties(${LIB_NAME_BASE} PROPERTIES PUBLIC_HEADER "${OAPV_PUBLIC_HEADERS}") set(OAPV_PRIVATE_HEADERS "${LIB_BASE_INC}" "${LIB_SSE_INC}" "${LIB_AVX_INC}" "${LIB_NEON_INC}") # Install static library and public headers # # Static library (liboapv.a or oapv.lib) will be installed to /lib/oapv # Public headers will be installed to /include/oapv # include(GNUInstallDirs) install(TARGETS ${LIB_NAME_BASE} ARCHIVE COMPONENT Development DESTINATION ${CMAKE_INSTALL_LIBDIR}/${LIB_NAME_BASE} PUBLIC_HEADER COMPONENT Development DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${LIB_NAME_BASE} ) # Install shared library # # On non-DLL platforms shared library (liboapv.so) will be installed to /lib/oapv. # On DLL platforms the shred DLL (oapv.dll) will be installed to /bin and its import library will be installed to /lib/oapv/import # install(TARGETS ${LIB_NAME_BASE}_dynamic RUNTIME COMPONENT Libraries DESTINATION ${CMAKE_INSTALL_BINDIR} LIBRARY COMPONENT Libraries DESTINATION ${CMAKE_INSTALL_LIBDIR} NAMELINK_COMPONENT Development DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE COMPONENT Development DESTINATION ${CMAKE_INSTALL_LIBDIR}/${LIB_NAME_BASE}/import ) install( FILES ${PROJECT_BINARY_DIR}/include/oapv/oapv_exports.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${LIB_NAME_BASE} ) if( NOT MSVC ) configure_file( "${CMAKE_SOURCE_DIR}/pkgconfig/${LIB_NAME_BASE}.pc.in" "${CMAKE_BINARY_DIR}/${LIB_NAME_BASE}.pc" IMMEDIATE @ONLY) install( FILES "${CMAKE_BINARY_DIR}/${LIB_NAME_BASE}.pc" DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig ) endif()