From 4a54d784af0bec03fdc1f9889157a8c653969db9 Mon Sep 17 00:00:00 2001
From: David Robillard <d@drobilla.net>
Date: Fri, 1 Jan 2021 14:15:49 +0100
Subject: Remove the need for a generated configuration header

---
 src/serd_config.h | 115 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/serdi.c       |   4 +-
 src/system.c      |   8 ++--
 3 files changed, 121 insertions(+), 6 deletions(-)
 create mode 100644 src/serd_config.h

(limited to 'src')

diff --git a/src/serd_config.h b/src/serd_config.h
new file mode 100644
index 00000000..0038a981
--- /dev/null
+++ b/src/serd_config.h
@@ -0,0 +1,115 @@
+/*
+  Copyright 2021 David Robillard <http://drobilla.net>
+
+  Permission to use, copy, modify, and/or distribute this software for any
+  purpose with or without fee is hereby granted, provided that the above
+  copyright notice and this permission notice appear in all copies.
+
+  THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+  ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+*/
+
+/*
+  Configuration header that defines reasonable defaults at compile time.
+
+  This allows compile-time configuration from the command line (typically via
+  the build system) while still allowing the source to be built without any
+  configuration.  The build system can define SERD_NO_DEFAULT_CONFIG to disable
+  defaults, in which case it must define things like HAVE_FEATURE to enable
+  features.  The design here ensures that compiler warnings or
+  include-what-you-use will catch any mistakes.
+*/
+
+#ifndef SERD_CONFIG_H
+#define SERD_CONFIG_H
+
+// Define version unconditionally so a warning will catch a mismatch
+#define SERD_VERSION "0.30.7"
+
+#if !defined(SERD_NO_DEFAULT_CONFIG)
+
+// We need unistd.h to check _POSIX_VERSION
+#  ifndef SERD_NO_POSIX
+#    ifdef __has_include
+#      if __has_include(<unistd.h>)
+#        include <unistd.h>
+#      endif
+#    elif defined(__unix__)
+#      include <unistd.h>
+#    endif
+#  endif
+
+// C99 and C++11: aligned_alloc()
+#  ifndef HAVE_ALIGNED_ALLOC
+#    if !defined(__APPLE__) && !defined(_WIN32)
+#      if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L
+#        define HAVE_ALIGNED_ALLOC
+#      elif defined(__cplusplus) && __cplusplus >= 201103L)
+#        define HAVE_ALIGNED_ALLOC
+#      endif
+#    endif
+#  endif
+
+// POSIX.1-2001: fileno()
+#  ifndef HAVE_FILENO
+#    if defined(_POSIX_VERSION) && _POSIX_VERSION >= 200112L
+#      define HAVE_FILENO
+#    endif
+#  endif
+
+// POSIX.1-2001: posix_fadvise()
+#  ifndef HAVE_POSIX_FADVISE
+#    ifndef __APPLE__
+#      if defined(_POSIX_VERSION) && _POSIX_VERSION >= 200112L
+#        define HAVE_POSIX_FADVISE
+#      endif
+#    endif
+#  endif
+
+// POSIX.1-2001: posix_memalign()
+#  ifndef HAVE_POSIX_MEMALIGN
+#    if defined(_POSIX_VERSION) && _POSIX_VERSION >= 200112L
+#      define HAVE_POSIX_MEMALIGN
+#    endif
+#  endif
+
+#endif // !defined(SERD_NO_DEFAULT_CONFIG)
+
+/*
+  Make corresponding USE_FEATURE defines based on the HAVE_FEATURE defines from
+  above or the command line.  The code checks for these using #if (not #ifdef),
+  so there will be an undefined warning if it checks for an unknown feature,
+  and this header is always required by any code that checks for features, even
+  if the build system defines them all.
+*/
+
+#ifdef HAVE_ALIGNED_ALLOC
+#  define USE_ALIGNED_ALLOC 1
+#else
+#  define USE_ALIGNED_ALLOC 0
+#endif
+
+#ifdef HAVE_FILENO
+#  define USE_FILENO 1
+#else
+#  define USE_FILENO 0
+#endif
+
+#ifdef HAVE_POSIX_FADVISE
+#  define USE_POSIX_FADVISE 1
+#else
+#  define USE_POSIX_FADVISE 0
+#endif
+
+#ifdef HAVE_POSIX_MEMALIGN
+#  define USE_POSIX_MEMALIGN 1
+#else
+#  define USE_POSIX_MEMALIGN 0
+#endif
+
+#endif // SERD_CONFIG_H
diff --git a/src/serdi.c b/src/serdi.c
index 44644ff4..550da3c0 100644
--- a/src/serdi.c
+++ b/src/serdi.c
@@ -27,7 +27,7 @@
 #  include <io.h>
 #endif
 
-#if defined(HAVE_POSIX_FADVISE) && defined(HAVE_FILENO)
+#if USE_POSIX_FADVISE && USE_FILENO
 #  include <fcntl.h>
 #endif
 
@@ -141,7 +141,7 @@ serd_fopen(const char* path, const char* mode)
     return NULL;
   }
 
-#if defined(HAVE_POSIX_FADVISE) && defined(HAVE_FILENO)
+#if USE_POSIX_FADVISE && USE_FILENO
   posix_fadvise(fileno(fd), 0, 0, POSIX_FADV_SEQUENTIAL | POSIX_FADV_NOREUSE);
 #endif
 
diff --git a/src/system.c b/src/system.c
index 3f10b86b..5b40583b 100644
--- a/src/system.c
+++ b/src/system.c
@@ -21,7 +21,7 @@
 #include "serd_config.h"
 #include "serd_internal.h"
 
-#if defined(HAVE_POSIX_FADVISE) && defined(HAVE_FILENO)
+#if USE_POSIX_FADVISE && USE_FILENO
 #  include <fcntl.h>
 #endif
 
@@ -44,7 +44,7 @@ serd_fopen(const char* path, const char* mode)
     return NULL;
   }
 
-#if defined(HAVE_POSIX_FADVISE) && defined(HAVE_FILENO)
+#if USE_POSIX_FADVISE && USE_FILENO
   posix_fadvise(fileno(fd), 0, 0, POSIX_FADV_SEQUENTIAL);
 #endif
   return fd;
@@ -55,9 +55,9 @@ serd_malloc_aligned(const size_t alignment, const size_t size)
 {
 #if defined(_WIN32)
   return _aligned_malloc(size, alignment);
-#elif __STDC_VERSION__ >= 201112L && defined(HAVE_ALIGNED_ALLOC)
+#elif USE_ALIGNED_ALLOC
   return aligned_alloc(alignment, size);
-#elif defined(HAVE_POSIX_MEMALIGN)
+#elif USE_POSIX_MEMALIGN
   void*     ptr = NULL;
   const int ret = posix_memalign(&ptr, alignment, size);
   return ret ? NULL : ptr;
-- 
cgit v1.2.1