Skip to content

Commit

Permalink
MacOSX --with-adobe link issue. Work in progress. Code and documentat…
Browse files Browse the repository at this point in the history
…ion update.
  • Loading branch information
clanmills committed Aug 18, 2017
1 parent 134df40 commit aefa3e3
Show file tree
Hide file tree
Showing 9 changed files with 196 additions and 134 deletions.
4 changes: 2 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@
########################################################################

SHELL = /bin/sh
ENABLE_XMP = 1
ENABLE_XMP = 2016

.PHONY: all doc config samples xmpsdk \
mostlyclean clean distclean maintainer-clean \
Expand Down Expand Up @@ -146,7 +146,6 @@ mostlyclean clean: config/config.mk
cd config && $(MAKE) -f config.make $(MAKECMDGOALS)
cd po && $(MAKE) $(MAKECMDGOALS)
rm -f include/exiv2/exv_conf.h
if [ -e xmpsdk/Adobe ]; then rm -rf xmpsdk/Adobe ; fi


# `make distclean' also removes files created by configuring
Expand All @@ -156,6 +155,7 @@ distclean: clean
rm -f config.log config.status libtool
rm -f *~ *.bak
if [ -e bin ]; then rm -rf bin ; fi
if [ -e xmpsdk/Adobe ]; then rm -rf xmpsdk/Adobe ; fi

# This removes almost everything, including the configure script!
maintainer-clean: distclean
Expand Down
173 changes: 173 additions & 0 deletions WORK-IN-PROGRESS
Original file line number Diff line number Diff line change
@@ -0,0 +1,173 @@


Puzzle with autotools/--with-adobe MacOS-X Only
-----------------------------------------------
Added : 2017-08-17
Modified: 2017-08-18

