shithub: opusfile

Download patch

ref: 0738af58b454ccdda238847a80db147d7597ad56
parent: 7d78117fe95644ed0765815f8430e6aac9f6cf7d
author: Hendrik <git@h3ndrk.de>
date: Sat May 29 04:21:51 EDT 2021

More improvements in CMakeLists.txt

Signed-off-by: Ralph Giles <giles@thaumas.net>
Signed-off-by: evpobr <evpobr@gmail.com>

--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -4,10 +4,12 @@
   LANGUAGES C
 )
 
-# TODO: port autotools options exactly
-option(BUILD_OPUSURL "Build opusurl" OFF)
+# TODO: build documentation?
+option(OP_DISABLE_HTTP "Disable HTTP support" OFF)
 option(OP_DISABLE_FLOAT_API "Disable floating-point API" OFF)
 option(OP_FIXED_POINT "Enable fixed-point calculation" OFF)
+option(OP_ENABLE_ASSERTIONS "Enable assertions in code" OFF)
+option(OP_DISABLE_EXAMPLES "Do not build example applications" OFF)
 
 include(GNUInstallDirs)
 
@@ -18,14 +20,15 @@
 include(CheckSymbolExists)
 cmake_push_check_state(RESET)
 list(APPEND CMAKE_REQUIRED_LIBRARIES "m")
-check_symbol_exists(lrintf "math.h" HAVE_LRINTF)
-# TODO: OP_HAVE_CLOCK_GETTIME
+check_symbol_exists(lrintf "math.h" OP_HAVE_LRINTF)
 cmake_pop_check_state()
 
 # TODO: shared libraries via BUILD_SHARED_LIBS does not work
 add_library(opusfile
+  "${CMAKE_CURRENT_SOURCE_DIR}/include/opusfile.h"
   "${CMAKE_CURRENT_SOURCE_DIR}/src/info.c"
   "${CMAKE_CURRENT_SOURCE_DIR}/src/internal.c"
+  "${CMAKE_CURRENT_SOURCE_DIR}/src/internal.h"
   "${CMAKE_CURRENT_SOURCE_DIR}/src/opusfile.c"
   "${CMAKE_CURRENT_SOURCE_DIR}/src/stream.c"
 )
@@ -34,8 +37,8 @@
   PRIVATE
     "${CMAKE_CURRENT_SOURCE_DIR}/include"
   INTERFACE
-    $<BUILD_INTERFACE:"${CMAKE_CURRENT_BINARY_DIR}/include">
-    $<INSTALL_INTERFACE:"${CMAKE_INSTALL_INCLUDEDIR}">
+    $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>
+    $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
 )
 target_link_libraries(opusfile
   PUBLIC
@@ -47,16 +50,20 @@
     $<$<C_COMPILER_ID:MSVC>:/wd4267>
     $<$<C_COMPILER_ID:MSVC>:/wd4244>
     $<$<C_COMPILER_ID:MSVC>:/wd4090>
-    -std=c89
-    -pedantic
-    -Wall
-    -Wextra
-    -Wno-parentheses
-    -Wno-long-long
+    $<$<C_COMPILER_ID:Clang,GNU>:-std=c89>
+    $<$<C_COMPILER_ID:Clang,GNU>:-pedantic>
+    $<$<C_COMPILER_ID:Clang,GNU>:-Wall>
+    $<$<C_COMPILER_ID:Clang,GNU>:-Wextra>
+    $<$<C_COMPILER_ID:Clang,GNU>:-Wno-parentheses>
+    $<$<C_COMPILER_ID:Clang,GNU>:-Wno-long-long>
+    $<$<C_COMPILER_ID:Clang,GNU>:-fvisibility=hidden>
 )
 target_compile_definitions(opusfile
   PRIVATE
-    $<${HAVE_LRINTF}:OP_HAVE_LRINTF>
+    $<$<BOOL:${OP_DISABLE_FLOAT_API}>:OP_DISABLE_FLOAT_API>
+    $<$<BOOL:${OP_FIXED_POINT}>:OP_FIXED_POINT>
+    $<$<BOOL:${OP_ENABLE_ASSERTIONS}>:OP_ENABLE_ASSERTIONS>
+    $<$<BOOL:${OP_HAVE_LRINTF}>:OP_HAVE_LRINTF>
 )
 install(TARGETS opusfile
   EXPORT opusfileTargets
@@ -66,23 +73,67 @@
   INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
 )
 
