xref: /aosp_15_r20/external/libopenapv/src/CMakeLists.txt (revision abb65b4b03b69e1d508d4d9a44dcf199df16e7c3)
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