The --with-adobe code is new (added on Monday/Tuesday 2017-08-15).
It's very much "Work in Progress" and will get lots more polishing.
This builds and links on Mac and Linux (Cygwin isn't ready yet).
Autotools isn't used with Visual Studio

Default build (which compile/links xmpsdk/src) is fine (and passes test suite)
$ sudo make distclean ; make config ; ./configure ; make ; sudo make install ; make samples ; make tests

Status: The 2016/AdobeXMPsdk requires an entry point that's not in the C++ STL library
./configure is building and passing the test suite
./configure --with-adobe=2014 is broken on __ZNSs4_Rep11_S_terminalE
./configure --with-adobe=2016 is broken on __ZNSiD0Ev

The missing entry points are in /usr/lib/libstdc++.6.dylib
When I use install_name_tool to change to libstdc++.6.dylib, I crash in this:

$ c++filt __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_string()
$

There's something mixed up concerning the libraries used by Adobe's XMPSDK and libexiv2.26.dylib
-stdlib=libstdc++ will link /usr/lib/libstdc++.6.dylib, however the compiler warns:
clang: warning: libstdc++ is deprecated; move to libc++ [-Wdeprecated]

To build without the external Adobe SDK:
- - - - - - - - - - - - - - - - - - - -
Edit config/config.mk.in and modify:
XMPSDK_LIBS= -lXMPCore
to
XMPSDK_LIBS = ''

$ sudo make distclean ; make config ; ./configure --with-adobe ; make

The following command works:
$ bin/exiv2 http://clanmills.com/Stonehenge.jpg is working

On 2017-08-15 The following command crashes when it attempts to execute XMPsdk code
$ bin/exiv2 --verbose --version
........
config_path=/Users/rmills/.exiv2
uid=501
euid=501
gid=20
dyld: lazy symbol binding failed: Symbol not found: _WXMPMeta_Initialize_1
Referenced from: /Users/rmills/gnu/github/exiv2/src/.libs/libexiv2.26.dylib
Expected in: flat namespace

dyld: Symbol not found: _WXMPMeta_Initialize_1
Referenced from: /Users/rmills/gnu/github/exiv2/src/.libs/libexiv2.26.dylib
Expected in: flat namespace

Abort trap: 6
$

This is correct. libXMPCore.a is not in the mix.

ls -alt src/.libs/libexiv2.26.dylib
-rwxr-xr-x+ 1 rmills staff 2238124 Aug 17 11:07 src/.libs/libexiv2.26.dylib
-------
To add the external Adobe SDK to the mix:
- - - - - - - - - - - - - - - - - - - - -

Edit src/Makefile#242 and change:
@$(LIBTOOL) --mode=link $(LINK.cc) -o ../bin/$@ $(LIBRARY) $(EXIV2OBJ) $(EXIV2COBJ) -rpath $(libdir)
to:
@$(LIBTOOL) --mode=link $(LINK.cc) -lXMPCore -o ../bin/$@ $(LIBRARY) $(EXIV2OBJ) $(EXIV2COBJ) -rpath $(libdir)

$ touch src/version.cpp src/exiv2.cpp ; make
$ ls -alt src/.libs/libexiv2.26.dylib
-rwxr-xr-x+ 1 rmills staff 4312308 Aug 17 11:17 src/.libs/libexiv2.26.dylib
-------
$ bin/exiv2
dyld: Symbol not found: __ZNSiD0Ev
Referenced from: /Users/rmills/gnu/github/exiv2/src/.libs/libexiv2.26.dylib
Expected in: flat namespace
in /Users/rmills/gnu/github/exiv2/src/.libs/libexiv2.26.dylib
Abort trap: 6
605 rmills@rmillsmbp:~/gnu/github/exiv2 $

$ c++filt _ZNSiD0Ev
std::basic_istream<char, std::char_traits<char> >::~basic_istream()

This code is being accessed by Adobe XMPSDK 2016 libXMPCore.a and isn't in the c++ library.

$ nm -g xmpsdk/Adobe/libXMPCore.a | grep _ZNSiD0Ev
U __ZNSiD0Ev
$

Adobe XMPSDK 2014 has a similar problem with __ZNSs4_Rep11_S_terminalE

$ nm -g Adobe/XMP-Toolkit-SDK-CC201412/libXMPCore.a | grep __ZNSs4_Rep11_S_terminalE | sort --unique
U __ZNSs4_Rep11_S_terminalE
$ c++filt __ZNSs4_Rep11_S_terminalE
std::string::_Rep::_S_terminal


Notes (mostly to remind me of painful discoveries)
--------------------------------------------------

How does the build get generated?
$ make config
This generates ./configure by reading config/configure.ac

When you use --with-adobe, CXXFLAGS and LDFLAGS are modified and ENABLE_XMP is set to 2016.
Makefile has code to execute the script xmpsdk/buildXMPsdk.sh which
downloads and builds the XMPsdk to create libCore.a (which we need) and libFiles.a

config/config.mk.in is converted into config/config.mk and included in xmpsdk/src/Makefile
This is really ugly. config.mk also messes with CPPFLAGS and LDFLAGS

To get -lXMPCore into the mix, set XMPSDK_LIBS in config/config.mk.in
XMPSDK_LIBS = -lXMPCore

508 rmills@rmillsmbp:~/gnu/github/exiv2 $ finder Makefile | xargs grep -H config.mk | grep include
./contrib/organize/Makefile:include $(top_srcdir)/config/config.mk
./doc/Makefile:include $(top_srcdir)/config/config.mk
./samples/Makefile:include $(top_srcdir)/config/config.mk
./src/Makefile:include $(top_srcdir)/config/config.mk
./xmpsdk/src/Makefile:include $(top_srcdir)/config/config.mk
509 rmills@rmillsmbp:~/gnu/github/exiv2 $


Compiler options used to build Adobe XMPsdk
-------------------------------------------

For sure, Adobe's code is being built with MacOSX10.8.sdk and -std=c++11

/usr/bin/c++
-DBUILDING_XMPCORE_AS_STATIC=1
-DBUILDING_XMPCORE_LIB=1
-DENABLE_CPP_DOM_MODEL=1
-DHAVE_EXPAT_CONFIG_H=1
-DMAC_ENV=1
-DXML_STATIC=1
-DXMP_64=1
-DXMP_COMPONENT_INT_NAMESPACE=AdobeXMPCore_Int
-DXMP_StaticBuild=1
-I/Users/rmills/gnu/github/exiv2/xmpsdk/Adobe/XMP-Toolkit-SDK-CC201607/XMPCore/build/../..
-I/Users/rmills/gnu/github/exiv2/xmpsdk/Adobe/XMP-Toolkit-SDK-CC201607/XMPCore/build/../../public/include
-I/Users/rmills/gnu/github/exiv2/xmpsdk/Adobe/XMP-Toolkit-SDK-CC201607/XMPCore/build/../../third-party/expat/public/lib
-I/Users/rmills/gnu/github/exiv2/xmpsdk/Adobe/XMP-Toolkit-SDK-CC201607/XMPCore/build/../resource/mac
-funsigned-char
-fshort-enums
-fno-common
-Wall
-Wextra
-Wno-missing-field-initializers
-Wno-shadow
-Wno-reorder
-std=c++11
-Wnon-virtual-dtor
-Woverloaded-virtual
-Wno-unused-variable
-Wno-unused-function
-Wno-unused-parameter
-fstack-protector
-O3
-DNDEBUG=1
-D_NDEBUG=1
-arch x86_64
-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk
-mmacosx-version-min=10.7
-o CMakeFiles/XMPCoreStatic.dir/Users/rmills/gnu/github/exiv2/xmpsdk/Adobe/XMP-Toolkit-SDK-CC201607/XMPCore/source/XMPMeta-GetSet.cpp.o
-c /Users/rmills/gnu/github/exiv2/xmpsdk/Adobe/XMP-Toolkit-SDK-CC201607/XMPCore/source/XMPMeta-GetSet.cpp


116 changes: 0 additions & 116 deletions WORK_IN_PROGRESS

This file was deleted.

2 changes: 1 addition & 1 deletion config/Makefile.in
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,6 @@ mostlyclean clean: config/config.mk
cd config && $(MAKE) -f config.make $(MAKECMDGOALS)
cd po && $(MAKE) $(MAKECMDGOALS)
rm -f include/exiv2/exv_conf.h
if [ -e xmpsdk/Adobe ]; then rm -rf xmpsdk/Adobe ; fi


# `make distclean' also removes files created by configuring
Expand All @@ -156,6 +155,7 @@ distclean: clean
rm -f config.log config.status libtool
rm -f *~ *.bak
if [ -e bin ]; then rm -rf bin ; fi
if [ -e xmpsdk/Adobe ]; then rm -rf xmpsdk/Adobe ; fi

# This removes almost everything, including the configure script!
maintainer-clean: distclean
Expand Down
4 changes: 2 additions & 2 deletions config/config.mk.in
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ ifeq ($(ENABLE_XMP),2016)
XMPSDK_CPPFLAGS = -I$(XMPSDK_DIR)/Adobe/XMP-Toolkit-SDK-CC201607 \
-I$(XMPSDK_DIR)/Adobe/XMP-Toolkit-SDK-CC201607/public/include \
-DEXV_ADOBE_XMPSDK=2016
XMPSDK_LDFLAGS = -L$(XMPSDK_DIR)/Adobe/
XMPSDK_LDFLAGS = -L$(XMPSDK_DIR)/Adobe/XMP-Toolkit-SDK-CC201607
XMPSDK_LIBS = -lXMPCore
CPPFLAGS_MORE = X
endif
Expand All @@ -118,7 +118,7 @@ ifeq ($(ENABLE_XMP),2014)
XMPSDK_CPPFLAGS = -I$(XMPSDK_DIR)/Adobe/XMP-Toolkit-SDK-CC201412 \
-I$(XMPSDK_DIR)/Adobe/XMP-Toolkit-SDK-CC201412/public/include \
-DEXV_ADOBE_XMPSDK=2014
XMPSDK_LDFLAGS = -L$(XMPSDK_DIR)/Adobe/
XMPSDK_LDFLAGS = -L$(XMPSDK_DIR)/Adobe/XMP-Toolkit-SDK-CC201412
XMPSDK_LIBS = -lXMPCore
CPPFLAGS_MORE = X
endif
Expand Down
12 changes: 5 additions & 7 deletions config/configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -394,12 +394,11 @@ if test "$ADOBE" == "yes"; then ADOBE=2016; fi

if test "$ADOBE" = "2016" -o "$ADOBE" = "2014" ; then
ADOBE_SDK=XMP-Toolkit-SDK-CC201607
if test "$ADOBE" == "2014" ; then ADOBE_SDK=XMP-Toolkit-SDK-CC2014.12; fi
if test "$ADOBE" == "2014" ; then ADOBE_SDK=XMP-Toolkit-SDK-CC201412; fi
ENABLE_XMP=$ADOBE
XMPSDK_CPPFLAGS='-Ixmpsdk/Adobe/$ADOBE_SDK/public/include'
XMPSDK_LDFLAGS='-Lxmpsdk/Adobe/'
XMPSDK_LIBS=''
# '-lXMPCore.a -lXMPFiles.a'
XMPSDK_CPPFLAGS="-Ixmpsdk/Adobe/$ADOBE_SDK/public/include"
XMPSDK_LDFLAGS="-Lxmpsdk/Adobe/$ADOBE_SDK"
# XMPSDK_LIBS='-lXMPCore'
fi

# ---------------------------------------------------------------------------
Expand Down Expand Up @@ -457,7 +456,7 @@ yes) echo "-- Nikon lens database............ YES" ;;
esac

case "$USE_XMP_TOOLKIT" in
yes) echo "-- XMP metadata support........... YES (ADOBE_SDK = $ADOBE)" ;;
yes) echo "-- XMP metadata support........... YES" ;;
*) echo "-- XMP metadata support........... NO"
echo ""
echo "Expat is required for XMP support. Make sure the Expat header"
Expand Down Expand Up @@ -505,7 +504,6 @@ fi
echo "CPPFLAGS =" "$CPPFLAGS $SSH_CPPFLAGS $CURL_CPPFLAGS $XMPSDK_CPPFLAGS"
echo "LDFLAGS =" "$LDFLAGS $SSH_LDFLAGS $CURL_LDFLAGS $EXPAT_LDFLAGS $XMPSDK_LDFLAGS"
echo "LIBS =" "$LIBS $SSH_LIBS $CURL_LIBS $EXPAT_LIBS $XMPSDK_LIBS"
echo "ENABLE_XMP =" "$ENABLE_XMP"
echo "CXX =" "$CXX"
echo "------------------------------------------------------------------"
echo ""
Expand Down
Loading

0 comments on commit aefa3e3

Please sign in to comment.