FindOGG.cmake module added
[flac.git] / src / libFLAC / CMakeLists.txt
blob13f14751e3d2a88cc7e96949b978960ec3710dd2
1 cmake_minimum_required(VERSION 3.12)
3 if(CMAKE_SYSTEM_PROCESSOR MATCHES "[xX]86(_64)?|(AMD|amd)64|i[346]86")
4     option(WITH_AVX "Enable AVX, AVX2 optimizations" ON)
5     option(WITH_SSE "Enable AVX, AVX2 optimizations" ON)
6 endif()
8 check_c_compiler_flag(-msse2 HAVE_MSSE2_FLAG)
9 if(HAVE_MSSE2_FLAG AND WITH_SSE)
10     add_compile_options(-msse2)
11 endif()
13 option(WITH_ASM "Use any assembly optimization routines" ON)
15 check_include_file("cpuid.h" HAVE_CPUID_H)
16 check_include_file("sys/param.h" HAVE_SYS_PARAM_H)
18 set(CMAKE_REQUIRED_LIBRARIES m)
19 check_function_exists(lround HAVE_LROUND)
21 add_compile_definitions(
22     $<$<BOOL:${MSVC}>:_USE_MATH_DEFINES>
23     FLAC__USE_AVX=$<BOOL:${WITH_AVX}>
24     HAVE_LROUND=$<BOOL:${HAVE_LROUND}>
25     $<$<BOOL:${HAVE_CPUID_H}>:HAVE_CPUID_H>
26     $<$<OR:$<CONFIG:Debug>,$<CONFIG:RelWithDebInfo>>:FLAC__OVERFLOW_DETECT>)
28 if(CMAKE_SYSTEM_PROCESSOR MATCHES "[xX]86_64|(AMD|amd)64")
29     if(CMAKE_SIZEOF_VOID_P EQUAL 4)
30         set(IA32 TRUE)
31     endif()
32     add_compile_definitions(
33         FLAC__CPU_X86_64
34         FLAC__ALIGN_MALLOC_DATA)
35 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "([xX]|i[346])86")
36     set(IA32 TRUE)
37     add_compile_definitions(
38         FLAC__CPU_IA32
39         FLAC__ALIGN_MALLOC_DATA)
40 endif()
42 include(CheckLanguage)
43 check_language(ASM_NASM)
44 if(CMAKE_ASM_NASM_COMPILER)
45     enable_language(ASM_NASM)
46     add_compile_definitions(FLAC__HAS_NASM)
47 endif()
49 if(NOT WITH_ASM)
50     add_compile_definitions(FLAC__NO_ASM)
51 endif()
53 if(WITH_ASM AND IA32 AND CMAKE_ASM_NASM_COMPILER)
54     add_subdirectory(ia32)
55 endif()
57 set(prefix "${CMAKE_INSTALL_PREFIX}")
58 set(exec_prefix "${CMAKE_INSTALL_PREFIX}")
59 set(libdir "${CMAKE_INSTALL_FULL_LIBDIR}")
60 set(includedir "${CMAKE_INSTALL_FULL_INCLUDEDIR}")
61 configure_file(flac.pc.in flac.pc @ONLY)
63 set(SOURCES
64     bitmath.c
65     bitreader.c
66     bitwriter.c
67     cpu.c
68     crc.c
69     fixed.c
70     fixed_intrin_sse2.c
71     fixed_intrin_ssse3.c
72     float.c
73     format.c
74     lpc.c
75     lpc_intrin_sse.c
76     lpc_intrin_sse2.c
77     lpc_intrin_sse41.c
78     lpc_intrin_avx2.c
79     lpc_intrin_vsx.c
80     md5.c
81     memory.c
82     metadata_iterators.c
83     metadata_object.c
84     stream_decoder.c
85     stream_encoder.c
86     stream_encoder_intrin_sse2.c
87     stream_encoder_intrin_ssse3.c
88     stream_encoder_intrin_avx2.c
89     stream_encoder_framing.c
90     window.c
91     $<$<BOOL:${OGG_FOUND}>:ogg_decoder_aspect.c>
92     $<$<BOOL:${OGG_FOUND}>:ogg_encoder_aspect.c>
93     $<$<BOOL:${OGG_FOUND}>:ogg_helper.c>
94     $<$<BOOL:${OGG_FOUND}>:ogg_mapping.c>
95     $<$<BOOL:${WIN32}>:windows_unicode_filenames.c>)
97 include_directories("include")
99 add_library(FLAC-static STATIC ${SOURCES})
100 target_compile_definitions(FLAC-static PUBLIC FLAC__NO_DLL)
101 target_include_directories(FLAC-static INTERFACE
102     "$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>"
103     "$<INSTALL_INTERFACE:${CMAKE_INSTALL_PREFIX}/include>")
104 target_link_libraries(FLAC-static PUBLIC
105     $<TARGET_NAME_IF_EXISTS:Ogg::Ogg-static>
106     $<TARGET_NAME_IF_EXISTS:FLAC-asm>
107     $<$<BOOL:${HAVE_LROUND}>:m>)
108 if(TARGET Ogg::Ogg-static)
109     target_link_libraries(FLAC-static PUBLIC
110         $<TARGET_NAME_IF_EXISTS:Ogg::Ogg-static>)
111 elseif(TARGET Ogg::Ogg)
112     target_link_libraries(FLAC-static PUBLIC
113         $<TARGET_NAME_IF_EXISTS:Ogg::Ogg>)
114 endif()
116 add_library(FLAC SHARED ${SOURCES})
117 target_compile_definitions(FLAC PRIVATE FLAC_API_EXPORTS FLAC__USE_VISIBILITY_ATTR)
118 target_include_directories(FLAC INTERFACE
119     "$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>"
120     "$<INSTALL_INTERFACE:${CMAKE_INSTALL_PREFIX}/include>")
121 target_link_libraries(FLAC PRIVATE
122     $<TARGET_NAME_IF_EXISTS:Ogg::Ogg>
123     $<TARGET_NAME_IF_EXISTS:FLAC-asm>
124     $<$<BOOL:${HAVE_LROUND}>:m>)
125 set_target_properties(FLAC PROPERTIES C_VISIBILITY_PRESET hidden)
127 install(TARGETS FLAC FLAC-static EXPORT targets
128     ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}/"
129     LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}/"
130     RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}/")
131 install(FILES "${CMAKE_CURRENT_BINARY_DIR}/flac.pc"
132     DESTINATION "${CMAKE_INSTALL_DATADIR}/pkgconfig")