Re: [xml] compile libxml2.7.8 under cygwin&Win7 with mingw toolchain



lin hong wrote:
Hi, all

we are making a release of our software with libxml under windows. we end
up compiling it from source code, I thought it might worth writing it down
here.

first thing is, if you don't care about dependency of cygwin libraries
(which means the program require cygwin installed to run), just get libxml
through cygwin setup. For us, it's not fair to ask normal user to install
cygwin, so we try binary first.


I'm more comfortable with MSYS.

we got the binary from http://xmlsoft.org/sources/win32/

but it does not work on cygwin + Win7 , just try to run any exe file under
/bin dir, we got this.

./xsltproc.exe
/usr/i686-pc-mingw32/xslt_xml2/bin/xsltproc.exe: error while loading
shared libraries: ?: cannot open shared object file: No such file or
directory


Where do the .dll live?  In /usr/i686-pc-mingw32/xslt_xml2/bin?  If not,
you'll need to add the path to the dll to PATH or move the dll to this
xslt_xml2/bin directory.

I believe it works for WinXP because I saw the msg on the website:
"The binaries are supported on an operating system based on the NT-kernel,
such as Windows NT, Windows 2000 and Windows XP, exclusively"

also it seems require iconv, which we don't really need.


libxslt requires it.

anyway, we decide to compile it ourselves,  here are the changes I did:


You'll need the patches I just submitted to this list.

0. for windows, makefile and configure are under /win32, run configure
like Readme.txt sugguests:


I believe you'll need to specify the --host switch if you're using Cygwin.

cscript configure.js threads:no static:yes compiler:mingw iconv:no
prefix=where_you_want_to_install   include=where_your_mingw_include_is 
lib=where_your_mingw_lib_is debug=yes

1. We are using mingw , so Makefile.mingw is the one for us. modify
Makefile.mingw:


With MSYS I just use configure to create the Makefile.

1.1 We want the program be independent from cygwin library, add
"-mno-cygwin" to CC
! CC = gcc.exe -mno-cygwin


The -mno-cygwin switch is dead.  Cygwin now uses a cross build concept
instead of a bastardized separation of MinGW gcc and Cygwin gcc.  This
is the reason you'll need to specify the --host if you Cygwin to
configure it.

1.2 Want more output during compiling? add "-v"
! CFLAGS += -v -DWIN32 -D_WINDOWS -D_MBCS -DNOLIBTOOL


I don't know about these defines, I did not have to do that.

1.3 The default gcc linker refuse to look into Mingw directory before
Cygwin directory, I don't know why, so I use flexlink instead, modify LD:

Again you need to add --host to the configure.

LD = flexlink
also add flags flexlink needs:
+ #flexlink flag
+ FL_LDFLAGS = -chain mingw
+ FL_LDFLAGS += -L $(BINDIR) -L $(LIBPREFIX)


I don't have any idea what flexlink is.

1.4 Then call our LD with its flags to make "dll"
# Creates the libxml shared object.
! #XMLSO_LDFLAGS = $(LDFLAGS) -shared -Wl,--dll
-Wl,--out-implib,$(BINDIR)/$(XML_IMP)
  $(BINDIR)/$(XML_SO) : $(BINDIR) $(XML_OBJS)
!  $(LD) $(FL_LDFLAGS) -o $(BINDIR)/$(XML_SO) $(XML_OBJS) $(LIBS)


Configure with --disable-static --enable-shared or vice versa.

1.5 Make ".a" , there is a typo in the original makefile, they mess up the
"/" with "\" -- you will get a "bin.mingwlibxml2.a" instead of
"bin.mingw/libxml2.a" because of this.
 # Creates the libxml archive.
  $(BINDIR)/$(XML_A) : $(BINDIR) $(XML_OBJS_A)
!  $(AR) $(ARFLAGS) $(BINDIR)/$(XML_A) $(XML_OBJS_A)


The Makefile.mingw is probably constructed to be used with mingw32-make
which can handle the \ in paths but lacks in other things.

1.6 Make sure STATIC is set to 1 in config.mingw -- if you did configure
with "static:yes", you are good. Add "-exe" to flexlink so it will create
executable instead of dll file.
! # An implicit rule for xmllint and friends.
! # STATIC=1 is set in config.mingw
! # I also change XML_BASENAME to XML_NAME.(-llibxml2 to -lxml2)
  ifeq ($(STATIC),1)
  $(BINDIR)/%.exe : $(UTILS_SRCDIR)/%.c
   $(CC) -DLIBXML_STATIC $(CFLAGS) -o $(subst .c,.o,$(UTILS_INTDIR)/$(<F))
-c $<
!  # $(LD) $(LDFLAGS) -o $@ $(subst .c,.o,$(UTILS_INTDIR)/$(<F))
-l$(XML_BASENAME) $(LIBS)
!  $(LD) $(FL_LDFLAGS) -exe -o $@ $(subst .c,.o,$(UTILS_INTDIR)/$(<F))
-l$(XML_NAME) $(LIBS)

That's pretty much everything for makefile.

3. so far everything we did so far is under win32, config.h in the upper
dir needs to be changed

in config.h, find these two undef

   /* Determine what socket length (socklen_t) data type is */
   #undef XML_SOCKLEN_T
   /* Define to 1 if you have the <stdint.h> header file. */
   #undef HAVE_STDINT_H

Define them

Without stdint.h you will get error message like "uint32 undefined".

4. set flag C_INCLUDE_PATH.
Set c_include_path flag can fix the "could not find libxml/xxx.h" problem
Head files are under /libxml2-2.7.8/include and
/libxml2-2.7.8/include/libxml/,
to make our gcc look into these directories, we need to point
C_INCLUDE_PATH to them,  just setting C_FLAGS is NOT enough -- that's
really really strange.
although later I found out /libxml2-2.7.8/libxml/ also have a set of all
head files, so maybe pointing C_INCLUDE_PATH to that is also ok.


OK,  take a breath and run

make -f Makefile.mingw

that's it.

Without my patch xmlcatalog will fail to read the entries in the catalog
if you use GCC-4.6.1.

All I needed to do with MinGW + MSYS otherwise was

cd libxml2-2.7.8
mkdir bld
cd bld
../configure --prefix=/mingw --without-python --enable-shared
--disable-static
make
make install

I've also built it with the python bindings but you must ensure that
your environment is set up with PYTHON variables.

-- 
Earnie
-- https://sites.google.com/site/earnieboyd/



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]