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/ _______________________________________________ xml mailing list, project page http://xmlsoft.org/ xml@gnome.org http://mail.gnome.org/mailman/listinfo/xml