Bug 340944

Summary: Build failed against libjpeg-turbo-1.3.90
Product: [Applications] digikam Reporter: nucleo <nucleo>
Component: Portability-CompilationAssignee: Digikam Developers <digikam-bugs-null>
Status: RESOLVED UPSTREAM    
Severity: normal CC: caulier.gilles, rdieter
Priority: NOR    
Version: 4.5.0   
Target Milestone: ---   
Platform: Other   
OS: Other   
Latest Commit: Version Fixed In: 7.6.0
Attachments: workaround build failures with newer libjpeg-turbo builds
patch to MacroJPEG.cmake to check jpeg lib definitions

Description nucleo 2014-11-14 05:49:13 UTC
digiKam 4.5.0 build failed against latest libjpeg-turbo-1.3.90:

[ 48%] Building C object extra/kipi-plugins/common/libkipiplugins/CMakeFiles/kipiplugins.dir/tools/imageio/iccjpeg.c.o
cd extra/kipi-plugins/common/libkipiplugins && /usr/bin/cc  -DAREA_CODE_GENERAL=51000 -DAREA_CODE_LOADING=51001 -DKDE4_CMAKE_TOPLEVEL_DIR_LENGTH=21 -DKDE_DEFAULT_DEBUG_AREA=51000 -DKDE_DEPRECATED_WARNINGS -DMAKE_KIPIPLUGINS_LIB -DQT_NO_CAST_TO_ASCII -DQT_NO_STL -DQT_USE_FAST_CONCATENATION -DQT_USE_FAST_OPERATOR_PLUS -D_BSD_SOURCE -D_DEFAULT_SOURCE -D_REENTRANT -D_XOPEN_SOURCE=500 -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches  -m64 -mtune=generic  -Wno-long-long -std=iso9899:1990 -Wundef -Wcast-align -Werror-implicit-function-declaration -Wchar-subscripts -Wall -W -Wpointer-arith -Wwrite-strings -Wformat-security -Wmissing-format-attribute -fno-common -O2 -DNDEBUG -DQT_NO_DEBUG -fPIC -I. -I../../../../../extra/kipi-plugins/common/libkipiplugins -I../../../../../extra/kipi-plugins/common/libkipiplugins/dialogs -I../../../../../extra/kipi-plugins/common/libkipiplugins/widgets -I../../../../../extra/kipi-
plugins/common/libkipiplugins/tools -I../../../../../extra/kipi-plugins/common/libkipiplugins/tools/imageio -I/usr/include/opencv -I/usr/include/kde4 -I/usr/include/kde4/KDE -I/usr/include/KDE -I/usr/include/phonon -I/usr/include/QtXmlPatterns -I/usr/include/QtXml -I/usr/include/QtWebKit -I/usr/include/QtUiTools -I/usr/include/QtTest -I/usr/include/QtSvg -I/usr/include/QtSql -I/usr/include/QtScriptTools -I/usr/include/QtScript -I/usr/include/QtOpenGL -I/usr/include/QtNetwork -I/usr/include/QtMultimedia -I/usr/include/QtHelp -I/usr/include/QtDesigner -I/usr/include/QtDeclarative -I/usr/include/QtDBus -I/usr/include/Qt3Support -I/usr/include/QtGui -I/usr/include/QtCore -I/usr/include/Qt -I/usr/lib64/qt4/mkspecs/default    -D_GNU_SOURCE -D_LARGEFILE64_SOURCE -o CMakeFiles/kipiplugins.dir/tools/imageio/iccjpeg.c.o   -c ../../../../../extra/kipi-plugins/common/libkipiplugins/tools/imageio/iccjpeg.c
In file included from ../../../../../extra/kipi-plugins/common/libkipiplugins/tools/imageio/iccjpeg.c:42:0:
../../../../../extra/kipi-plugins/common/libkipiplugins/tools/imageio/iccjpeg.h:56:31: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'JPP'
 extern void write_icc_profile JPP((j_compress_ptr cinfo,
                               ^
../../../../../extra/kipi-plugins/common/libkipiplugins/tools/imageio/iccjpeg.h:76:36: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'JPP'
 extern void setup_read_icc_profile JPP((j_decompress_ptr cinfo));
                                    ^
../../../../../extra/kipi-plugins/common/libkipiplugins/tools/imageio/iccjpeg.h:94:33: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'JPP'
 extern boolean read_icc_profile JPP((j_decompress_ptr cinfo,
                                 ^
../../../../../extra/kipi-plugins/common/libkipiplugins/tools/imageio/iccjpeg.c: In function 'read_icc_profile':
../../../../../extra/kipi-plugins/common/libkipiplugins/tools/imageio/iccjpeg.c:262:24: error: expected '=', ',', ';', 'asm' or '__attribute__' before '*' token
             JOCTET FAR *src_ptr = NULL;
                        ^
../../../../../extra/kipi-plugins/common/libkipiplugins/tools/imageio/iccjpeg.c:262:25: error: 'src_ptr' undeclared (first use in this function)
             JOCTET FAR *src_ptr = NULL;
                         ^
../../../../../extra/kipi-plugins/common/libkipiplugins/tools/imageio/iccjpeg.c:262:25: note: each undeclared identifier is reported only once for each function it appears in
extra/kipi-plugins/common/libkipiplugins/CMakeFiles/kipiplugins.dir/build.make:310: recipe for target 'extra/kipi-plugins/common/libkipiplugins/CMakeFiles/kipiplugins.dir/tools/imageio/iccjpeg.c.o' failed
make[2]: *** [extra/kipi-plugins/common/libkipiplugins/CMakeFiles/kipiplugins.dir/tools/imageio/iccjpeg.c.o] Error 1
make[2]: *** Waiting for unfinished jobs....
make -f core/utilities/importui/CMakeFiles/importui.dir/build.make core/utilities/importui/CMakeFiles/importui.dir/depend
make[2]: Entering directory '/builddir/build/BUILD/digikam-4.5.0/x86_64-redhat-linux-gnu'
cd /builddir/build/BUILD/digikam-4.5.0/x86_64-redhat-linux-gnu && /usr/bin/cmake -E cmake_depends "Unix Makefiles" /builddir/build/BUILD/digikam-4.5.0 /builddir/build/BUILD/digikam-4.5.0/core/utilities/importui /builddir/build/BUILD/digikam-4.5.0/x86_64-redhat-linux-gnu /builddir/build/BUILD/digikam-4.5.0/x86_64-redhat-linux-gnu/core/utilities/importui /builddir/build/BUILD/digikam-4.5.0/x86_64-redhat-linux-gnu/core/utilities/importui/CMakeFiles/importui.dir/DependInfo.cmake --color=
Generating kipiimagecollectionselector.moc
Generating addtagscompletionbox.moc
In file included from ../../../../../extra/kipi-plugins/common/libkipiplugins/tools/imageio/kpwriteimage.cpp:40:0:
../../../../../extra/kipi-plugins/common/libkipiplugins/tools/imageio/iccjpeg.h:56:31: error: expected initializer before 'JPP'
 extern void write_icc_profile JPP((j_compress_ptr cinfo,
                               ^
../../../../../extra/kipi-plugins/common/libkipiplugins/tools/imageio/iccjpeg.h:76:36: error: expected initializer before 'JPP'
 extern void setup_read_icc_profile JPP((j_decompress_ptr cinfo));
                                    ^
../../../../../extra/kipi-plugins/common/libkipiplugins/tools/imageio/iccjpeg.h:94:33: error: expected initializer before 'JPP'
 extern boolean read_icc_profile JPP((j_decompress_ptr cinfo,
                                 ^
../../../../../extra/kipi-plugins/common/libkipiplugins/tools/imageio/kpwriteimage.cpp: In member function 'bool KIPIPlugins::KPWriteImage::write2JPEG(const QString&)':
../../../../../extra/kipi-plugins/common/libkipiplugins/tools/imageio/kpwriteimage.cpp:189:88: error: 'write_icc_profile' was not declared in this scope
         write_icc_profile (&cinfo, (JOCTET *)d->iccProfile.data(), d->iccProfile.size());
                                                                                        ^
extra/kipi-plugins/common/libkipiplugins/CMakeFiles/kipiplugins.dir/build.make:287: recipe for target 'extra/kipi-plugins/common/libkipiplugins/CMakeFiles/kipiplugins.dir/tools/imageio/kpwriteimage.cpp.o' failed
make[2]: *** [extra/kipi-plugins/common/libkipiplugins/CMakeFiles/kipiplugins.dir/tools/imageio/kpwriteimage.cpp.o] Error 1
make[2]: Leaving directory '/builddir/build/BUILD/digikam-4.5.0/x86_64-redhat-linux-gnu'
CMakeFiles/Makefile2:324: recipe for target 'extra/kipi-plugins/common/libkipiplugins/CMakeFiles/kipiplugins.dir/all' failed
make[1]: *** [extra/kipi-plugins/common/libkipiplugins/CMakeFiles/kipiplugins.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....


[ 49%] Building CXX object core/app/CMakeFiles/digikamcore.dir/__/libs/dimg/loaders/jpegloader.cpp.o
cd core/app && /usr/bin/c++   -DKDE4_CMAKE_TOPLEVEL_DIR_LENGTH=21 -DKDE_DEFAULT_DEBUG_AREA=50003 -DKDE_DEPRECATED_WARNINGS -DMAKE_DIGIKAMCORE_LIB -DQT_NO_CAST_TO_ASCII -DQT_NO_STL -DQT_USE_FAST_CONCATENATION -DQT_USE_FAST_OPERATOR_PLUS -D_BSD_SOURCE -D_DEFAULT_SOURCE -D_REENTRANT -D_XOPEN_SOURCE=500 -Dlibjpeg_EXPORTS -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches  -m64 -mtune=generic  -Wnon-virtual-dtor -Wno-long-long -Wundef -Wcast-align -Wchar-subscripts -Wall -W -Wpointer-arith -Wformat-security -fno-exceptions -DQT_NO_EXCEPTIONS -fno-check-new -fno-common -Woverloaded-virtual -fno-threadsafe-statics -fvisibility=hidden -Werror=return-type -fvisibility-inlines-hidden -O2 -DNDEBUG -DQT_NO_DEBUG -fPIC -I. -I../../../core/app -I../../../core/databaseserver -I../../../core/app/album -I../../../core/app/database -I../../../core/app/date -I../../../core/app/dragdrop -I../../../core/app/filters -I../../../
core/app/items -I../../../core/app/items/overlays -I../../../core/app/main -I../../../core/app/fileaction -I../../../core/app/tags -I../../../core/app/tags/tagsmanager -I../../../core/app/tags/tagsmanager/models -I../../../core/app/utils -I../../../core/app/settings -I../../../core/app/views -I../../../core/app/views/tableview -I../../../core/imageplugins -I../../../core/imageplugins/color -I../../../core/imageplugins/decorate -I../../../core/imageplugins/enhance -I../../../core/imageplugins/enhance/hotpixels -I../../../core/imageplugins/filters -I../../../core/imageplugins/transform -I../../../core/kioslave -I../../../core/libs -I../../../core/libs/dklcms -I../../../core/libs/3rdparty/cimg -I../../../core/libs/3rdparty/kmemoryinfo -I../../../core/libs/3rdparty/kinotify -I../../../core/libs/database -I../../../core/libs/database/core -I../../../core/libs/database/haar -I../../../core/libs/database/imgqsort -I../../../core/libs/database/imagehistory -I../../../core/libs/database/faces -I../../../core/libs/
dialogs -I../../../core/libs/dimg -I../../../core/libs/dimg/filters -I../../../core/libs/dimg/filters/auto -I../../../core/libs/dimg/filters/bcg -I../../../core/libs/dimg/filters/bw -I../../../core/libs/dimg/filters/cb -I../../../core/libs/dimg/filters/curves -I../../../core/libs/dimg/filters/decorate -I../../../core/libs/dimg/filters/film -I../../../core/libs/dimg/filters/fx -I../../../core/libs/dimg/filters/greycstoration -I../../../core/libs/dimg/filters/hsl -I../../../core/libs/dimg/filters/icc -I../../../core/libs/dimg/filters/lc -I../../../core/libs/dimg/filters/lens -I../../../core/libs/dimg/filters/levels -I../../../core/libs/dimg/filters/nr -I../../../core/libs/dimg/filters/sharp -I../../../core/libs/dimg/filters/transform -I../../../core/libs/dimg/filters/wb -I../../../core/libs/dimg/imagehistory -I../../../core/libs/dimg/loaders -I../../../core/libs/dmetadata -I../../../core/libs/imageproperties -I../../../core/libs/kgeomaphelper -I../../../core/libs/jpegutils -I../../../core/libs/jpegutils/
libjpeg-62 -I../../../core/libs/models -I../../../core/libs/template -I../../../core/libs/progressmanager -I../../../core/libs/threadimageio -I../../../core/libs/threads -I../../../core/libs/versionmanager -I../../../core/libs/notificationmanager -I../../../core/libs/widgets/mainview -I../../../core/libs/widgets/common -I../../../core/libs/widgets/graphicsview -I../../../core/libs/widgets/itemview -I../../../core/libs/widgets/iccprofiles -I../../../core/libs/widgets/metadata -I../../../core/libs/widgets/imagehistory -I../../../core/tests -I../../../core/tests/modeltest -I../../../core/utilities -I../../../core/utilities/advancedrename -I../../../core/utilities/advancedrename/common -I../../../core/utilities/advancedrename/parser -I../../../core/utilities/advancedrename/parser/modifiers -I../../../core/utilities/advancedrename/parser/options -I../../../core/utilities/advancedrename/parser/options/database -I../../../core/utilities/advancedrename/parser/options/database/keys -I../../../core/utilities/
maintenance -I../../../core/utilities/importui -I../../../core/utilities/importui/backend -I../../../core/utilities/importui/dialogs -I../../../core/utilities/importui/items -I../../../core/utilities/importui/models -I../../../core/utilities/importui/views -I../../../core/utilities/importui/widgets -I../../../core/utilities/importui/main -I../../../core/utilities/facemanagement -I../../../core/utilities/firstrun -I../../../core/utilities/fuzzysearch -I../../../core/utilities/gpssearch -I../../../core/utilities/hotplug -I../../../core/utilities/imageeditor -I../../../core/utilities/imageeditor/core -I../../../core/utilities/imageeditor/main -I../../../core/utilities/imageeditor/dialogs -I../../../core/utilities/imageeditor/editor -I../../../core/utilities/imageeditor/plugin -I../../../core/utilities/imageeditor/printiface -I../../../core/utilities/imageeditor/rawimport -I../../../core/utilities/imageeditor/widgets -I../../../core/utilities/kipiiface -I../../../core/utilities/lighttable -I../../../core/
utilities/baloo -I../../../core/utilities/queuemanager/main -I../../../core/utilities/queuemanager/manager -I../../../core/utilities/queuemanager/views -I../../../core/utilities/queuemanager/basetools -I../../../core/utilities/queuemanager/basetools/color -I../../../core/utilities/queuemanager/basetools/convert -I../../../core/utilities/queuemanager/basetools/decorate -I../../../core/utilities/queuemanager/basetools/enhance -I../../../core/utilities/queuemanager/basetools/filters -I../../../core/utilities/queuemanager/basetools/metadata -I../../../core/utilities/queuemanager/basetools/transform -I../../../core/utilities/searchwindow -I../../../core/utilities/setup -I../../../core/utilities/slideshow -Iutils -Idatabase -I/usr/include/opencv -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -I/usr/include/kde4 -I/usr/include/kde4/KDE -I/usr/include/KDE -I/usr/include/phonon -I/usr/include/QtXmlPatterns -I/usr/include/QtXml -I/usr/include/QtWebKit -I/usr/include/QtUiTools -I/usr/include/QtTest -I/usr/
include/QtSvg -I/usr/include/QtSql -I/usr/include/QtScriptTools -I/usr/include/QtScript -I/usr/include/QtOpenGL -I/usr/include/QtNetwork -I/usr/include/QtMultimedia -I/usr/include/QtHelp -I/usr/include/QtDesigner -I/usr/include/QtDeclarative -I/usr/include/QtDBus -I/usr/include/Qt3Support -I/usr/include/QtGui -I/usr/include/QtCore -I/usr/include/Qt -I/usr/lib64/qt4/mkspecs/default -I/usr/include/libpgf -I/usr/include/gphoto2 -I/usr/include/lqr-1 -I/usr/include/lensfun -I/usr/include/eigen3    -fno-tree-pre -D_GNU_SOURCE -D_LARGEFILE64_SOURCE -I/usr/include/kde4 -fexceptions -UQT_NO_EXCEPTIONS -I/usr/include/kde4 -o CMakeFiles/digikamcore.dir/__/libs/dimg/loaders/jpegloader.cpp.o -c ../../../core/libs/dimg/loaders/jpegloader.cpp
In file included from ../../../core/libs/dimg/loaders/jpegloader.cpp:33:0:
../../../core/libs/dimg/loaders/iccjpeg.h:56:31: error: expected initializer before 'JPP'
 extern void write_icc_profile JPP((j_compress_ptr cinfo,
                               ^
../../../core/libs/dimg/loaders/iccjpeg.h:76:36: error: expected initializer before 'JPP'
 extern void setup_read_icc_profile JPP((j_decompress_ptr cinfo));
                                    ^
../../../core/libs/dimg/loaders/iccjpeg.h:94:33: error: expected initializer before 'JPP'
 extern boolean read_icc_profile JPP((j_decompress_ptr cinfo,
                                 ^
../../../core/libs/dimg/loaders/jpegloader.cpp: In member function 'virtual bool Digikam::JPEGLoader::load(const QString&, Digikam::DImgLoaderObserver*)':
../../../core/libs/dimg/loaders/jpegloader.cpp:249:38: error: 'setup_read_icc_profile' was not declared in this scope
         setup_read_icc_profile(&cinfo);
                                      ^
../../../core/libs/dimg/loaders/jpegloader.cpp:588:62: error: 'read_icc_profile' was not declared in this scope
         read_icc_profile(&cinfo, &profile_data, &profile_size);
                                                              ^
../../../core/libs/dimg/loaders/jpegloader.cpp: In member function 'virtual bool Digikam::JPEGLoader::save(const QString&, Digikam::DImgLoaderObserver*)':
../../../core/libs/dimg/loaders/jpegloader.cpp:808:90: error: 'write_icc_profile' was not declared in this scope
         write_icc_profile(&cinfo, (JOCTET*)profile_rawdata.data(), profile_rawdata.size());
                                                                                          ^
core/app/CMakeFiles/digikamcore.dir/build.make:323: recipe for target 'core/app/CMakeFiles/digikamcore.dir/__/libs/dimg/loaders/jpegloader.cpp.o' failed
make[2]: *** [core/app/CMakeFiles/digikamcore.dir/__/libs/dimg/loaders/jpegloader.cpp.o] Error 1
make[2]: *** Waiting for unfinished jobs....


Also problems with gwenview compilation https://bugzilla.redhat.com/show_bug.cgi?id=1163476

Reproducible: Always
Comment 1 caulier.gilles 2014-11-14 05:54:48 UTC
Sound jpeg turbo do not respect API compatibilty for client applications.... Why ???

Gilles Caulier
Comment 2 nucleo 2014-11-14 06:04:14 UTC
I don't know why, maybe libjpeg-turbo bug.
Comment 3 Rex Dieter 2014-11-17 06:56:51 UTC
The problem being that libjpeg-turbo recent versions no longer define JPP macro, per the downstream gwenview bug, one possible quick-n-dirty solution is to add to digikam (after libjpeg includes):

#ifndef JPP
#define JPP(x) x
#endif
Comment 4 caulier.gilles 2014-11-17 13:39:37 UTC
Rex,

Why jpeg turbo have removed this define ? It sound like an upstream problem no ?

Gilles Caulier
Comment 5 caulier.gilles 2014-11-17 13:42:17 UTC
As, i can seen, jpeg turbo 1.3.90 is 1.4 beta1 in fact.

This problem which break compatibility with client applications must be reported as upstream to jpeg turbo team.

Gilles Caulier
Comment 6 Rex Dieter 2014-11-17 13:54:51 UTC
I found this upstream ml thread,
http://sourceforge.net/p/libjpeg-turbo/mailman/message/32677570/
Comment 7 Rex Dieter 2014-11-17 14:46:47 UTC
I got gweview to build with a a few extra defines, let's see if I can do the same for digikam.
Comment 8 Rex Dieter 2014-11-17 15:19:25 UTC
Opened downstream report against libjpeg-turbo in the meantime,
https://bugzilla.redhat.com/show_bug.cgi?id=1164815
Comment 9 Rex Dieter 2014-11-17 15:51:58 UTC
Created attachment 89617 [details]
workaround build failures with newer libjpeg-turbo builds

This quick-n-dirty patch is a workaround to libjpeg-turbo not defining some macros anymore.  If this approach is agreeable, I can commit or send to reviewboard for feedback.  Else, I can continue pushing for libjpeg-turbo devs to restore full compatibility with libjpeg-62 headers/api
Comment 10 caulier.gilles 2014-11-17 17:47:20 UTC
This approach is not the best way.

Typically, i would not to touch transupp.h, iccjpeg.h because these files are taken as well from 3rd party lib. updating it in the future require to patch again the files and this is a possible stage to forget to do.

Also, i think your patch forget other part to patch as jpegutils.cpp for ex, where jpeglib headers are included.

I tried to do another way in a cmake macro to check if jpeglib define exist or not with a small compilation process, as it done in this cmake script used to detect jpeglib version :

https://projects.kde.org/projects/extragear/graphics/digikam/repository/revisions/master/entry/cmake/modules/MacroJPEG.cmake

Accordingly with define detection, the idea is to use add_definitions() like this for whole compilation :

add_definitions("-DJPP(x) x")

... but of course this doesn't work...

Gilles

PS : no need to use reviewboard, this will duplicates bugzilla workflow (:=)))
Comment 11 Rex Dieter 2014-11-17 17:52:05 UTC
OK, I'll try  to help work on your approach when I get a chance.
Comment 12 caulier.gilles 2014-11-17 19:35:43 UTC
Created attachment 89620 [details]
patch to MacroJPEG.cmake to check jpeg lib definitions

Rex, 

please check and hack this patch please...

Gilles
Comment 13 caulier.gilles 2014-11-20 18:51:36 UTC
Rex,

Do you take a look to my patch ?

Gilles Caulier
Comment 14 Rex Dieter 2014-11-20 20:10:52 UTC
Looking at it, it's a good start, but:
* apparently the compile checks aren't working right
* getting cmake's add_definition to accept JPP(x)=x is turning out to be tricky :-/
Comment 15 Rex Dieter 2014-11-20 20:11:54 UTC
oh, and will need the defines in more than just digikam/core, kipi-plugins need it too
Comment 16 Rex Dieter 2014-11-20 20:23:41 UTC
https://gcc.gnu.org/onlinedocs/gcc-4.8.3/gcc/Preprocessor-Options.html#Preprocessor-Options

seems to imply that -D'JPP(x)=x' should work, but 
add_definitions(-D'JPP(x)=x') ends up injecting some spaces:   -D'JPP ( x ) =x'
Comment 17 Rex Dieter 2014-11-20 20:45:21 UTC
Boo, and,
http://www.cmake.org/cmake/help/v3.0/prop_sf/COMPILE_DEFINITIONS.html
looks like can't use COMPILE_DEFINITIONS either , "Function-style definitions are not supported"
Comment 18 Rex Dieter 2014-11-26 13:03:16 UTC
Good news, looks like we've convinced libjpeg-turbo upstream to fix the breakage on their end, so hopefully workarounds elsewhere (like here) should no longer be needed.

See comment from upstream dev ,
https://bugzilla.redhat.com/show_bug.cgi?id=1164815#c6
Comment 19 caulier.gilles 2014-11-26 13:21:22 UTC
Great news.

Thanks Rex to report

Gilles
Comment 20 nucleo 2014-11-26 15:05:07 UTC
digikam builds fine with  libjpeg-turbo-1.3.90-3.fc22 without workaround.