diff mbox series

ffmpeg: fix static linking build failure when using libavutil

Message ID 20180911204230.15890-1-giulio.benetti@micronovasrl.com
State Changes Requested
Headers show
Series ffmpeg: fix static linking build failure when using libavutil | expand

Commit Message

Giulio Benetti Sept. 11, 2018, 8:42 p.m. UTC
When static linking programs using ffmpeg libraries, if linking against
libavutil, -ldrm is listed before -lavutil. This leads to linking failure
due to undefined reference of drmGetVersion() and drmFreeVersion().
This is why when pkg-config generates libavutil.pc doesn't append -ldrm
after -lavutil.
Subsequentely if a package uses pkg-config and ffmpeg it will load
library dependencies from libavutil.pc without placing -ldrm at the tail.
Without this fix the only way is to workaround the problem directly in
the single package, like this:
https://github.com/buildroot/buildroot/commit/daf7dd87f4d93923df5e757fd43b3ad214a4a2ae

Add patch to assure -ldrm comes after -lavutil when static linking.

Fixes:
http://autobuild.buildroot.net/results/515/5152dcca58944cf732d09fba6e6c9af8a9243c75//
http://autobuild.buildroot.net/results/395/395be1a9cab824b82ef34c2ebd84d54243029b33//

Signed-off-by: Giulio Benetti <giulio.benetti@micronovasrl.com>
---
 ...igure-add-LIBDRM-to-extralibs_avutil.patch | 44 +++++++++++++++++++
 1 file changed, 44 insertions(+)
 create mode 100644 package/ffmpeg/0002-configure-add-LIBDRM-to-extralibs_avutil.patch

Comments

Giulio Benetti Sept. 11, 2018, 9:47 p.m. UTC | #1
Hello,

Il 11/09/2018 22:42, Giulio Benetti ha scritto:
> When static linking programs using ffmpeg libraries, if linking against
> libavutil, -ldrm is listed before -lavutil. This leads to linking failure
> due to undefined reference of drmGetVersion() and drmFreeVersion().
> This is why when pkg-config generates libavutil.pc doesn't append -ldrm
> after -lavutil.
> Subsequentely if a package uses pkg-config and ffmpeg it will load
> library dependencies from libavutil.pc without placing -ldrm at the tail.
> Without this fix the only way is to workaround the problem directly in
> the single package, like this:
> https://github.com/buildroot/buildroot/commit/daf7dd87f4d93923df5e757fd43b3ad214a4a2ae
> 
> Add patch to assure -ldrm comes after -lavutil when static linking.
> 
> Fixes:
> http://autobuild.buildroot.net/results/515/5152dcca58944cf732d09fba6e6c9af8a9243c75//
> http://autobuild.buildroot.net/results/395/395be1a9cab824b82ef34c2ebd84d54243029b33//
> 
> Signed-off-by: Giulio Benetti <giulio.benetti@micronovasrl.com>
> ---
>   ...igure-add-LIBDRM-to-extralibs_avutil.patch | 44 +++++++++++++++++++
>   1 file changed, 44 insertions(+)
>   create mode 100644 package/ffmpeg/0002-configure-add-LIBDRM-to-extralibs_avutil.patch
> 
> diff --git a/package/ffmpeg/0002-configure-add-LIBDRM-to-extralibs_avutil.patch b/package/ffmpeg/0002-configure-add-LIBDRM-to-extralibs_avutil.patch
> new file mode 100644
> index 0000000000..ae1f3423ae
> --- /dev/null
> +++ b/package/ffmpeg/0002-configure-add-LIBDRM-to-extralibs_avutil.patch
> @@ -0,0 +1,44 @@
> +From f4c9a7f55229d5275edb89c29ac9b18a737faf65 Mon Sep 17 00:00:00 2001
> +From: Giulio Benetti <giulio.benetti@micronovasrl.com>
> +Date: Tue, 11 Sep 2018 19:22:27 +0200
> +Subject: [PATCH] configure: add LIBDRM to extralibs_avutil
> +
> +When static linking programs using ffmpeg libraries, if linking against
> +libavutil, -ldrm is listed before -lavutil. This leads to linking failure
> +due to undefined reference of drmGetVersion() and drmFreeVersion().
> +This is why when pkg-config create libavutil.pc doesn't append -ldrm
> +after -lavutil.
> +
> +Add -ldrm to LIBDRM in case libdrm is enabled and add $LIBDRM to
> +extralibs_avutil.
> +
> +Signed-off-by: Giulio Benetti <giulio.benetti@micronovasrl.com>
> +---
> + configure | 4 ++--
> + 1 file changed, 2 insertions(+), 2 deletions(-)
> +
> +diff --git a/configure b/configure
> +index 7377046d0a..7599fcc2bd 100755
> +--- a/configure
> ++++ b/configure
> +@@ -5919,7 +5919,7 @@ enabled libcelt           && require libcelt celt/celt.h celt_decode -lcelt0 &&
> +                                die "ERROR: libcelt must be installed and version must be >= 0.11.0."; }
> + enabled libcaca           && require_pkg_config libcaca caca caca.h caca_create_canvas
> + enabled libdc1394         && require_pkg_config libdc1394 libdc1394-2 dc1394/dc1394.h dc1394_new
> +-enabled libdrm            && require_pkg_config libdrm libdrm xf86drm.h drmGetVersion
> ++enabled libdrm            && require_pkg_config libdrm libdrm xf86drm.h drmGetVersion && LIBDRM="-ldrm"
> + enabled libfdk_aac        && { use_pkg_config libfdk_aac fdk-aac "fdk-aac/aacenc_lib.h" aacEncOpen ||
> +                                { require libfdk_aac fdk-aac/aacenc_lib.h aacEncOpen -lfdk-aac &&
> +                                  warn "using libfdk without pkg-config"; } }
> +@@ -7096,7 +7096,7 @@ source_path=${source_path}
> + LIBPREF=${LIBPREF}
> + LIBSUF=${LIBSUF}
> +
> +-extralibs_avutil="$LIBRT $LIBM"
> ++extralibs_avutil="$LIBDRM $LIBRT $LIBM"
> + extralibs_avcodec="$extralibs"
> + extralibs_avformat="$extralibs"
> + extralibs_avdevice="$extralibs"
> +--
> +2.17.1
> +
> 

