package/vdr: enable musl/uclibc build
Re-add patch 0001 to fix uClibc build, this patch was removed 2019: https://git.buildroot.net/buildroot/commit/?id=573d15b0790cfd2838cf0544ded79b415e20f5a7 Add two more patches from Alpine Linux to fix musl build. Add optional dependency to libexecinfo to provide execinfo.h. Add a patch that ensures an internal gettext symbol doesn't get used except on glibc and uclibc toolchains. Indeed, both glibc and uclibc provide the _nl_msg_cat_cntr variable, but not the musl implementation. Signed-off-by: Bernd Kuhls <bernd.kuhls@t-online.de> Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
This commit is contained in:
parent
9a478b17ae
commit
64843258ce
55
package/vdr/0001-getloadavg.patch
Normal file
55
package/vdr/0001-getloadavg.patch
Normal file
@ -0,0 +1,55 @@
|
||||
Fix compilation with uClibc
|
||||
|
||||
Ported from
|
||||
https://github.com/stschake/buildroot-grasshopper/blob/master/package/torsmo/torsmo-0.18-uclibc-getloadavg.patch
|
||||
|
||||
Signed-off-by: Bernd Kuhls <bernd.kuhls@t-online.de>
|
||||
|
||||
diff -uwNr vdr-2.3.1.org/skinlcars.c vdr-2.3.1/skinlcars.c
|
||||
--- vdr-2.3.1.org/skinlcars.c 2015-09-01 12:07:07.000000000 +0200
|
||||
+++ vdr-2.3.1/skinlcars.c 2016-07-31 21:00:11.000000000 +0200
|
||||
@@ -1100,6 +1100,44 @@
|
||||
}
|
||||
}
|
||||
|
||||
+/* uclibc and dietlibc do not have this junk -ReneR */
|
||||
+#if defined (__UCLIBC__) || defined (__dietlibc__)
|
||||
+static int getloadavg (double loadavg[], int nelem)
|
||||
+{
|
||||
+ int fd;
|
||||
+
|
||||
+ fd = open ("/proc/loadavg", O_RDONLY);
|
||||
+ if (fd < 0)
|
||||
+ return -1;
|
||||
+ else
|
||||
+ {
|
||||
+ char buf[65], *p;
|
||||
+ ssize_t nread;
|
||||
+ int i;
|
||||
+
|
||||
+ nread = read (fd, buf, sizeof buf - 1);
|
||||
+ close (fd);
|
||||
+ if (nread <= 0)
|
||||
+ return -1;
|
||||
+ buf[nread - 1] = '\0';
|
||||
+
|
||||
+ if (nelem > 3)
|
||||
+ nelem = 3;
|
||||
+ p = buf;
|
||||
+ for (i = 0; i < nelem; ++i)
|
||||
+ {
|
||||
+ char *endp;
|
||||
+ loadavg[i] = strtod (p, &endp);
|
||||
+ if (endp == p)
|
||||
+ return -1;
|
||||
+ p = endp;
|
||||
+ }
|
||||
+
|
||||
+ return i;
|
||||
+ }
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
void cSkinLCARSDisplayMenu::DrawLoad(void)
|
||||
{
|
||||
if (yb04) {
|
140
package/vdr/0002-musl-compat.patch
Normal file
140
package/vdr/0002-musl-compat.patch
Normal file
@ -0,0 +1,140 @@
|
||||
Fix musl build
|
||||
|
||||
Downloaded from
|
||||
https://git.alpinelinux.org/aports/tree/community/vdr/musl-compat.patch
|
||||
|
||||
Signed-off-by: Bernd Kuhls <bernd.kuhls@t-online.de>
|
||||
|
||||
diff --git a/i18n.h b/i18n.h
|
||||
index f8ad9de..b002bbf 100644
|
||||
--- a/i18n.h
|
||||
+++ b/i18n.h
|
||||
@@ -46,7 +46,7 @@ const cStringList *I18nLanguages(void);
|
||||
///< have an actual locale installed. The rest are just dummy entries
|
||||
///< to allow having three letter language codes for other languages
|
||||
///< that have no actual locale on this system.
|
||||
-const char *I18nTranslate(const char *s, const char *Plugin = NULL) __attribute_format_arg__(1);
|
||||
+const char *I18nTranslate(const char *s, const char *Plugin = NULL) __attribute__((__format_arg__ (1)));
|
||||
///< Translates the given string (with optional Plugin context) into
|
||||
///< the current language. If no translation is available, the original
|
||||
///< string will be returned.
|
||||
diff --git a/osd.c b/osd.c
|
||||
index 524700a..ef975f5 100644
|
||||
--- a/osd.c
|
||||
+++ b/osd.c
|
||||
@@ -12,7 +12,7 @@
|
||||
#include <stdlib.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/stat.h>
|
||||
-#include <sys/unistd.h>
|
||||
+#include <unistd.h>
|
||||
#include "device.h"
|
||||
#include "tools.h"
|
||||
|
||||
diff --git a/thread.c b/thread.c
|
||||
index 47eb977..58dba43 100644
|
||||
--- a/thread.c
|
||||
+++ b/thread.c
|
||||
@@ -155,7 +155,9 @@ cRwLock::cRwLock(bool PreferWriter)
|
||||
writeLockThreadId = 0;
|
||||
pthread_rwlockattr_t attr;
|
||||
pthread_rwlockattr_init(&attr);
|
||||
+#if defined(__GLIBC__)
|
||||
pthread_rwlockattr_setkind_np(&attr, PreferWriter ? PTHREAD_RWLOCK_PREFER_WRITER_NP : PTHREAD_RWLOCK_PREFER_READER_NP);
|
||||
+#endif
|
||||
pthread_rwlock_init(&rwlock, &attr);
|
||||
}
|
||||
|
||||
@@ -205,7 +207,7 @@ cMutex::cMutex(void)
|
||||
locked = 0;
|
||||
pthread_mutexattr_t attr;
|
||||
pthread_mutexattr_init(&attr);
|
||||
- pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK_NP);
|
||||
+ pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK);
|
||||
pthread_mutex_init(&mutex, &attr);
|
||||
}
|
||||
|
||||
diff --git a/tools.c b/tools.c
|
||||
index 754673d..fef9d2d 100644
|
||||
--- a/tools.c
|
||||
+++ b/tools.c
|
||||
@@ -640,7 +640,7 @@ char *ReadLink(const char *FileName)
|
||||
{
|
||||
if (!FileName)
|
||||
return NULL;
|
||||
- char *TargetName = canonicalize_file_name(FileName);
|
||||
+ char *TargetName = realpath(FileName, NULL);
|
||||
if (!TargetName) {
|
||||
if (errno == ENOENT) // file doesn't exist
|
||||
TargetName = strdup(FileName);
|
||||
@@ -1528,7 +1528,7 @@
|
||||
struct dirent *cReadDir::Next(void)
|
||||
{
|
||||
if (directory) {
|
||||
-#if !__GLIBC_PREREQ(2, 24) // readdir_r() is deprecated as of GLIBC 2.24
|
||||
+#if __GLIBC__
|
||||
while (readdir_r(directory, &u.d, &result) == 0 && result) {
|
||||
#else
|
||||
while ((result = readdir(directory)) != NULL) {
|
||||
diff --git a/tools.h b/tools.h
|
||||
index 73cca5a..03f5fd1 100644
|
||||
--- a/tools.h
|
||||
+++ b/tools.h
|
||||
@@ -28,6 +28,16 @@
|
||||
#include <sys/types.h>
|
||||
#include "thread.h"
|
||||
|
||||
+#ifndef ACCESSPERMS
|
||||
+# define ACCESSPERMS (S_IRWXU|S_IRWXG|S_IRWXO) /* 0777 */
|
||||
+#endif
|
||||
+#ifndef ALLPERMS
|
||||
+# define ALLPERMS (S_ISUID|S_ISGID|S_ISVTX|S_IRWXU|S_IRWXG|S_IRWXO)/* 07777 */
|
||||
+#endif
|
||||
+#ifndef DEFFILEMODE
|
||||
+# define DEFFILEMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)/* 0666*/
|
||||
+#endif
|
||||
+
|
||||
typedef unsigned char uchar;
|
||||
|
||||
extern int SysLogLevel;
|
||||
@@ -400,7 +410,7 @@
|
||||
private:
|
||||
DIR *directory;
|
||||
struct dirent *result;
|
||||
-#if !__GLIBC_PREREQ(2, 24) // readdir_r() is deprecated as of GLIBC 2.24
|
||||
+#if __GLIBC__
|
||||
union { // according to "The GNU C Library Reference Manual"
|
||||
struct dirent d;
|
||||
char b[offsetof(struct dirent, d_name) + NAME_MAX + 1];
|
||||
@@ -738,7 +748,7 @@ public:
|
||||
data[i] = T(0);
|
||||
size = 0;
|
||||
}
|
||||
- void Sort(__compar_fn_t Compare)
|
||||
+ void Sort(int (*Compare)(const void *, const void *))
|
||||
{
|
||||
qsort(data, size, sizeof(T), Compare);
|
||||
}
|
||||
diff --git a/vdr.c b/vdr.c
|
||||
index 8a49471..c2a82aa 100644
|
||||
--- a/vdr.c
|
||||
+++ b/vdr.c
|
||||
@@ -670,12 +670,18 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
}
|
||||
else if (Terminal) {
|
||||
+#ifdef __GLIBC__
|
||||
// Claim new controlling terminal
|
||||
stdin = freopen(Terminal, "r", stdin);
|
||||
stdout = freopen(Terminal, "w", stdout);
|
||||
stderr = freopen(Terminal, "w", stderr);
|
||||
HasStdin = true;
|
||||
tcgetattr(STDIN_FILENO, &savedTm);
|
||||
+#else
|
||||
+ // stdin, stdout, stderr are declared FILE const* by musl C library
|
||||
+ fprintf(stderr, "Option '-t' is only supported if VDR has been built against glibc.\n");
|
||||
+ return 2;
|
||||
+#endif
|
||||
}
|
||||
|
||||
isyslog("VDR version %s started", VDRVERSION);
|
30
package/vdr/0003-include-missing-limits.patch
Normal file
30
package/vdr/0003-include-missing-limits.patch
Normal file
@ -0,0 +1,30 @@
|
||||
vdr package uses some macros like HOST_NAME_MAX, NAME_MAX, which are defined
|
||||
in limits.h.
|
||||
Needs to be explicitly included on ppc64le and for all archs for debug build.
|
||||
|
||||
Downloaded from
|
||||
https://git.alpinelinux.org/aports/tree/community/vdr/include-missing-limits.patch
|
||||
|
||||
Signed-off-by: Bernd Kuhls <bernd.kuhls@t-online.de>
|
||||
----
|
||||
|
||||
--- a/config.h
|
||||
+++ b/config.h
|
||||
@@ -19,6 +19,7 @@
|
||||
#include "i18n.h"
|
||||
#include "font.h"
|
||||
#include "tools.h"
|
||||
+#include <limits.h>
|
||||
|
||||
// VDR's own version number:
|
||||
|
||||
--- a/tools.c
|
||||
+++ b/tools.c
|
||||
@@ -27,6 +27,7 @@
|
||||
#include <utime.h>
|
||||
#include "i18n.h"
|
||||
#include "thread.h"
|
||||
+#include <limits.h>
|
||||
|
||||
int SysLogLevel = 3;
|
||||
|
@ -0,0 +1,35 @@
|
||||
From 8711ce9c4ded311705f281c99e013a26987fbf1d Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
|
||||
Date: Sat, 1 Jan 2022 23:35:29 +0100
|
||||
Subject: [PATCH] i18n.c: _nl_msg_cat_cntr is an internal symbol of some intl
|
||||
implementation
|
||||
|
||||
It is supported by glibc and uClibc (which both define __GLIBC__) but
|
||||
not musl (which doesn't define __GLIBC__). On musl, it doesn't do
|
||||
anything because musl has a basic NLS implementation. Even
|
||||
gettext-tiny defines _nl_msg_cat_cntr as a dummy symbol in its stub
|
||||
libintl-musl implementation.
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
|
||||
---
|
||||
i18n.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/i18n.c b/i18n.c
|
||||
index 0ef08fd4..da2a3ede 100644
|
||||
--- a/i18n.c
|
||||
+++ b/i18n.c
|
||||
@@ -123,8 +123,10 @@ static const char *SkipContext(const char *s)
|
||||
static void SetEnvLanguage(const char *Locale)
|
||||
{
|
||||
setenv("LANGUAGE", Locale, 1);
|
||||
+#if defined(__GLIBC__)
|
||||
extern int _nl_msg_cat_cntr;
|
||||
++_nl_msg_cat_cntr;
|
||||
+#endif
|
||||
}
|
||||
|
||||
static void SetLanguageNames(void)
|
||||
--
|
||||
2.31.1
|
||||
|
@ -4,23 +4,22 @@ config BR2_PACKAGE_VDR
|
||||
depends on !BR2_STATIC_LIBS
|
||||
depends on BR2_TOOLCHAIN_HAS_THREADS_NPTL
|
||||
depends on BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_9
|
||||
depends on BR2_TOOLCHAIN_USES_GLIBC # execinfo.h
|
||||
depends on BR2_USE_MMU # fork()
|
||||
depends on BR2_USE_WCHAR
|
||||
select BR2_PACKAGE_FONTCONFIG
|
||||
select BR2_PACKAGE_FREETYPE
|
||||
select BR2_PACKAGE_JPEG
|
||||
select BR2_PACKAGE_LIBCAP
|
||||
select BR2_PACKAGE_LIBICONV if !BR2_ENABLE_LOCALE
|
||||
select BR2_PACKAGE_LIBEXECINFO if !BR2_TOOLCHAIN_USES_GLIBC
|
||||
help
|
||||
This project describes how to build your own digital
|
||||
satellite receiver and Video Disk Recorder.
|
||||
|
||||
http://www.tvdr.de
|
||||
|
||||
comment "vdr needs a glibc toolchain w/ C++, dynamic library, NPTL, wchar, headers >= 3.9"
|
||||
comment "vdr needs a toolchain w/ C++, dynamic library, NPTL, wchar, headers >= 3.9"
|
||||
depends on BR2_USE_MMU
|
||||
depends on !BR2_INSTALL_LIBSTDCPP || BR2_STATIC_LIBS || \
|
||||
!BR2_TOOLCHAIN_HAS_THREADS_NPTL || \
|
||||
!BR2_TOOLCHAIN_USES_GLIBC || !BR2_USE_WCHAR || \
|
||||
!BR2_USE_WCHAR || \
|
||||
!BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_9
|
||||
|
@ -26,6 +26,11 @@ VDR_MAKE_FLAGS = \
|
||||
VIDEODIR=/var/lib/vdr
|
||||
VDR_LDFLAGS = $(TARGET_NLS_LIBS)
|
||||
|
||||
ifeq ($(BR2_PACKAGE_LIBEXECINFO),y)
|
||||
VDR_DEPENDENCIES += libexecinfo
|
||||
VDR_LDFLAGS += -lexecinfo
|
||||
endif
|
||||
|
||||
ifeq ($(BR2_PACKAGE_LIBFRIBIDI),y)
|
||||
VDR_DEPENDENCIES += libfribidi
|
||||
VDR_MAKE_FLAGS += BIDI=1
|
||||
|
Loading…
Reference in New Issue
Block a user