Make build warnings-aware
authorLucas De Marchi <lucas.demarchi@intel.com>
Tue, 6 Aug 2013 22:50:24 +0000 (19:50 -0300)
committerLucas De Marchi <lucas.demarchi@intel.com>
Wed, 7 Aug 2013 21:49:38 +0000 (18:49 -0300)
Enable common warnings by default for the library. In order to enable it
for plugins it's better to first convert the build-sys to make it not
recursive.

configure.ac
m4/attributes.m4 [new file with mode: 0644]
src/lib/Makefile.am
src/lib/lightmediascanner_charset_conv.c
src/lib/lightmediascanner_check.c
src/lib/lightmediascanner_private.h
src/lib/lightmediascanner_process.c
src/lib/lightmediascanner_utils.c

index dbc8d0e..531fe23 100644 (file)
@@ -115,6 +115,63 @@ AC_LMS_OPTIONAL_MODULE([mp4], true, [CHECK_MODULE_MP4])
 AC_LMS_OPTIONAL_MODULE([id3], true)
 AC_LMS_OPTIONAL_MODULE([flac], true, [CHECK_MODULE_FLAC])
 
+
+#####################################################################
+# Default CFLAGS and LDFLAGS
+#####################################################################
+
+CC_CHECK_FLAGS_APPEND(with_cflags, [CFLAGS], [\
+                      -pipe \
+                      -DANOTHER_BRICK_IN_THE \
+                      -Wall \
+                      -W \
+                      -Wextra \
+                      -Wno-inline \
+                      -Wvla \
+                      -Wundef \
+                      -Wformat=2 \
+                      -Wlogical-op \
+                      -Wsign-compare \
+                      -Wformat-security \
+                      -Wmissing-include-dirs \
+                      -Wformat-nonliteral \
+                      -Wold-style-definition \
+                      -Wpointer-arith \
+                      -Winit-self \
+                      -Wdeclaration-after-statement \
+                      -Wfloat-equal \
+                      -Wmissing-prototypes \
+                      -Wstrict-prototypes \
+                      -Wredundant-decls \
+                      -Wmissing-declarations \
+                      -Wmissing-noreturn \
+                      -Wshadow \
+                      -Wendif-labels \
+                      -Wstrict-aliasing=2 \
+                      -Wwrite-strings \
+                      -Wno-long-long \
+                      -Wno-overlength-strings \
+                      -Wno-unused-parameter \
+                      -Wno-missing-field-initializers \
+                      -Wno-unused-result \
+                      -Wnested-externs \
+                      -Wchar-subscripts \
+                      -Wtype-limits \
+                      -Wuninitialized \
+                      -fno-common \
+                      -fdiagnostics-show-option \
+                      -fvisibility=hidden \
+                      -ffunction-sections \
+                      -fdata-sections])
+AC_SUBST([WARNINGFLAGS], $with_cflags)
+
+
+CC_CHECK_FLAGS_APPEND([with_ldflags], [LDFLAGS], [ \
+                      -Wl,--as-needed \
+                      -Wl,--gc-sections])
+AC_SUBST([GCLDFLAGS], $with_ldflags)
+
+
 AC_OUTPUT([
 lightmediascanner.pc
 lightmediascanner.spec
diff --git a/m4/attributes.m4 b/m4/attributes.m4
new file mode 100644 (file)
index 0000000..e822197
--- /dev/null
@@ -0,0 +1,300 @@
+dnl Macros to check the presence of generic (non-typed) symbols.
+dnl Copyright (c) 2006-2008 Diego Pettenò <flameeyes@gmail.com>
+dnl Copyright (c) 2006-2008 xine project
+dnl Copyright (c) 2012 Lucas De Marchi <lucas.de.marchi@gmail.com>
+dnl
+dnl This program is free software; you can redistribute it and/or modify
+dnl it under the terms of the GNU General Public License as published by
+dnl the Free Software Foundation; either version 2, or (at your option)
+dnl any later version.
+dnl
+dnl This program is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+dnl GNU General Public License for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software
+dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+dnl 02110-1301, USA.
+dnl
+dnl As a special exception, the copyright owners of the
+dnl macro gives unlimited permission to copy, distribute and modify the
+dnl configure scripts that are the output of Autoconf when processing the
+dnl Macro. You need not follow the terms of the GNU General Public
+dnl License when using or distributing such scripts, even though portions
+dnl of the text of the Macro appear in them. The GNU General Public
+dnl License (GPL) does govern all other use of the material that
+dnl constitutes the Autoconf Macro.
+dnl
+dnl This special exception to the GPL applies to versions of the
+dnl Autoconf Macro released by this project. When you make and
+dnl distribute a modified version of the Autoconf Macro, you may extend
+dnl this special exception to the GPL to apply to your modified version as
+dnl well.
+
+dnl Check if flag in a envvar is supported by compiler and append
+dnl "backup" variable
+dnl CC_CHECK_FLAG_APPEND([WHERE-TO-APPEND], [ENV-VAR], [FLAG])
+AC_DEFUN([CC_CHECK_FLAG_APPEND], [
+  AC_CACHE_CHECK([if $CC supports flag $3 in envvar $2],
+                 AS_TR_SH([cc_cv_$2_$3]),
+                [eval "AS_TR_SH([cc_save_$2])='${$2}'"
+                 eval "AS_TR_SH([$2])='-Werror $3'"
+                 AC_COMPILE_IFELSE([AC_LANG_SOURCE([int a = 0; int main(void) { return a; } ])],
+                                    [eval "AS_TR_SH([cc_cv_$2_$3])='yes'"],
+                                    [eval "AS_TR_SH([cc_cv_$2_$3])='no'"])
+                 eval "AS_TR_SH([$2])='$cc_save_$2'"])
+
+  AS_IF([eval test x$]AS_TR_SH([cc_cv_$2_$3])[ = xyes],
+        [eval "$1='${$1} $3'"])
+])
+
+dnl CC_CHECK_FLAGS_APPEND([WHERE-TO-APPEND], [ENV-VAR], [FLAG1 FLAG2])
+AC_DEFUN([CC_CHECK_FLAGS_APPEND], [
+  for flag in $3; do
+    CC_CHECK_FLAG_APPEND($1, $2, $flag)
+  done
+])
+
+
+
+dnl Check if the flag is supported by linker
+dnl CC_CHECK_LDFLAGS_SILENT([FLAG], [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND])
+AC_DEFUN([CC_CHECK_LDFLAGS_SILENT], [
+  AC_CACHE_VAL(AS_TR_SH([cc_cv_ldflags_$1]),
+    [ac_save_LDFLAGS="$LDFLAGS"
+     LDFLAGS="$LDFLAGS $1"
+     AC_LINK_IFELSE([AC_LANG_SOURCE([int main() { return 1; }])],
+       [eval "AS_TR_SH([cc_cv_ldflags_$1])='yes'"],
+       [eval "AS_TR_SH([cc_cv_ldflags_$1])="])
+     LDFLAGS="$ac_save_LDFLAGS"
+    ])
+
+  AS_IF([eval test x$]AS_TR_SH([cc_cv_ldflags_$1])[ = xyes],
+    [$2], [$3])
+])
+
+dnl Check if the flag is supported by linker (cacheable)
+dnl CC_CHECK_LDFLAGS([FLAG], [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND])
+
+AC_DEFUN([CC_CHECK_LDFLAGS], [
+  AC_CACHE_CHECK([if $CC supports $1 flag],
+    AS_TR_SH([cc_cv_ldflags_$1]),
+    CC_CHECK_LDFLAGS_SILENT([$1]) dnl Don't execute actions here!
+  )
+
+  AS_IF([eval test x$]AS_TR_SH([cc_cv_ldflags_$1])[ = xyes],
+    [$2], [$3])
+])
+
+dnl define the LDFLAGS_NOUNDEFINED variable with the correct value for
+dnl the current linker to avoid undefined references in a shared object.
+AC_DEFUN([CC_NOUNDEFINED], [
+  dnl We check $host for which systems to enable this for.
+  AC_REQUIRE([AC_CANONICAL_HOST])
+
+  case $host in
+     dnl FreeBSD (et al.) does not complete linking for shared objects when pthreads
+     dnl are requested, as different implementations are present; to avoid problems
+     dnl use -Wl,-z,defs only for those platform not behaving this way.
+     *-freebsd* | *-openbsd*) ;;
+     *)
+        dnl First of all check for the --no-undefined variant of GNU ld. This allows
+        dnl for a much more readable commandline, so that people can understand what
+        dnl it does without going to look for what the heck -z defs does.
+        for possible_flags in "-Wl,--no-undefined" "-Wl,-z,defs"; do
+          CC_CHECK_LDFLAGS([$possible_flags], [LDFLAGS_NOUNDEFINED="$possible_flags"])
+         break
+        done
+       ;;
+  esac
+
+  AC_SUBST([LDFLAGS_NOUNDEFINED])
+])
+
+dnl Check for a -Werror flag or equivalent. -Werror is the GCC
+dnl and ICC flag that tells the compiler to treat all the warnings
+dnl as fatal. We usually need this option to make sure that some
+dnl constructs (like attributes) are not simply ignored.
+dnl
+dnl Other compilers don't support -Werror per se, but they support
+dnl an equivalent flag:
+dnl  - Sun Studio compiler supports -errwarn=%all
+AC_DEFUN([CC_CHECK_WERROR], [
+  AC_CACHE_CHECK(
+    [for $CC way to treat warnings as errors],
+    [cc_cv_werror],
+    [CC_CHECK_CFLAGS_SILENT([-Werror], [cc_cv_werror=-Werror],
+      [CC_CHECK_CFLAGS_SILENT([-errwarn=%all], [cc_cv_werror=-errwarn=%all])])
+    ])
+])
+
+AC_DEFUN([CC_CHECK_ATTRIBUTE], [
+  AC_REQUIRE([CC_CHECK_WERROR])
+  AC_CACHE_CHECK([if $CC supports __attribute__(( ifelse([$2], , [$1], [$2]) ))],
+    AS_TR_SH([cc_cv_attribute_$1]),
+    [ac_save_CFLAGS="$CFLAGS"
+     CFLAGS="$CFLAGS $cc_cv_werror"
+     AC_COMPILE_IFELSE([AC_LANG_SOURCE([$3])],
+       [eval "AS_TR_SH([cc_cv_attribute_$1])='yes'"],
+       [eval "AS_TR_SH([cc_cv_attribute_$1])='no'"])
+     CFLAGS="$ac_save_CFLAGS"
+    ])
+
+  AS_IF([eval test x$]AS_TR_SH([cc_cv_attribute_$1])[ = xyes],
+    [AC_DEFINE(
+       AS_TR_CPP([SUPPORT_ATTRIBUTE_$1]), 1,
+         [Define this if the compiler supports __attribute__(( ifelse([$2], , [$1], [$2]) ))]
+         )
+     $4],
+    [$5])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_CONSTRUCTOR], [
+  CC_CHECK_ATTRIBUTE(
+    [constructor],,
+    [void __attribute__((constructor)) ctor() { int a; }],
+    [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_FORMAT], [
+  CC_CHECK_ATTRIBUTE(
+    [format], [format(printf, n, n)],
+    [void __attribute__((format(printf, 1, 2))) printflike(const char *fmt, ...) { fmt = (void *)0; }],
+    [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_FORMAT_ARG], [
+  CC_CHECK_ATTRIBUTE(
+    [format_arg], [format_arg(printf)],
+    [char *__attribute__((format_arg(1))) gettextlike(const char *fmt) { fmt = (void *)0; }],
+    [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_VISIBILITY], [
+  CC_CHECK_ATTRIBUTE(
+    [visibility_$1], [visibility("$1")],
+    [void __attribute__((visibility("$1"))) $1_function() { }],
+    [$2], [$3])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_NONNULL], [
+  CC_CHECK_ATTRIBUTE(
+    [nonnull], [nonnull()],
+    [void __attribute__((nonnull())) some_function(void *foo, void *bar) { foo = (void*)0; bar = (void*)0; }],
+    [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_UNUSED], [
+  CC_CHECK_ATTRIBUTE(
+    [unused], ,
+    [void some_function(void *foo, __attribute__((unused)) void *bar);],
+    [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_SENTINEL], [
+  CC_CHECK_ATTRIBUTE(
+    [sentinel], ,
+    [void some_function(void *foo, ...) __attribute__((sentinel));],
+    [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_DEPRECATED], [
+  CC_CHECK_ATTRIBUTE(
+    [deprecated], ,
+    [void some_function(void *foo, ...) __attribute__((deprecated));],
+    [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_ALIAS], [
+  CC_CHECK_ATTRIBUTE(
+    [alias], [weak, alias],
+    [void other_function(void *foo) { }
+     void some_function(void *foo) __attribute__((weak, alias("other_function")));],
+    [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_MALLOC], [
+  CC_CHECK_ATTRIBUTE(
+    [malloc], ,
+    [void * __attribute__((malloc)) my_alloc(int n);],
+    [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_PACKED], [
+  CC_CHECK_ATTRIBUTE(
+    [packed], ,
+    [struct astructure { char a; int b; long c; void *d; } __attribute__((packed));],
+    [$1], [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_CONST], [
+  CC_CHECK_ATTRIBUTE(
+    [const], ,
+    [int __attribute__((const)) twopow(int n) { return 1 << n; } ],
+    [$1], [$2])
+])
+
+AC_DEFUN([CC_FLAG_VISIBILITY], [
+  AC_REQUIRE([CC_CHECK_WERROR])
+  AC_CACHE_CHECK([if $CC supports -fvisibility=hidden],
+    [cc_cv_flag_visibility],
+    [cc_flag_visibility_save_CFLAGS="$CFLAGS"
+     CFLAGS="$CFLAGS $cc_cv_werror"
+     CC_CHECK_CFLAGS_SILENT([-fvisibility=hidden],
+       cc_cv_flag_visibility='yes',
+       cc_cv_flag_visibility='no')
+     CFLAGS="$cc_flag_visibility_save_CFLAGS"])
+
+  AS_IF([test "x$cc_cv_flag_visibility" = "xyes"],
+    [AC_DEFINE([SUPPORT_FLAG_VISIBILITY], 1,
+       [Define this if the compiler supports the -fvisibility flag])
+     $1],
+    [$2])
+])
+
+AC_DEFUN([CC_FUNC_EXPECT], [
+  AC_REQUIRE([CC_CHECK_WERROR])
+  AC_CACHE_CHECK([if compiler has __builtin_expect function],
+    [cc_cv_func_expect],
+    [ac_save_CFLAGS="$CFLAGS"
+     CFLAGS="$CFLAGS $cc_cv_werror"
+     AC_COMPILE_IFELSE([AC_LANG_SOURCE(
+       [int some_function() {
+        int a = 3;
+        return (int)__builtin_expect(a, 3);
+       }])],
+       [cc_cv_func_expect=yes],
+       [cc_cv_func_expect=no])
+     CFLAGS="$ac_save_CFLAGS"
+    ])
+
+  AS_IF([test "x$cc_cv_func_expect" = "xyes"],
+    [AC_DEFINE([SUPPORT__BUILTIN_EXPECT], 1,
+     [Define this if the compiler supports __builtin_expect() function])
+     $1],
+    [$2])
+])
+
+AC_DEFUN([CC_ATTRIBUTE_ALIGNED], [
+  AC_REQUIRE([CC_CHECK_WERROR])
+  AC_CACHE_CHECK([highest __attribute__ ((aligned ())) supported],
+    [cc_cv_attribute_aligned],
+    [ac_save_CFLAGS="$CFLAGS"
+     CFLAGS="$CFLAGS $cc_cv_werror"
+     for cc_attribute_align_try in 64 32 16 8 4 2; do
+        AC_COMPILE_IFELSE([AC_LANG_SOURCE([
+          int main() {
+            static char c __attribute__ ((aligned($cc_attribute_align_try))) = 0;
+            return c;
+          }])], [cc_cv_attribute_aligned=$cc_attribute_align_try; break])
+     done
+     CFLAGS="$ac_save_CFLAGS"
+  ])
+
+  if test "x$cc_cv_attribute_aligned" != "x"; then
+     AC_DEFINE_UNQUOTED([ATTRIBUTE_ALIGNED_MAX], [$cc_cv_attribute_aligned],
+       [Define the highest alignment supported])
+  fi
+])
index edcbe2e..ebcdb8f 100644 (file)
@@ -1,6 +1,8 @@
 MAINTAINERCLEANFILES = Makefile.in
 
 AM_CPPFLAGS = -I$(top_srcdir)/src/lib @SQLITE3_CFLAGS@
+AM_CFLAGS = $(WARNINGFLAGS)
+AM_LDFLAGS = $(GCLDFLAGS)
 
 include_HEADERS = \
        lightmediascanner.h \
index 18e5649..426011d 100644 (file)
@@ -113,7 +113,7 @@ lms_charset_conv_new(void)
 void
 lms_charset_conv_free(lms_charset_conv_t *lcc)
 {
-    int i;
+    unsigned int i;
 
     if (!lcc)
         return;
@@ -192,7 +192,7 @@ lms_charset_conv_add(lms_charset_conv_t *lcc, const char *charset)
 static int
 _find(const lms_charset_conv_t *lcc, const char *charset)
 {
-    int i;
+    unsigned int i;
 
     for (i = 0; i < lcc->size; i++)
         if (strcmp(lcc->names[i], charset) == 0)
@@ -232,7 +232,7 @@ lms_charset_conv_del(lms_charset_conv_t *lcc, const char *charset)
     free(lcc->names[idx]);
 
     lcc->size--;
-    for (; idx < lcc->size; idx++) {
+    for (; (unsigned)idx < lcc->size; idx++) {
         lcc->convs[idx] = lcc->convs[idx + 1];
         lcc->names[idx] = lcc->names[idx + 1];
     }
@@ -353,7 +353,7 @@ lms_charset_conv(lms_charset_conv_t *lcc, char **p_str, unsigned int *p_len)
         return 0;
     }
 
-    for (i = 0; i < lcc->size; i++)
+    for (i = 0; (unsigned) i < lcc->size; i++)
         if (_conv(lcc->convs[i], p_str, p_len, outstr, outlen) == 0)
             return 0;
 
@@ -406,7 +406,7 @@ lms_charset_conv_force(lms_charset_conv_t *lcc, char **p_str, unsigned int *p_le
         return -4;
     }
 
-    for (i = 0; i < lcc->size; i++)
+    for (i = 0; (unsigned)i < lcc->size; i++)
         if (_conv(lcc->convs[i], p_str, p_len, outstr, outlen) == 0)
             return 0;
 
index e803442..c7f6a34 100644 (file)
@@ -610,7 +610,7 @@ _finfo_update(void *db_ptr, struct cinfo *info, struct lms_file_info *finfo, uns
 
     *flags = 0;
     if (stat(finfo->path, &st) == 0) {
-        if (st.st_mtime == finfo->mtime && st.st_size == finfo->size) {
+        if (st.st_mtime == finfo->mtime && (size_t)st.st_size == finfo->size) {
             if (finfo->dtime == 0) {
                 _report_progress(info, finfo, LMS_PROGRESS_STATUS_UP_TO_DATE);
                 return 0;
index c4ed988..ec2db5e 100644 (file)
@@ -65,8 +65,8 @@ struct sinfo {
     struct cinfo common;
     struct db *db;
     void **parser_match;
-    int commit_counter;
-    int total_committed;
+    unsigned int commit_counter;
+    unsigned int total_committed;
 };
 
 struct parser {
index a7183f1..a6a2bc5 100644 (file)
@@ -276,7 +276,7 @@ _retrieve_file_status(struct db *db, struct lms_file_info *finfo)
 
     r = lms_db_get_file_info(db->get_file_info, finfo);
     if (r == 0) {
-        if (st.st_mtime <= finfo->mtime && finfo->size == st.st_size)
+        if (st.st_mtime <= finfo->mtime && finfo->size == (size_t)st.st_size)
             return 0;
         else {
             finfo->mtime = st.st_mtime;
@@ -542,11 +542,11 @@ _slave_work(struct pinfo *pinfo)
 {
     lms_t *lms = pinfo->common.lms;
     struct fds *fds = &pinfo->slave;
-    int r, len, base, counter;
+    int r, len, base;
     char path[PATH_SIZE];
     void **parser_match;
     struct db *db;
-    unsigned int total_committed;
+    unsigned int total_committed, counter;
 
     r = _db_and_parsers_setup(lms, &db, &parser_match);
     if (r < 0)
@@ -1075,7 +1075,7 @@ lms_process(lms_t *lms, const char *top_path)
         goto close_pipes;
     }
 
-    r = _process_trigger((struct cinfo *)&pinfo, top_path, _process_file);
+    r = _process_trigger(&pinfo.common, top_path, _process_file);
 
     lms_finish_slave(&pinfo, _master_send_finish);
   close_pipes:
@@ -1123,8 +1123,7 @@ lms_process_single_process(lms_t *lms, const char *top_path)
 
     lms_db_begin_transaction(sinfo.db->transaction_begin);
 
-    r = _process_trigger(
-        (struct cinfo *)&sinfo, top_path, _process_file_single_process);
+    r = _process_trigger(&sinfo.common, top_path, _process_file_single_process);
 
     /* Check only if there are remaining commits to do */
     if (sinfo.commit_counter) {
index 4d53373..7660f9f 100644 (file)
@@ -138,7 +138,7 @@ lms_string_size_strip_and_free(struct lms_string_size *p)
  */
 int
 lms_which_extension(const char *name, unsigned int name_len, const struct lms_string_size *exts, unsigned int exts_len) {
-    int i;
+    unsigned int i;
     unsigned int *exts_pos;
     const char *s;
 
@@ -147,7 +147,7 @@ lms_which_extension(const char *name, unsigned int name_len, const struct lms_st
         exts_pos[i] = exts[i].len;
 
     for (s = name + name_len - 1; s >= name; s--) {
-        int i, match;
+        int match;
         char c1, c2;
 
         c1 = *s;