-if(BUILD_OPUSURL)
+if(NOT OP_DISABLE_HTTP)
   find_package(OpenSSL REQUIRED)
 
+  include(CheckIncludeFile)
+  include(CheckCSourceCompiles)
+  cmake_push_check_state(RESET)
+  if(WIN32)
+    check_include_file("winsock2.h" OP_HAVE_WINSOCK2_H)
+    if(NOT OP_HAVE_WINSOCK2_H)
+      message(FATAL_ERROR "HTTP support requires a Winsock socket library")
+    endif()
+  else()
+    check_include_file("sys/socket.h" OP_HAVE_SYS_SOCKET_H)
+    if(NOT OP_HAVE_SYS_SOCKET_H)
+      message(FATAL_ERROR "HTTP support requires a POSIX socket library")
+    endif()
+  endif()
+  check_c_source_compiles(
+    "#include <time.h>
+    int main(void)
+    {
+      struct timespec ts;
+      return clock_gettime(CLOCK_REALTIME, &ts);
+    }"
+    OP_HAVE_CLOCK_GETTIME
+  )
+  if(NOT OP_HAVE_CLOCK_GETTIME)
+    check_symbol_exists(ftime "sys/timeb.h" OP_HAVE_FTIME)
+    if(NOT OP_HAVE_FTIME)
+      message(FATAL_ERROR "HTTP support requires either clock_gettime() or ftime()")
+    endif()
+  endif()
+  cmake_pop_check_state()
+
   add_library(opusurl
     "${CMAKE_CURRENT_SOURCE_DIR}/src/http.c"
-    "${CMAKE_CURRENT_SOURCE_DIR}/src/wincerts.c"
+    "${CMAKE_CURRENT_SOURCE_DIR}/src/internal.c"  # TODO: duplicated symbols because already defined in opusfile?
+    "${CMAKE_CURRENT_SOURCE_DIR}/src/internal.h"
   )
   add_library(opusfile::opusurl ALIAS opusurl)