The patch above has been upstreamed:
https://git.ffmpeg.org/gitweb/ffmpeg.git/commit/c50dc77ac708e98d02da7c422a6b9cbf9f565aa5
Giulio Benetti Sept. 13, 2018, 8:15 a.m. UTC | #2
Il 11/09/2018 23:47, Giulio Benetti ha scritto:
> Hello,
> 
> Il 11/09/2018 22:42, Giulio Benetti ha scritto:
>> When static linking programs using ffmpeg libraries, if linking against
>> libavutil, -ldrm is listed before -lavutil. This leads to linking failure
>> due to undefined reference of drmGetVersion() and drmFreeVersion().
>> This is why when pkg-config generates libavutil.pc doesn't append -ldrm
>> after -lavutil.
>> Subsequentely if a package uses pkg-config and ffmpeg it will load
>> library dependencies from libavutil.pc without placing -ldrm at the tail.
>> Without this fix the only way is to workaround the problem directly in
>> the single package, like this:
>> https://github.com/buildroot/buildroot/commit/daf7dd87f4d93923df5e757fd43b3ad214a4a2ae 
>>
>>
>> Add patch to assure -ldrm comes after -lavutil when static linking.
>>
>> Fixes:
>> http://autobuild.buildroot.net/results/515/5152dcca58944cf732d09fba6e6c9af8a9243c75// 
>>
>> http://autobuild.buildroot.net/results/395/395be1a9cab824b82ef34c2ebd84d54243029b33// 
>>
>>
>> Signed-off-by: Giulio Benetti <giulio.benetti@micronovasrl.com>
>> ---
>>   ...igure-add-LIBDRM-to-extralibs_avutil.patch | 44 +++++++++++++++++++
>>   1 file changed, 44 insertions(+)
>>   create mode 100644 
>> package/ffmpeg/0002-configure-add-LIBDRM-to-extralibs_avutil.patch
>>
>> diff --git 
>> a/package/ffmpeg/0002-configure-add-LIBDRM-to-extralibs_avutil.patch 
>> b/package/ffmpeg/0002-configure-add-LIBDRM-to-extralibs_avutil.patch
>> new file mode 100644
>> index 0000000000..ae1f3423ae
>> --- /dev/null
>> +++ b/package/ffmpeg/0002-configure-add-LIBDRM-to-extralibs_avutil.patch
>> @@ -0,0 +1,44 @@
>> +From f4c9a7f55229d5275edb89c29ac9b18a737faf65 Mon Sep 17 00:00:00 2001
>> +From: Giulio Benetti <giulio.benetti@micronovasrl.com>
>> +Date: Tue, 11 Sep 2018 19:22:27 +0200
>> +Subject: [PATCH] configure: add LIBDRM to extralibs_avutil
>> +
>> +When static linking programs using ffmpeg libraries, if linking against
>> +libavutil, -ldrm is listed before -lavutil. This leads to linking 
>> failure
>> +due to undefined reference of drmGetVersion() and drmFreeVersion().
>> +This is why when pkg-config create libavutil.pc doesn't append -ldrm
>> +after -lavutil.
>> +
>> +Add -ldrm to LIBDRM in case libdrm is enabled and add $LIBDRM to
>> +extralibs_avutil.
>> +
>> +Signed-off-by: Giulio Benetti <giulio.benetti@micronovasrl.com>
>> +---
>> + configure | 4 ++--
>> + 1 file changed, 2 insertions(+), 2 deletions(-)
>> +
>> +diff --git a/configure b/configure
>> +index 7377046d0a..7599fcc2bd 100755
>> +--- a/configure
>> ++++ b/configure
>> +@@ -5919,7 +5919,7 @@ enabled libcelt           && require libcelt 
>> celt/celt.h celt_decode -lcelt0 &&
>> +                                die "ERROR: libcelt must be installed 
>> and version must be >= 0.11.0."; }
>> + enabled libcaca           && require_pkg_config libcaca caca caca.h 
>> caca_create_canvas
>> + enabled libdc1394         && require_pkg_config libdc1394 
>> libdc1394-2 dc1394/dc1394.h dc1394_new
>> +-enabled libdrm            && require_pkg_config libdrm libdrm 
>> xf86drm.h drmGetVersion
>> ++enabled libdrm            && require_pkg_config libdrm libdrm 
>> xf86drm.h drmGetVersion && LIBDRM="-ldrm"
>> + enabled libfdk_aac        && { use_pkg_config libfdk_aac fdk-aac 
>> "fdk-aac/aacenc_lib.h" aacEncOpen ||
>> +                                { require libfdk_aac 
>> fdk-aac/aacenc_lib.h aacEncOpen -lfdk-aac &&
>> +                                  warn "using libfdk without 
>> pkg-config"; } }
>> +@@ -7096,7 +7096,7 @@ source_path=${source_path}
>> + LIBPREF=${LIBPREF}
>> + LIBSUF=${LIBSUF}
>> +
>> +-extralibs_avutil="$LIBRT $LIBM"
>> ++extralibs_avutil="$LIBDRM $LIBRT $LIBM"
>> + extralibs_avcodec="$extralibs"
>> + extralibs_avformat="$extralibs"
>> + extralibs_avdevice="$extralibs"
>> +--
>> +2.17.1
>> +
>>
> 
> The patch above has been upstreamed:
> https://git.ffmpeg.org/gitweb/ffmpeg.git/commit/c50dc77ac708e98d02da7c422a6b9cbf9f565aa5 
> 
> 

For completeness I point that the "Fixes:" are for "Motion" package.

Best regards
Thomas Petazzoni Sept. 16, 2018, 8:22 p.m. UTC | #3
Hello Giulio,

On Tue, 11 Sep 2018 22:42:30 +0200, Giulio Benetti wrote:
> When static linking programs using ffmpeg libraries, if linking against
> libavutil, -ldrm is listed before -lavutil.

I think this is not relevant in the explanation, the fact that motion
links with libdrm directly is independent from the fact that ffmpeg may
use libdrm internally.

> This leads to linking failure
> due to undefined reference of drmGetVersion() and drmFreeVersion().
> This is why when pkg-config generates libavutil.pc doesn't append -ldrm

pkg-config does not generate .pc files, it only reads them.

> after -lavutil.
> Subsequentely if a package uses pkg-config and ffmpeg it will load
> library dependencies from libavutil.pc without placing -ldrm at the tail.

Well, the fact that it's at the tail is a detail, but the main problem
is that the libavutil.pc file does not list *at all* the dependency on
libdrm.

> Without this fix the only way is to workaround the problem directly in
> the single package, like this:

"the single package" is not very clear, I would say "in each package
using ffmpeg".

> https://github.com/buildroot/buildroot/commit/daf7dd87f4d93923df5e757fd43b3ad214a4a2ae
> 
> Add patch to assure -ldrm comes after -lavutil when static linking.

No, that's not what the patch does. The patch ensures that libavutil.pc
tells pkg-config that linking against libdrm is needed.


> ++enabled libdrm            && require_pkg_config libdrm libdrm xf86drm.h drmGetVersion && LIBDRM="-ldrm"
> + enabled libfdk_aac        && { use_pkg_config libfdk_aac fdk-aac "fdk-aac/aacenc_lib.h" aacEncOpen ||
> +                                { require libfdk_aac fdk-aac/aacenc_lib.h aacEncOpen -lfdk-aac &&
> +                                  warn "using libfdk without pkg-config"; } }
> +@@ -7096,7 +7096,7 @@ source_path=${source_path}
> + LIBPREF=${LIBPREF}
> + LIBSUF=${LIBSUF}
> + 
> +-extralibs_avutil="$LIBRT $LIBM"
> ++extralibs_avutil="$LIBDRM $LIBRT $LIBM"

This fix is in fact not the most correct one. Indeed, it does the
following change to libavutil.pc:

-Libs: -L${libdir}  -lavutil -lm
+Libs: -L${libdir}  -lavutil -ldrm -lm

but the proper change would be:

 Libs: -L${libdir}  -lavutil -lm
-Libs.private:
+Libs.private: -ldrm

Indeed, when we're dynamic linking, there is no need to link consumers
of libavutil with libdrm. It is only when we're statically linking that
it should be done. And that's exactly what Libs vs. Libs.private is for.

Best regards,

Thomas Petazzoni
Giulio Benetti Sept. 24, 2018, 10:26 a.m. UTC | #4
Hello Thomas,

Il 16/09/2018 22:22, Thomas Petazzoni ha scritto:
> Hello Giulio,
> 
> On Tue, 11 Sep 2018 22:42:30 +0200, Giulio Benetti wrote:
>> When static linking programs using ffmpeg libraries, if linking against
>> libavutil, -ldrm is listed before -lavutil.
> 
> I think this is not relevant in the explanation, the fact that motion
> links with libdrm directly is independent from the fact that ffmpeg may
> use libdrm internally.
> 
>> This leads to linking failure
>> due to undefined reference of drmGetVersion() and drmFreeVersion().
>> This is why when pkg-config generates libavutil.pc doesn't append -ldrm
> 
> pkg-config does not generate .pc files, it only reads them.
> 
>> after -lavutil.
>> Subsequentely if a package uses pkg-config and ffmpeg it will load
>> library dependencies from libavutil.pc without placing -ldrm at the tail.
> 
> Well, the fact that it's at the tail is a detail, but the main problem
> is that the libavutil.pc file does not list *at all* the dependency on
> libdrm.
> 
>> Without this fix the only way is to workaround the problem directly in
>> the single package, like this:
> 
> "the single package" is not very clear, I would say "in each package
> using ffmpeg".
> 
>> https://github.com/buildroot/buildroot/commit/daf7dd87f4d93923df5e757fd43b3ad214a4a2ae
>>
>> Add patch to assure -ldrm comes after -lavutil when static linking.
> 
> No, that's not what the patch does. The patch ensures that libavutil.pc
> tells pkg-config that linking against libdrm is needed.
> 
> 
>> ++enabled libdrm            && require_pkg_config libdrm libdrm xf86drm.h drmGetVersion && LIBDRM="-ldrm"
>> + enabled libfdk_aac        && { use_pkg_config libfdk_aac fdk-aac "fdk-aac/aacenc_lib.h" aacEncOpen ||
>> +                                { require libfdk_aac fdk-aac/aacenc_lib.h aacEncOpen -lfdk-aac &&
>> +                                  warn "using libfdk without pkg-config"; } }
>> +@@ -7096,7 +7096,7 @@ source_path=${source_path}
>> + LIBPREF=${LIBPREF}
>> + LIBSUF=${LIBSUF}
>> +
>> +-extralibs_avutil="$LIBRT $LIBM"
>> ++extralibs_avutil="$LIBDRM $LIBRT $LIBM"
> 
> This fix is in fact not the most correct one. Indeed, it does the
> following change to libavutil.pc:
> 
> -Libs: -L${libdir}  -lavutil -lm
> +Libs: -L${libdir}  -lavutil -ldrm -lm
> 
> but the proper change would be:
> 
>   Libs: -L${libdir}  -lavutil -lm
> -Libs.private:
> +Libs.private: -ldrm
> 
> Indeed, when we're dynamic linking, there is no need to link consumers
> of libavutil with libdrm. It is only when we're statically linking that
> it should be done. And that's exactly what Libs vs. Libs.private is for.

You've explained me it very well, but by now FFmpeg upstreamed my patch:
https://git.ffmpeg.org/gitweb/ffmpeg.git/commit/c50dc77ac708e98d02da7c422a6b9cbf9f565aa5

So, do I rework and resubmit to them or can I re-create a patch for BR
with what you've pointed me above?

Thanks
Kind regards
Thomas Petazzoni Sept. 24, 2018, 11:09 a.m. UTC | #5
Hello,

On Mon, 24 Sep 2018 12:26:05 +0200, Giulio Benetti wrote:

> > Indeed, when we're dynamic linking, there is no need to link consumers
> > of libavutil with libdrm. It is only when we're statically linking that
> > it should be done. And that's exactly what Libs vs. Libs.private is for.  
> 
> You've explained me it very well, but by now FFmpeg upstreamed my patch:
> https://git.ffmpeg.org/gitweb/ffmpeg.git/commit/c50dc77ac708e98d02da7c422a6b9cbf9f565aa5
> 
> So, do I rework and resubmit to them or can I re-create a patch for BR
> with what you've pointed me above?

Both ? :-)

Thomas
Giulio Benetti Sept. 24, 2018, 11:11 a.m. UTC | #6
Il 24/09/2018 13:09, Thomas Petazzoni ha scritto:
> Hello,
> 
> On Mon, 24 Sep 2018 12:26:05 +0200, Giulio Benetti wrote:
> 
>>> Indeed, when we're dynamic linking, there is no need to link consumers
>>> of libavutil with libdrm. It is only when we're statically linking that
>>> it should be done. And that's exactly what Libs vs. Libs.private is for.
>>
>> You've explained me it very well, but by now FFmpeg upstreamed my patch:
>> https://git.ffmpeg.org/gitweb/ffmpeg.git/commit/c50dc77ac708e98d02da7c422a6b9cbf9f565aa5
>>
>> So, do I rework and resubmit to them or can I re-create a patch for BR
>> with what you've pointed me above?
> 
> Both ? :-)

