xref: /aosp_15_r20/external/flac/src/libFLAC/CMakeLists.txt (revision 600f14f40d737144c998e2ec7a483122d3776fbc)
1option(WITH_ASM "Use any assembly optimization routines" ON)
2
3check_include_file("cpuid.h" HAVE_CPUID_H)
4check_include_file("sys/param.h" HAVE_SYS_PARAM_H)
5
6set(CMAKE_REQUIRED_LIBRARIES m)
7check_function_exists(lround HAVE_LROUND)
8
9include(CheckCSourceCompiles)
10include(CheckCPUArch)
11include(CheckA64NEON)
12
13check_cpu_arch_x64(FLAC__CPU_X86_64)
14if(NOT FLAC__CPU_X86_64)
15    check_cpu_arch_x86(FLAC__CPU_IA32)
16endif()
17
18if(FLAC__CPU_X86_64 OR FLAC__CPU_IA32)
19    set(FLAC__ALIGN_MALLOC_DATA 1)
20    option(WITH_AVX "Enable AVX, AVX2 optimizations (with runtime detection, resulting binary does not require AVX2, so only necessary when a compiler doesn't know about AVX)" ON)
21    if(WITH_AVX AND MSVC)
22        set_source_files_properties(fixed_intrin_avx2.c lpc_intrin_avx2.c stream_encoder_intrin_avx2.c lpc_intrin_fma.c PROPERTIES COMPILE_FLAGS /arch:AVX2)
23    endif()
24else()
25    check_cpu_arch_arm64(FLAC__CPU_ARM64)
26    if(FLAC__CPU_ARM64)
27         check_a64neon(FLAC__HAS_A64NEONINTRIN)
28    endif()
29endif()
30
31if(NOT WITH_ASM)
32    add_definitions(-DFLAC__NO_ASM)
33endif()
34
35include_directories("include")
36
37add_library(FLAC
38    bitmath.c
39    bitreader.c
40    bitwriter.c
41    cpu.c
42    crc.c
43    fixed.c
44    fixed_intrin_sse2.c
45    fixed_intrin_ssse3.c
46    fixed_intrin_sse42.c
47    fixed_intrin_avx2.c
48    float.c
49    format.c
50    lpc.c
51    lpc_intrin_neon.c
52    lpc_intrin_sse2.c
53    lpc_intrin_sse41.c
54    lpc_intrin_avx2.c
55    lpc_intrin_fma.c
56    md5.c
57    memory.c
58    metadata_iterators.c
59    metadata_object.c
60    stream_decoder.c
61    stream_encoder.c
62    stream_encoder_intrin_sse2.c
63    stream_encoder_intrin_ssse3.c
64    stream_encoder_intrin_avx2.c
65    stream_encoder_framing.c
66    version.rc
67    window.c
68    $<$<BOOL:${WIN32}>:../../include/share/win_utf8_io.h>
69    $<$<BOOL:${WIN32}>:../share/win_utf8_io/win_utf8_io.c>
70    $<$<BOOL:${OGG_FOUND}>:ogg_decoder_aspect.c>
71    $<$<BOOL:${OGG_FOUND}>:ogg_encoder_aspect.c>
72    $<$<BOOL:${OGG_FOUND}>:ogg_helper.c>
73    $<$<BOOL:${OGG_FOUND}>:ogg_mapping.c>)
74set_property(TARGET FLAC PROPERTY PROJECT_LABEL "libFLAC")
75if(TARGET FLAC-asm)
76    target_sources(FLAC PRIVATE $<TARGET_OBJECTS:FLAC-asm>)
77endif()
78
79target_compile_definitions(FLAC
80    PRIVATE $<$<BOOL:${BUILD_SHARED_LIBS}>:FLAC_API_EXPORTS>
81    PUBLIC $<$<NOT:$<BOOL:${BUILD_SHARED_LIBS}>>:FLAC__NO_DLL>)
82if(NOT WIN32)
83    target_compile_definitions(FLAC PRIVATE $<$<BOOL:${BUILD_SHARED_LIBS}>:FLAC__USE_VISIBILITY_ATTR>)
84endif()
85target_include_directories(FLAC INTERFACE
86    "$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>"
87    "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>")
88target_link_libraries(FLAC PUBLIC $<$<BOOL:${HAVE_LROUND}>:m>)
89if(TARGET Ogg::ogg)
90    target_link_libraries(FLAC PUBLIC Ogg::ogg)
91endif()
92if(BUILD_SHARED_LIBS)
93    set_target_properties(FLAC PROPERTIES
94        VERSION 12.1.0
95        SOVERSION 12)
96    if(NOT WIN32)
97        set_target_properties(FLAC PROPERTIES C_VISIBILITY_PRESET hidden)
98    endif()
99endif()
100
101check_c_compiler_flag("-fassociative-math -fno-signed-zeros -fno-trapping-math -freciprocal-math" HAVE_ASSOC_MATH)
102
103if(MSVC)
104        target_compile_options(FLAC BEFORE PRIVATE "/fp:fast")
105else()
106    if(HAVE_ASSOC_MATH)
107        target_compile_options(FLAC BEFORE PRIVATE -fassociative-math -fno-signed-zeros -fno-trapping-math -freciprocal-math)
108    endif()
109endif()
110
111add_library(FLAC::FLAC ALIAS FLAC)
112
113install(TARGETS FLAC EXPORT targets
114    ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}/"
115    LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}/"
116    RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}/")
117
118if(INSTALL_PKGCONFIG_MODULES)
119    set(prefix "${CMAKE_INSTALL_PREFIX}")
120    set(exec_prefix "${CMAKE_INSTALL_PREFIX}")
121    set(libdir "${CMAKE_INSTALL_FULL_LIBDIR}")
122    set(includedir "${CMAKE_INSTALL_FULL_INCLUDEDIR}")
123    configure_file(flac.pc.in flac.pc @ONLY)
124    install(FILES "${CMAKE_CURRENT_BINARY_DIR}/flac.pc"
125        DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
126endif()
127