GNU core utilitiesのビルド(Mx Linux, Debian stretch)

coreutilsのビルド時にgnulibのacl-internal.hがエラーを吐いた。たぶんgccが古いんだと思う。

# 環境と今回ビルドしたcoreutilsのバージョン

$ gcc --version
gcc (Debian 6.3.0-18+deb9u1) 6.3.0 20170516
$ cat /etc/os-release 
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
$ cat src/version.c
 #include <config.h>
 char const *Version = "8.31.48-f2dfea";

coreutils をビルド

$ git clone git://git.sv.gnu.org/coreutils

$ cd coreutils

$ ./bootstrap --skip-po

$ ./configure

$ make -j $(nproc)

gnulibのacl-internal.hがエラー。

  CC       lib/acl-internal.o
lib/acl-internal.c: In function 'free_permission_context':
lib/acl-internal.c:479:1: error: function might be candidate for attribute 'const' [-Werror=suggest-attribute=const]
 free_permission_context (struct permission_context *ctx)
 ^~~~~~~~~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors
Makefile:9705: recipe for target 'lib/acl-internal.o' failed
make[2]: *** [lib/acl-internal.o] Error 1

acl-internal.hを編集

--- a/lib/acl-internal.h  2019-08-28 17:22:43.146398122 +0900
+++ b/lib/acl-internal.h    2019-08-28 17:27:29.011391134 +0900
@@ -297,6 +297,10 @@
 
 int get_permissions (const char *, int, mode_t, struct permission_context *);
 int set_permissions (struct permission_context *, const char *, int);
-void free_permission_context (struct permission_context *);
+void free_permission_context (struct permission_context *)
+#if ! (defined USE_ACL && (HAVE_ACL_GET_FILE || defined GETACL))
+    _GL_ATTRIBUTE_CONST
+#endif
+  ;

_GL_INLINE_HEADER_END

再度make。

$ make -j $(nproc)

# 成功

一旦、全てをビルドしてしまえば、今後は個別にビルドできる。改変してみよう。

--- a/src/cat.c  2019-08-28 17:21:10.126750050 +0900
+++ b/src/cat.c 2019-08-28 18:12:31.683477943 +0900
@@ -624,11 +624,17 @@
           break;
 
         case_GETOPT_HELP_CHAR;
-
+        /* printf("myusage"); */
         case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
+        /* printf("myusage"); */
 
         default:
-          usage (EXIT_FAILURE);
+          printf("-----------\n");
+          printf("-----------\n");
+          printf("-----------\n");
+          printf("-----------\n");
+          exit (EXIT_FAILURE);
+        /* usage (EXIT_FAILURE); */
         }
     }

実行。

$ make src/cat && src/cat --abcd
  CC       src/cat.o
  CCLD     src/cat
src/cat: unrecognized option '--abcd'
-----------
-----------
-----------
-----------