Ok!
Giulio Benetti Oct. 12, 2018, 5:38 p.m. UTC | #7
Hello Thomas,

Il 24/09/2018 13:11, Giulio Benetti ha scritto:
> Il 24/09/2018 13:09, Thomas Petazzoni ha scritto:
>> Hello,
>>
>> On Mon, 24 Sep 2018 12:26:05 +0200, Giulio Benetti wrote:
>>
>>>> Indeed, when we're dynamic linking, there is no need to link consumers
>>>> of libavutil with libdrm. It is only when we're statically linking that
>>>> it should be done. And that's exactly what Libs vs. Libs.private is for.
>>>
>>> You've explained me it very well, but by now FFmpeg upstreamed my patch:
>>> https://git.ffmpeg.org/gitweb/ffmpeg.git/commit/c50dc77ac708e98d02da7c422a6b9cbf9f565aa5
>>>
>>> So, do I rework and resubmit to them or can I re-create a patch for BR
>>> with what you've pointed me above?
I've missed one thing to ask you about ffmpeg:
Can I still use this hack:
https://git.ffmpeg.org/gitweb/ffmpeg.git/blobdiff/bc2301429e9c779237e43acf913331af018211f2..c50dc77ac708e98d02da7c422a6b9cbf9f565aa5:/configure