+  if(WIN32)
+    target_sources(opusurl PRIVATE
+      "${CMAKE_CURRENT_SOURCE_DIR}/src/wincerts.c"
+      "${CMAKE_CURRENT_SOURCE_DIR}/src/winerrno.h"
+    )
+  endif()
   target_include_directories(opusurl
     PRIVATE
       "${CMAKE_CURRENT_SOURCE_DIR}/include"
     INTERFACE
-      $<BUILD_INTERFACE:"${CMAKE_CURRENT_BINARY_DIR}/include">
-      $<INSTALL_INTERFACE:"${CMAKE_INSTALL_INCLUDEDIR}">
+      $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>
+      $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
   )
   target_compile_definitions(opusurl
     PRIVATE
+      $<$<BOOL:${OP_DISABLE_FLOAT_API}>:OP_DISABLE_FLOAT_API>
+      $<$<BOOL:${OP_FIXED_POINT}>:OP_FIXED_POINT>
+      $<$<BOOL:${OP_ENABLE_ASSERTIONS}>:OP_ENABLE_ASSERTIONS>
+      $<$<BOOL:${OP_HAVE_LRINTF}>:OP_HAVE_LRINTF>
+      $<$<BOOL:${OP_HAVE_CLOCK_GETTIME}>:OP_HAVE_CLOCK_GETTIME>
+      $<$<BOOL:${OP_HAVE_FTIME}>:OP_HAVE_FTIME>
       OP_ENABLE_HTTP
   )
   target_link_libraries(opusurl
@@ -89,8 +140,8 @@
     PRIVATE
       opusfile
       OpenSSL::SSL
-      ws2_32.lib
-      crypt32.lib
+      $<$<C_COMPILER_ID:MSVC>:ws2_32>
+      $<$<C_COMPILER_ID:MSVC>:crypt32>
   )
   target_compile_options(opusurl
     PRIVATE
@@ -97,12 +148,13 @@
       $<$<C_COMPILER_ID:MSVC>:/wd4267>
       $<$<C_COMPILER_ID:MSVC>:/wd4244>
       $<$<C_COMPILER_ID:MSVC>:/wd4090>
-      -std=c89
-      -pedantic
-      -Wall
-      -Wextra
-      -Wno-parentheses
-      -Wno-long-long
+      $<$<C_COMPILER_ID:Clang,GNU>:-std=c89>
+      $<$<C_COMPILER_ID:Clang,GNU>:-pedantic>
+      $<$<C_COMPILER_ID:Clang,GNU>:-Wall>
+      $<$<C_COMPILER_ID:Clang,GNU>:-Wextra>
+      $<$<C_COMPILER_ID:Clang,GNU>:-Wno-parentheses>
+      $<$<C_COMPILER_ID:Clang,GNU>:-Wno-long-long>
+      $<$<C_COMPILER_ID:Clang,GNU>:-fvisibility=hidden>
   )
   install(TARGETS opusurl
     EXPORT opusfileTargets
@@ -110,6 +162,74 @@
     LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
     ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
     INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
+  )
+endif()
+
+if(NOT OP_DISABLE_EXAMPLES)
+  add_executable(opusfile_example
+    "${CMAKE_CURRENT_SOURCE_DIR}/examples/opusfile_example.c"
+  )
+  add_executable(opusfile::opusfile_example ALIAS opusfile_example)
+  if(WIN32)
+    target_sources(opusfile_example PRIVATE
+      "${CMAKE_CURRENT_SOURCE_DIR}/examples/win32utf8.c"
+      "${CMAKE_CURRENT_SOURCE_DIR}/examples/win32utf8.h"
+    )
+  endif()
+  target_include_directories(opusfile_example
+    PRIVATE
+      "${CMAKE_CURRENT_SOURCE_DIR}/examples"
+  )
+  target_link_libraries(opusfile_example
+    PRIVATE
+      opusfile
+      opusurl
+  )
+  target_compile_options(opusfile_example
+    PRIVATE
+      $<$<C_COMPILER_ID:MSVC>:/wd4267>
+      $<$<C_COMPILER_ID:MSVC>:/wd4244>
+      $<$<C_COMPILER_ID:MSVC>:/wd4090>
+      $<$<C_COMPILER_ID:Clang,GNU>:-std=c89>
+      $<$<C_COMPILER_ID:Clang,GNU>:-pedantic>
+      $<$<C_COMPILER_ID:Clang,GNU>:-Wall>
+      $<$<C_COMPILER_ID:Clang,GNU>:-Wextra>
+      $<$<C_COMPILER_ID:Clang,GNU>:-Wno-parentheses>
+      $<$<C_COMPILER_ID:Clang,GNU>:-Wno-long-long>
+      $<$<C_COMPILER_ID:Clang,GNU>:-fvisibility=hidden>
+  )
+
+  add_executable(seeking_example
+    "${CMAKE_CURRENT_SOURCE_DIR}/examples/seeking_example.c"
+  )
+  add_executable(opusfile::seeking_example ALIAS seeking_example)
+  if(WIN32)
+    target_sources(seeking_example PRIVATE
+      "${CMAKE_CURRENT_SOURCE_DIR}/examples/win32utf8.c"
+      "${CMAKE_CURRENT_SOURCE_DIR}/examples/win32utf8.h"
+    )
+  endif()
+  target_include_directories(seeking_example
+    PRIVATE
+      "${CMAKE_CURRENT_SOURCE_DIR}/examples"
+  )
+  target_link_libraries(seeking_example
+    PRIVATE
+      opusfile
+      opusurl
+  )
+  target_compile_options(seeking_example
+    PRIVATE
+      $<$<C_COMPILER_ID:MSVC>:/wd4267>
+      $<$<C_COMPILER_ID:MSVC>:/wd4244>
+      $<$<C_COMPILER_ID:MSVC>:/wd4090>
+      $<$<C_COMPILER_ID:Clang,GNU>:-std=c89>
+      $<$<C_COMPILER_ID:Clang,GNU>:-pedantic>
+      $<$<C_COMPILER_ID:Clang,GNU>:-Wall>
+      $<$<C_COMPILER_ID:Clang,GNU>:-Wextra>
+      $<$<C_COMPILER_ID:Clang,GNU>:-Wno-parentheses>
+      $<$<C_COMPILER_ID:Clang,GNU>:-Wno-long-long>
+      $<$<C_COMPILER_ID:Clang,GNU>:-fvisibility=hidden>
   )
 endif()