btrfs-progs: Support for musl libc (and perhaps also uclibc)
RFC 1/1 btrfs-progs: Support for musl libc (and perhaps also uclibc)
Hi,
I've been experimenting with musl-libc Gentoo systems. I used the HEAD of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/btrfs-progs.git
I found that btrfs-progs does not compile with musl-libc, for a few reasons:
* It makes use of the private glibc __always_inline macro.
* Various headers that should be included are not included:linux/limits.h and limits.h. (for XATTR_SIZE_MAX and PATH_MAX)
* backtrace() using execinfo.h is enabled by default; execinfo.h is glibc-specific and thus does not work on other libc's. musl does not support it, and I think uclibc also does not support it.
I have worked around the problems in the following way:
* Define __always_inline if __glibc__ is not defined. This is arguably the most clean solution. It would be better to simply not use the __always_inline macro (instead, use __attribute__) throughout btrfs-progs, but I was not sure what the developers would prefer. This is currently done in kerncompat.h, but you may want to move that to another file.
* Include various headers where required.
* If __glibc__ is not defined, define BTRFS_DISABLE_BACKTRACE. Currently the define magic happens in kerncompat, because that also where BTRFS includes execinfo. Personally, I think it would make more sense to always disable backtrace instead of enabling it by default -- but perhaps in a testing phase, enabling it by default in the sensible choice.
Attached are the two patches generated with git format-patch. I am aware that this may not be required format for submitting patches -- but please give me some time to get used to the etiquette. :-)
Please let me know if musl-libc (or any other libc) is a supported platform, and if so, if and how I can improve on said patches.
Regards,
Merlijn
From da43021732fab3f70c75f155bded8e5f35fdffe3 Mon Sep 17 00:00:00 2001
From: Merlijn Wajer <[email protected]>
Date: Sat, 13 Dec 2014 15:07:25 +0100
Subject: [PATCH 1/2] Include headers required for musl-libc.
This fixes various compilation errors where PATH_MAX and XATTR_SIZE_MAX were missing. To my knowledge, this should have no bad side effects.
--- btrfs-convert.c | 1 + help.c | 1 + mkfs.c | 2 ++ 3 files changed, 4 insertions(+)
btrfs-convert.c +1 -0
@@ -31,6 +31,7 @@#include <fcntl.h> #include <unistd.h> #include <uuid/uuid.h> +#include <linux/limits.h> #include "ctree.h" #include "disk-io.h"
help.c +1 -0
@@ -17,6 +17,7 @@#include <stdio.h> #include <stdlib.h> #include <string.h> +#include <limits.h> #include "commands.h" #include "utils.h"
mkfs.c +2 -0
@@ -35,6 +35,8 @@#include <uuid/uuid.h> #include <ctype.h> #include <sys/xattr.h> +#include <limits.h> +#include <linux/limits.h> #include <blkid/blkid.h> #include <ftw.h> #include "ctree.h"
Signature · 1 line
2.0.4
From 01d0bfe48dc78b66b6e86d4935d9b9d20194b135 Mon Sep 17 00:00:00 2001
From: Merlijn Wajer <[email protected]>
Date: Sat, 13 Dec 2014 15:08:43 +0100
Subject: [PATCH 2/2] Disable backtrace and define __always_inline
Disable backtrace and define __always_inline when glibc is not used as libc. This, together with some header changes allows btrfs-progs to compile with musl-libc.
--- kerncompat.h | 6 ++++++ 1 file changed, 6 insertions(+)
kerncompat.h +6 -0
@@ -29,6 +29,12 @@#include <stddef.h> #include <linux/types.h> #include <stdint.h> + +#ifndef __glibc__ +#define BTRFS_DISABLE_BACKTRACE +#define __always_inline __inline __attribute__ ((__always_inline__)) +#endif +#ifndef BTRFS_DISABLE_BACKTRACE #include <execinfo.h> #endif
Signature · 1 line
2.0.4
On Sat, Dec 13, 2014 at 03:35:09PM +0100, Merlijn Wajer wrote:
[snip]
Quoted 3 lines
Attached are the two patches generated with git format-patch. I am aware that this may not be required format for submitting patches -- but please give me some time to get used to the etiquette. :-)
Thanks, there are minor things that I won't bother to point out to occasional contributors and fix them myself. The only formal requirement is the Signed-off-by tag, you can find the description eg. here
http://lxr.free-electrons.com/source/Documentation/SubmittingPatches#L358
Quoted 2 lines
Please let me know if musl-libc (or any other libc) is a supported platform, and if so, if and how I can improve on said patches.
I'm not aware of non-glibc users, but I don't see any problem to add support for more libc implementations. However, I won't regularly verify that it builds so it might break.
Seems that only standardized library calls are used in btrfs-progs so any kind of support is probably going to be satisfied by #ifdefs.
Your patches are simple so I'll try to schedule them to some 3.18.x update.
Quoted 8 lines · David Sterba
On Sat, Dec 13, 2014 at 03:35:09PM +0100, Merlijn Wajer wrote:
[snip]Quoted 2 lines
Please let me know if musl-libc (or any other libc) is a supported platform, and if so, if and how I can improve on said patches.
I'm not aware of non-glibc users, but I don't see any problem to add support for more libc implementations. However, I won't regularly verify that it builds so it might break.
I know that buildroot has support for building btrfs-progs with uClibc, I don't know if they have any special patches for it though. Although I haven't tried it myself, I think it is also possible to use buildroot with musl.
Hi,
Quoted 7 lines · David Sterba
On Sat, Dec 13, 2014 at 03:35:09PM +0100, Merlijn Wajer wrote:
[snip]Quoted 3 lines
Attached are the two patches generated with git format-patch. I am aware that this may not be required format for submitting patches -- but please give me some time to get used to the etiquette. :-)
Quoted 5 lines
Thanks, there are minor things that I won't bother to point out to occasional contributors and fix them myself. The only formal requirement is the Signed-off-by tag, you can find the description eg. here
http://lxr.free-electrons.com/source/Documentation/SubmittingPatches#L358
Alright, cool. I've rebased my two patches and used --signoff when amending the commit. Please find the new patches attached.
Quoted 6 lines
Quoted 2 lines
Please let me know if musl-libc (or any other libc) is a supported platform, and if so, if and how I can improve on said patches.
I'm not aware of non-glibc users, but I don't see any problem to add support for more libc implementations. However, I won't regularly verify that it builds so it might break.
That is fine; at this point there are not a lot of people using an alternative libc, so this is common practice. I'll be here with a new round of patches if it breaks in a future release; it shouldn't really break too often. :)
Quoted 4 lines
Seems that only standardized library calls are used in btrfs-progs so any kind of support is probably going to be satisfied by #ifdefs. Your patches are simple so I'll try to schedule them to some 3.18.x update.
That would be great; thank you.
Regards,
Merlijn
From 0109fd7ce62eee8b16aa5bdf78f3de54011e00f3 Mon Sep 17 00:00:00 2001
From: Merlijn Wajer <[email protected]>
Date: Sat, 13 Dec 2014 15:07:25 +0100
Subject: [PATCH 1/2] Include headers required for musl-libc.
This fixes various compilation errors where PATH_MAX and XATTR_SIZE_MAX were missing. To my knowledge, this should have no bad side effects.
--- btrfs-convert.c | 1 + help.c | 1 + mkfs.c | 2 ++ 3 files changed, 4 insertions(+)
btrfs-convert.c +1 -0
@@ -31,6 +31,7 @@#include <fcntl.h> #include <unistd.h> #include <uuid/uuid.h> +#include <linux/limits.h> #include "ctree.h" #include "disk-io.h"
help.c +1 -0
@@ -17,6 +17,7 @@#include <stdio.h> #include <stdlib.h> #include <string.h> +#include <limits.h> #include "commands.h" #include "utils.h"
mkfs.c +2 -0
@@ -35,6 +35,8 @@#include <uuid/uuid.h> #include <ctype.h> #include <sys/xattr.h> +#include <limits.h> +#include <linux/limits.h> #include <blkid/blkid.h> #include <ftw.h> #include "ctree.h"
Signature · 1 line
2.0.4
From 5ae5cfa3af473625ef5b31daf5f229f12be753d2 Mon Sep 17 00:00:00 2001
From: Merlijn Wajer <[email protected]>
Date: Sat, 13 Dec 2014 15:08:43 +0100
Subject: [PATCH 2/2] Disable backtrace and define __always_inline
Disable backtrace and define __always_inline when glibc is not used as libc. This, together with some header changes allows btrfs-progs to compile with musl-libc.
--- kerncompat.h | 6 ++++++ 1 file changed, 6 insertions(+)
kerncompat.h +6 -0
@@ -29,6 +29,12 @@#include <stddef.h> #include <linux/types.h> #include <stdint.h> + +#ifndef __glibc__ +#define BTRFS_DISABLE_BACKTRACE +#define __always_inline __inline __attribute__ ((__always_inline__)) +#endif +#ifndef BTRFS_DISABLE_BACKTRACE #include <execinfo.h> #endif
Signature · 1 line
2.0.4
Quoted 4 lines · Merlijn Wajer
That is fine; at this point there are not a lot of people using an alternative libc, so this is common practice. I'll be here with a new round of patches if it breaks in a future release; it shouldn't really break too often. :)
Good. I've put the patches to 3.18 queue.