to obtain if -ldrm is used and then add it to Libs.private like this:
Libs.private: -ldrm

as you've pointed me.

Or there is something that makes it simpler and better?

Thanks in advance
Best regards
Thomas Petazzoni Oct. 12, 2018, 7:50 p.m. UTC | #8
Hello,

On Fri, 12 Oct 2018 19:38:14 +0200, Giulio Benetti wrote:

> >>>> Indeed, when we're dynamic linking, there is no need to link consumers
> >>>> of libavutil with libdrm. It is only when we're statically linking that
> >>>> it should be done. And that's exactly what Libs vs. Libs.private is for.  
> >>>
> >>> You've explained me it very well, but by now FFmpeg upstreamed my patch:
> >>> https://git.ffmpeg.org/gitweb/ffmpeg.git/commit/c50dc77ac708e98d02da7c422a6b9cbf9f565aa5
> >>>
> >>> So, do I rework and resubmit to them or can I re-create a patch for BR
> >>> with what you've pointed me above?  
> I've missed one thing to ask you about ffmpeg:
> Can I still use this hack:
> https://git.ffmpeg.org/gitweb/ffmpeg.git/blobdiff/bc2301429e9c779237e43acf913331af018211f2..c50dc77ac708e98d02da7c422a6b9cbf9f565aa5:/configure
> 
> to obtain if -ldrm is used and then add it to Libs.private like this:
> Libs.private: -ldrm
> 
> as you've pointed me.
> 
> Or there is something that makes it simpler and better?

