[FFmpeg-devel] configure needs to check for OpenCL version 1.2 and look elsewhere as well
Wei Gao
highgod0401 at gmail.com
Tue Apr 23 03:02:21 CEST 2013
2013/4/23 Hanspeter Niederstrasser <niederstrasser at gmail.com>
> On Sun, Apr 21, 2013 at 7:33 AM, Wei Gao <highgod0401 at gmail.com> wrote:
> > Hi
> >
> >
> > 2013/4/20 Hanspeter Niederstrasser <niederstrasser at gmail.com>
> >
> >> On Fri, Apr 19, 2013 at 10:52 PM, Wei Gao <highgod0401 at gmail.com>
> wrote:
> >> > Hi, sorry for replying late, and also I am not familiar with configure
> >> > things, I do some works and test as your patch, some comments as
> follows:
> >>
> >> No problem. I'm also trying to figure this out as I go.
> >>
> >> > 2013/4/13 Hanspeter Niederstrasser <niederstrasser at gmail.com>
> >> >
> >> >> The OpenCL test just checks for CL/cl.h which doesn't exist on OS X
> >> >> (it's at OpenCL/cl.h). In trying to fix that, I also noticed that
> >> >> ffmpeg needs OpenCL >= 1.2, so I tried to add a version check to
> >> >> configure as well. Here's my current patch, but it is not setting
> >> >> HAVE_OPENCL_CL_H, even though config.log says that the header and
> >> >> library were found.
> >> >>
> >> >> diff --git a/configure b/configure
> >> >> index fe976fd..83bb71f 100755
> >> >> --- a/configure
> >> >> +++ b/configure
> >> >> @@ -1471,6 +1471,7 @@ HAVE_LIST="
> >> >> mprotect
> >> >> msvcrt
> >> >> nanosleep
> >> >> + opencl_cl_h
> >> >> openjpeg_1_5_openjpeg_h
> >> >> PeekNamedPipe
> >> >> perl
> >> >>
> >> > it should add a check header line:check_header opencl/cl.h to set the
> >> > opencl_cl_h
> >>
> >> Both check_lib() and require() already call check_header(), but even
> >> when I just use
> >>
> >> enabled opencl && check_header OpenCL/cl.h
> >>
> >> HAVE_OPENCL_CL_H is not set in config.log. To make sure my syntax is
> >> right, when I search for the completely unrelated header
> >> "exiv2/exv_conf.h", HAVE_EXIV2_EXV_CONF_H is set to 1 in config.log.
> >>
> > I use CL_CL_H to test on my computer:
> > 1. check_header cl/cl.h
> > 2.HAVE_LIST="
> > cl_cl_h
> > the HAVE_CL_CL_H can be set to 1, and the result is correct. Do you try
> > that?
>
> Yes, although I used "OpenCL/cl.h" and "opencl_cl_h", respectively, in
> order to match where the cl.h header is on OS X. And when I do that,
> configure passes, but I get "#define HAVE_OPENCL_CL_H 0" in config.h
> (using just CL/cl.h causes a 'header not found' error during
> configure).
>
> >> >> @@ -4034,7 +4035,12 @@ enabled openal && { { for al_libs in
> >> >> "${OPENAL_LIBS}" "-lopenal" "-lOpenAL32
> >> >> die "ERROR: openal not found"; } &&
> >> >> { check_cpp_condition "AL/al.h"
> >> >> "defined(AL_VERSION_1_1)" ||
> >> >> die "ERROR: openal must be installed and
> >> >> version must be 1.1 or compatible"; }
> >> >> -enabled opencl && require2 opencl CL/cl.h clEnqueueNDRangeKernel
> >> >> -lOpenCL
> >> >> +enabled opencl && { check_lib OpenCL/cl.h clEnqueueNDRangeKernel
> >> >> -Wl,-framework,OpenCL ||
> >> >> + check_lib CL/cl.h clEnqueueNDRangeKernel
> >> -lOpenCL
> >> >> ||
> >> >> + die "ERROR: opencl not found"; } &&
> >> >> + { check_cpp_condition "OpenCL/cl.h"
> >> >> "defined(CL_VERSION_1_2)" ||
> >> >> + check_cpp_condition "CL/cl.h"
> >> >> "defined(CL_VERSION_1_2)" ||
> >> >> + die "ERROR: opencl must be installed and
> >> >> version must be 1.2 or compatible"; }
> >> >>
> >> > I tried this on my computer, it does not pass the configure, I think
> it
> >> > should be written like this:
> >> > enabled opencl && { check_lib2 OpenCL/cl.h clEnqueueNDRangeKernel
> >> > -Wl,-framework,OpenCL ||
> >> > check_lib2 CL/cl.h clEnqueueNDRangeKernel
> >> -lOpenCL
> >> > ||
> >> > die "ERROR: opencl not found"; } &&
> >> > { check_cpp_condition "OpenCL/cl.h"
> >> > "defined(CL_VERSION_1_2)" ||
> >> > check_cpp_condition "CL/cl.h"
> >> > "defined(CL_VERSION_1_2)" ||
> >> > die "ERROR: opencl must be installed and
> version
> >> > must be 1.2 or compatible"; }
> >> > use check_lib2 to check, and this can pass on my computer.
> >>
> >> I've tried that too and configure accepts it, but config.log doesn't
> >> provide any indication that the header or the library were not found.
> >> If I give it a non-existing header, configure errors out, so the
> >> syntax seems right.
> >>
> >> when I use check_lib, the configure can't find clEnqueueNDRangeKernel,
> > if you use bin tools to review the lib, you can find that the function
> has
> > "@" symbol, I think it is a CPP lib and you can't use check_lib to detect
> > the function, you should use check_lib2, check_lib can't pass on my
> > computer.
>
> I have tried check_lib, check_lib2, and require. They all give the
> same result. The header is found, the function is detected, and the
> library is added to EXTRALIBS. However, none of the 3 mehods defines
> HAVE_OPENCL_CL_H. Since you say only check_lib2 works for you, I will
> only use that from now on.
>
> >> And I want to
> >> > ask a question: -Wl,-framework,OpenCL, what does these mean? Isn't
> >> > -lOpenCL OK?
> >>
> >> On OS X, the system OpenCL is found inside a Framework, rather than in
> >> the usual $(PREFIX)/{include,lib} layout found in most other systems,
> >> so -lOpenCL will not work. The actual file path is complicated, but
> >> OS X compilers and linkers know where to search for Frameworks if
> >> provided with a header of the form "OpenCL/cl.h" and a library of
> >> "-framework OpenCL". The "-Wl,-framework,OpenCL" string is just an
> >> alternative syntax so that the compiler passes "-framework OpenCL" to
> >> the linker.
> >>
> >>
> >>
> https://developer.apple.com/library/mac/#documentation/MacOSX/Conceptual/BPFrameworks/Tasks/IncludingFrameworks.html
> >
> >
> > can it pass the configuer stage? you can use cflags to indicate the path.
>
> No flags are needed to detect the header. The physical header path is
> "/System/Library/Frameworks/OpenCL.framework/Headers/cl.h", and
> passing "-I/System/Library/Frameworks/OpenCL.framework" and similar
> derivations do anything different.
>
> sorry, I am not familiar with apple os, and it seems that your path is
"/System/Library/Frameworks/OpenCL.framework/Headers/cl.h, and cflag is
/System/Library/Frameworks/OpenCL.framework, so can you try headers_cl_h?
1. check_header headers/cl.h
2.HAVE_LIST="
headers_cl_h
>> > enabled openssl && { check_lib openssl/ssl.h SSL_library_init
> >> >> -lssl -lcrypto ||
> >> >> check_lib openssl/ssl.h SSL_library_init
> >> >> -lssl32 -leay32 ||
> >> >> check_lib openssl/ssl.h SSL_library_init
> >> >> -lssl -lcrypto -lws2_32 -lgdi32 ||
> >> >> diff --git a/libavutil/opencl.h b/libavutil/opencl.h
> >> >> index acafe36..5450537 100644
> >> >> --- a/libavutil/opencl.h
> >> >> +++ b/libavutil/opencl.h
> >> >> @@ -31,7 +31,11 @@
> >> >> #ifndef LIBAVUTIL_OPENCL_H
> >> >> #define LIBAVUTIL_OPENCL_H
> >> >>
> >> >> +#if HAVE_OPENCL_CL_H
> >> >> +#include <OpenCL/cl.h>
> >> >> +#else
> >> >> #include <CL/cl.h>
> >> >> +#endif
> >> >> #include "config.h"
> >> >> #include "dict.h"
> >> >>
> >> > I think the #include "config.h" should above the #if HAVE_OPENCL_CL_H
> >> > line. It should be written as follows:
> >> >
> >> > #include "config.h"
> >> > +#if HAVE_OPENCL_CL_H
> >> > +#include <OpenCL/cl.h>
> >> > +#else
> >> > #include <CL/cl.h>
> >> > +#endif
> >> > #include "dict.h"
> >>
> >> You're right. I had kept the original order, but config.h is needed
> >> to find HAVE_OPENCL_CL_H.
> >>
> >> An alternative would be to conditional the header choice in opencl.h
> >> on __APPLE__ instead of HAVE_OPENCL_CL_H. The configure check does
> >> seem to work (it sets EXTRALIBS correctly, for example), but it would
> >> be nice to find out why HAVE_OPENCL_CL_H is not being set. Thanks
> >> again for your help.
> >>
> > HAVE_OPENCL_CL_H can be set because the HAVE_CL_CL_H can be set on my
> > computer, you can try my method.
> >
> > I use __APPLE__ in my previous patches, but it should be detected on
> the
> > configure stage, and stop the compile if the environment is not correct.
>
> I've copied/pasted directly from your examples and just replaced
> CL/cl.h with OpenCL/cl.h and HAVE_OPENCL_CL_H remains at 0. I think
> I'm going to clean up my branch and submit a patch that 1) uses
> check_lib2 to find the header and library, and 2) #ifdefs the header
> to use on __APPLE__ unless someone else has an idea as to why
> OpenCL/cl.h works for detecting the header in configure, but fails to
> set HAVE_OPENCL_CL_H. The checks should still work for "CL/cl.h +
> -lOpenCL" systems.
>
> Hanspeter
>
> --
> Disclaimer:
> By sending an email to ANY of my addresses you are agreeing that:
> 1. I am by definition, "the intended recipient"
> 2. All information in the email is mine to do with as I see fit and
> make such financial profit, political mileage, or good joke as it
> lends itself to.
> 3. I may take the contents as representing the views of your company.
> 4. This overrides any disclaimer or statement of confidentiality that
> may be included with your message.
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
More information about the ffmpeg-devel
mailing list