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)
8 check_c_compiler_flag(-msse2 HAVE_MSSE2_FLAG)
9 if(HAVE_MSSE2_FLAG AND WITH_SSE)
10 add_compile_options(-msse2)
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)
32 add_compile_definitions(
34 FLAC__ALIGN_MALLOC_DATA)
35 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "([xX]|i[346])86")
37 add_compile_definitions(
39 FLAC__ALIGN_MALLOC_DATA)
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)
50 add_compile_definitions(FLAC__NO_ASM)
53 if(WITH_ASM AND IA32 AND CMAKE_ASM_NASM_COMPILER)
54 add_subdirectory(ia32)
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)
86 stream_encoder_intrin_sse2.c
87 stream_encoder_intrin_ssse3.c
88 stream_encoder_intrin_avx2.c
89 stream_encoder_framing.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>)
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")