I'm not sure what "hack" you're talking about here. My only point it is
only needed to link "indirect" libraries when static linking, and
therefore such "indirect" libraries should be listed in Libs.private
and not Libs in pkg-config files.

Best regards,

Thomas
Giulio Benetti Oct. 12, 2018, 8:54 p.m. UTC | #9
Hello,

Il 12/10/2018 21:50, Thomas Petazzoni ha scritto:
> Hello,
> 
> On Fri, 12 Oct 2018 19:38:14 +0200, Giulio Benetti wrote:
> 
>>>>>> Indeed, when we're dynamic linking, there is no need to link consumers
>>>>>> of libavutil with libdrm. It is only when we're statically linking that
>>>>>> it should be done. And that's exactly what Libs vs. Libs.private is for.
>>>>>
>>>>> You've explained me it very well, but by now FFmpeg upstreamed my patch:
>>>>> https://git.ffmpeg.org/gitweb/ffmpeg.git/commit/c50dc77ac708e98d02da7c422a6b9cbf9f565aa5
>>>>>
>>>>> So, do I rework and resubmit to them or can I re-create a patch for BR
>>>>> with what you've pointed me above?
>> I've missed one thing to ask you about ffmpeg:
>> Can I still use this hack:
>> https://git.ffmpeg.org/gitweb/ffmpeg.git/blobdiff/bc2301429e9c779237e43acf913331af018211f2..c50dc77ac708e98d02da7c422a6b9cbf9f565aa5:/configure
>>
>> to obtain if -ldrm is used and then add it to Libs.private like this:
>> Libs.private: -ldrm
>>
>> as you've pointed me.
>>
>> Or there is something that makes it simpler and better?
> 
> I'm not sure what "hack" you're talking about here. My only point it is
> only needed to link "indirect" libraries when static linking, and
> therefore such "indirect" libraries should be listed in Libs.private
> and not Libs in pkg-config files.

