1set( LIB_NAME_BASE oapv ) 2 3set( LIB_SOVERSION 1) 4 5file (GLOB LIB_INC "../inc/*.h") 6file (GLOB LIB_API_SRC "oapv.c") 7file (GLOB LIB_BASE_SRC "oapv_*.c") 8file (GLOB LIB_BASE_INC "oapv_*.h" ) 9file (GLOB LIB_SSE_SRC "../src/sse/oapv_*.c") 10file (GLOB LIB_SSE_INC "../src/sse/oapv_*.h" ) 11file (GLOB LIB_NEON_SRC "../src/neon/oapv_*.c") 12file (GLOB LIB_NEON_INC "../src/neon/oapv_*.h" ) 13file (GLOB LIB_AVX_SRC "../src/avx/oapv_*.c") 14file (GLOB LIB_AVX_INC "../src/avx/oapv_*.h" ) 15 16include(GenerateExportHeader) 17include_directories("${CMAKE_BINARY_DIR}/include") 18 19message("SYSTEM_PROCESSOR=${CMAKE_SYSTEM_PROCESSOR}") 20 21if(${CMAKE_SYSTEM_PROCESSOR} MATCHES "^(arm|aarch)") 22 message(" ARM processor") 23 # add_definitions (-mfloat-abi=softfp -mfpu=neon) 24 add_definitions(-DARM=1) 25 set(ARM "TRUE") 26elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "^(x86|ia64|i386|i686)") 27 message(" X86 processor") 28 add_definitions(-DX86=1) 29 set(X86 "TRUE") 30endif() 31 32if( ${CMAKE_SYSTEM_PROCESSOR} MATCHES "64" ) 33 message(" 64-bit") 34 add_compile_definitions( _IS64BIT) 35endif() 36 37if(ARM) 38 add_library( ${LIB_NAME_BASE} STATIC ${LIB_API_SRC} ${LIB_INC} ${LIB_BASE_SRC} ${LIB_BASE_INC} 39 ${LIB_NEON_SRC} ${LIB_NEON_INC} ) 40 add_library( ${LIB_NAME_BASE}_dynamic SHARED ${LIB_API_SRC} ${LIB_INC} ${LIB_BASE_SRC} ${LIB_BASE_INC} 41 ${LIB_NEON_SRC} ${LIB_NEON_INC} ) 42else() 43 add_library( ${LIB_NAME_BASE} STATIC ${LIB_API_SRC} ${LIB_INC} ${LIB_BASE_SRC} ${LIB_BASE_INC} ${LIB_SSE_SRC} ${LIB_SSE_INC} 44 ${LIB_AVX_SRC} ${LIB_AVX_INC} ) 45 add_library( ${LIB_NAME_BASE}_dynamic SHARED ${LIB_API_SRC} ${LIB_INC} ${LIB_BASE_SRC} ${LIB_BASE_INC} ${LIB_SSE_SRC} ${LIB_SSE_INC} 46 ${LIB_AVX_SRC} ${LIB_AVX_INC} ) 47endif() 48 49set_target_properties(${LIB_NAME_BASE}_dynamic PROPERTIES VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR} SOVERSION ${LIB_SOVERSION}) 50 51# @todo Consider using WINDOWS_EXPORT_ALL_SYMBOLS instead of generate_export_header 52# @see https://cmake.org/cmake/help/latest/prop_tgt/WINDOWS_EXPORT_ALL_SYMBOLS.html#prop_tgt:WINDOWS_EXPORT_ALL_SYMBOLS 53#if(MSVC) 54 # @see https://blog.kitware.com/create-dlls-on-windows-without-declspec-using-new-cmake-export-all-feature/ 55 # @see https://cmake.org/cmake/help/v3.3/module/GenerateExportHeader.html 56 # 57 #set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS TRUE) 58 #set(BUILD_SHARED_LIBS TRUE) 59#endif() 60 61# Generate export macros for libraries 62generate_export_header(${LIB_NAME_BASE}_dynamic 63 BASE_NAME OAPV 64 EXPORT_FILE_NAME ${CMAKE_BINARY_DIR}/include/oapv/oapv_exports.h) 65 66# This will cause the export macros to expand to nothing when building the static library. 67set_target_properties(${LIB_NAME_BASE} PROPERTIES COMPILE_FLAGS -DLIBSHARED_AND_STATIC_STATIC_DEFINE) 68 69source_group("base\\header" FILES ${LIB_BASE_INC} ${LIB_INC}) 70source_group("base\\source" FILES ${LIB_BASE_SRC} ${LIB_API_SRC}) 71source_group("base\\sse\\header" FILES ${LIB_SSE_INC}) 72source_group("base\\sse\\source" FILES ${LIB_SSE_SRC}) 73source_group("base\\neon\\header" FILES ${LIB_NEON_INC}) 74source_group("base\\neon\\source" FILES ${LIB_NEON_SRC}) 75source_group("base\\avx\\header" FILES ${LIB_AVX_INC}) 76source_group("base\\avx\\source" FILES ${LIB_AVX_SRC}) 77 78 79if(ARM) 80 include_directories( ${LIB_NAME_BASE} PUBLIC . .. ../inc ./neon) 81else() 82 include_directories( ${LIB_NAME_BASE} PUBLIC . .. ../inc ./sse ./avx) 83endif() 84 85set_target_properties(${LIB_NAME_BASE} PROPERTIES FOLDER lib 86 ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) 87 88set( SSE ${BASE_INC_FILES} ${LIB_SSE_SRC}) 89set( AVX ${LIB_AVX_SRC} ) 90set( NEON ${LIB_NEON_SRC} ${LIB_NEON_INC}) 91set_target_properties(${LIB_NAME_BASE}_dynamic PROPERTIES OUTPUT_NAME ${LIB_NAME_BASE}) 92 93if( MSVC ) 94 target_compile_definitions( ${LIB_NAME_BASE} PUBLIC ANY _CRT_SECURE_NO_WARNINGS ) 95 set_target_properties(${LIB_NAME_BASE}_dynamic PROPERTIES FOLDER lib 96 RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) 97elseif( UNIX OR MINGW ) 98 99 if (ARM) 100 set_property( SOURCE ${NEON} APPEND PROPERTY COMPILE_FLAGS "-flax-vector-conversions" ) 101 else() 102 set_property( SOURCE ${SSE} APPEND PROPERTY COMPILE_FLAGS "-msse4.1" ) 103 set_property( SOURCE ${AVX} APPEND PROPERTY COMPILE_FLAGS " -mavx2" ) 104 endif() 105 106 set_target_properties(${LIB_NAME_BASE}_dynamic PROPERTIES FOLDER lib 107 LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) 108 target_compile_definitions( ${LIB_NAME_BASE} PUBLIC ANY LINUX ) 109 target_link_libraries(${LIB_NAME_BASE} m) 110endif() 111 112# Install rules 113# 114# Set DCMAKE_INSTALL_PREFIX to change default install prefix 115# e.g cmake .. -DSET_PROF=BASE -DCMAKE_INSTALL_PREFIX='/home/user/bin/' 116 117# List the headers we want to declare as public for installation. 118set(OAPV_PUBLIC_HEADERS "${LIB_INC}") 119set_target_properties(${LIB_NAME_BASE} PROPERTIES PUBLIC_HEADER "${OAPV_PUBLIC_HEADERS}") 120 121set(OAPV_PRIVATE_HEADERS "${LIB_BASE_INC}" "${LIB_SSE_INC}" "${LIB_AVX_INC}" "${LIB_NEON_INC}") 122 123# Install static library and public headers 124# 125# Static library (liboapv.a or oapv.lib) will be installed to <prefix>/lib/oapv 126# Public headers will be installed to <prefix>/include/oapv 127# 128include(GNUInstallDirs) 129install(TARGETS ${LIB_NAME_BASE} 130 ARCHIVE COMPONENT Development DESTINATION ${CMAKE_INSTALL_LIBDIR}/${LIB_NAME_BASE} 131 PUBLIC_HEADER COMPONENT Development DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${LIB_NAME_BASE} 132) 133 134# Install shared library 135# 136# On non-DLL platforms shared library (liboapv.so) will be installed to <prefix>/lib/oapv. 137# On DLL platforms the shred DLL (oapv.dll) will be installed to <prefix>/bin and its import library will be installed to <prefix>/lib/oapv/import 138# 139install(TARGETS ${LIB_NAME_BASE}_dynamic 140 RUNTIME COMPONENT Libraries DESTINATION ${CMAKE_INSTALL_BINDIR} 141 LIBRARY 142 COMPONENT Libraries DESTINATION ${CMAKE_INSTALL_LIBDIR} 143 NAMELINK_COMPONENT Development DESTINATION ${CMAKE_INSTALL_LIBDIR} 144 ARCHIVE COMPONENT Development DESTINATION ${CMAKE_INSTALL_LIBDIR}/${LIB_NAME_BASE}/import 145) 146 147install( FILES 148 ${PROJECT_BINARY_DIR}/include/oapv/oapv_exports.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${LIB_NAME_BASE} 149) 150 151if( NOT MSVC ) 152 configure_file( 153 "${CMAKE_SOURCE_DIR}/pkgconfig/${LIB_NAME_BASE}.pc.in" 154 "${CMAKE_BINARY_DIR}/${LIB_NAME_BASE}.pc" 155 IMMEDIATE @ONLY) 156 157 install( FILES 158 "${CMAKE_BINARY_DIR}/${LIB_NAME_BASE}.pc" DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig 159 ) 160endif() 161