Ok, sorry but I don't have much experience with Autotools and 
dynamic/static linking, I'm learning here "on the field".
I will try to submit a patch producing what you've described in the best 
way I can.

Best regards
Giulio Benetti Oct. 16, 2018, 7:31 p.m. UTC | #10
Hello Thomas,

Il 12/10/2018 22:54, Giulio Benetti ha scritto:
> Hello,
> 
> Il 12/10/2018 21:50, Thomas Petazzoni ha scritto:
>> Hello,
>>
>> On Fri, 12 Oct 2018 19:38:14 +0200, Giulio Benetti wrote:
>>
>>>>>>> Indeed, when we're dynamic linking, there is no need to link consumers
>>>>>>> of libavutil with libdrm. It is only when we're statically linking that
>>>>>>> it should be done. And that's exactly what Libs vs. Libs.private is for.
>>>>>>
>>>>>> You've explained me it very well, but by now FFmpeg upstreamed my patch:
>>>>>> https://git.ffmpeg.org/gitweb/ffmpeg.git/commit/c50dc77ac708e98d02da7c422a6b9cbf9f565aa5
>>>>>>
>>>>>> So, do I rework and resubmit to them or can I re-create a patch for BR
>>>>>> with what you've pointed me above?
>>> I've missed one thing to ask you about ffmpeg:
>>> Can I still use this hack:
>>> https://git.ffmpeg.org/gitweb/ffmpeg.git/blobdiff/bc2301429e9c779237e43acf913331af018211f2..c50dc77ac708e98d02da7c422a6b9cbf9f565aa5:/configure
>>>
>>> to obtain if -ldrm is used and then add it to Libs.private like this:
>>> Libs.private: -ldrm
>>>
>>> as you've pointed me.
>>>
>>> Or there is something that makes it simpler and better?
>>
>> I'm not sure what "hack" you're talking about here. My only point it is
>> only needed to link "indirect" libraries when static linking, and
>> therefore such "indirect" libraries should be listed in Libs.private
>> and not Libs in pkg-config files.

I've worked this out, but I have a question:
Since FFMpeg upstreamed my previous wrong patch:
https://git.ffmpeg.org/gitweb/ffmpeg.git/commit/c50dc77ac708e98d02da7c422a6b9cbf9f565aa5

now I would submit another patch to FFMpeg to correct Libs vs 
Libs.private problem.

Here is the new patch:
https://github.com/giuliobenetti/FFmpeg/commit/d682f418b7912b9d9e1818aefa61a51a2868fb20

So:
do I have to submit to Buildroot a patch containing both patches?
Or only one that merge both patches together even if it's not upstreamable?

Thanks in advance
Best regards
Giulio Benetti Oct. 17, 2018, 10:36 a.m. UTC | #11
Hello,

Il 16/10/2018 21:31, Giulio Benetti ha scritto:
> Hello Thomas,
> 
> Il 12/10/2018 22:54, Giulio Benetti ha scritto:
>> Hello,
>>
>> Il 12/10/2018 21:50, Thomas Petazzoni ha scritto:
>>> Hello,
>>>
>>> On Fri, 12 Oct 2018 19:38:14 +0200, Giulio Benetti wrote:
>>>
>>>>>>>> Indeed, when we're dynamic linking, there is no need to link consumers
>>>>>>>> of libavutil with libdrm. It is only when we're statically linking that
>>>>>>>> it should be done. And that's exactly what Libs vs. Libs.private is for.
>>>>>>>
>>>>>>> You've explained me it very well, but by now FFmpeg upstreamed my patch:
>>>>>>> https://git.ffmpeg.org/gitweb/ffmpeg.git/commit/c50dc77ac708e98d02da7c422a6b9cbf9f565aa5
>>>>>>>
>>>>>>> So, do I rework and resubmit to them or can I re-create a patch for BR
>>>>>>> with what you've pointed me above?
>>>> I've missed one thing to ask you about ffmpeg:
>>>> Can I still use this hack:
>>>> https://git.ffmpeg.org/gitweb/ffmpeg.git/blobdiff/bc2301429e9c779237e43acf913331af018211f2..c50dc77ac708e98d02da7c422a6b9cbf9f565aa5:/configure
>>>>
>>>> to obtain if -ldrm is used and then add it to Libs.private like this:
>>>> Libs.private: -ldrm
>>>>
>>>> as you've pointed me.
>>>>
>>>> Or there is something that makes it simpler and better?
>>>
>>> I'm not sure what "hack" you're talking about here. My only point it is
>>> only needed to link "indirect" libraries when static linking, and
>>> therefore such "indirect" libraries should be listed in Libs.private
>>> and not Libs in pkg-config files.
> 
> I've worked this out, but I have a question:
> Since FFMpeg upstreamed my previous wrong patch:
> https://git.ffmpeg.org/gitweb/ffmpeg.git/commit/c50dc77ac708e98d02da7c422a6b9cbf9f565aa5
> 
> now I would submit another patch to FFMpeg to correct Libs vs
> Libs.private problem.
> 
> Here is the new patch:
> https://github.com/giuliobenetti/FFmpeg/commit/d682f418b7912b9d9e1818aefa61a51a2868fb20
> 
> So:
> do I have to submit to Buildroot a patch containing both patches?
> Or only one that merge both patches together even if it's not upstreamable?

I think I've answered myself, I need to:
- send patch to Revert "c50dc77ac708e98d02da7c422a6b9cbf9f565aa5"
- send new patch that is the squash of these 2 patches(1 already 
upstream and 1 that fixes the problem):
 
https://github.com/giuliobenetti/FFmpeg/commit/c50dc77ac708e98d02da7c422a6b9cbf9f565aa5
 
https://github.com/giuliobenetti/FFmpeg/commit/d682f418b7912b9d9e1818aefa61a51a2868fb20
diff mbox series

Patch

diff --git a/package/ffmpeg/0002-configure-add-LIBDRM-to-extralibs_avutil.patch b/package/ffmpeg/0002-configure-add-LIBDRM-to-extralibs_avutil.patch
new file mode 100644
index 0000000000..ae1f3423ae
--- /dev/null
+++ b/package/ffmpeg/0002-configure-add-LIBDRM-to-extralibs_avutil.patch
@@ -0,0 +1,44 @@ 
+From f4c9a7f55229d5275edb89c29ac9b18a737faf65 Mon Sep 17 00:00:00 2001
+From: Giulio Benetti <giulio.benetti@micronovasrl.com>
+Date: Tue, 11 Sep 2018 19:22:27 +0200
+Subject: [PATCH] configure: add LIBDRM to extralibs_avutil
+
+When static linking programs using ffmpeg libraries, if linking against
+libavutil, -ldrm is listed before -lavutil. This leads to linking failure
+due to undefined reference of drmGetVersion() and drmFreeVersion().
+This is why when pkg-config create libavutil.pc doesn't append -ldrm
+after -lavutil.
+
+Add -ldrm to LIBDRM in case libdrm is enabled and add $LIBDRM to
+extralibs_avutil.
+
+Signed-off-by: Giulio Benetti <giulio.benetti@micronovasrl.com>
+---
+ configure | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/configure b/configure
+index 7377046d0a..7599fcc2bd 100755
+--- a/configure
++++ b/configure
+@@ -5919,7 +5919,7 @@ enabled libcelt           && require libcelt celt/celt.h celt_decode -lcelt0 &&
+                                die "ERROR: libcelt must be installed and version must be >= 0.11.0."; }
+ enabled libcaca           && require_pkg_config libcaca caca caca.h caca_create_canvas
+ enabled libdc1394         && require_pkg_config libdc1394 libdc1394-2 dc1394/dc1394.h dc1394_new
+-enabled libdrm            && require_pkg_config libdrm libdrm xf86drm.h drmGetVersion
++enabled libdrm            && require_pkg_config libdrm libdrm xf86drm.h drmGetVersion && LIBDRM="-ldrm"
+ enabled libfdk_aac        && { use_pkg_config libfdk_aac fdk-aac "fdk-aac/aacenc_lib.h" aacEncOpen ||
+                                { require libfdk_aac fdk-aac/aacenc_lib.h aacEncOpen -lfdk-aac &&
+                                  warn "using libfdk without pkg-config"; } }
+@@ -7096,7 +7096,7 @@ source_path=${source_path}
+ LIBPREF=${LIBPREF}
+ LIBSUF=${LIBSUF}
+ 
+-extralibs_avutil="$LIBRT $LIBM"
++extralibs_avutil="$LIBDRM $LIBRT $LIBM"
+ extralibs_avcodec="$extralibs"
+ extralibs_avformat="$extralibs"
+ extralibs_avdevice="$extralibs"
+-- 
+2.17.1
+