Discussion:
[Wt-interest] Success building Wt 3.3.3 with mingw-w64 gcc 4.9.2
K. Frank
2014-12-07 17:19:22 UTC
Permalink
Hello List!

I have been successful building Wt 3.3.3 with mingw-w64
gcc 4.9.2. At this point I have successfully built and
run the "hello" example.

(This is something of a follow-up to an earlier posting
of mine where I asked whether Wt was likely to build
smoothly with mingw-w64.)

I built and ran Wt natively on 64-bit windows 7. The
build went reasonably smoothly, but I did hit some issues
along the way, so I will take this opportunity to record
the process and what I had to do to work though things.

I worked on this on and off for the past couple of weeks,
so these notes are relevant to the time period of the last
two weeks of November 2014. I generally worked with the
latest stable versions of the various components. In general
I followed the "standard" instructions for building the
various pieces, although these instructions were not always
complete nor in a centralized location.

Download latest mingw-w64. I used the mingw-builds version.
The mingw-builds installer didn't work for some reason, so
I downloaded the ".7z" archive. I downloaded:

x86_64-4.9.2-release-posix-seh-rt_v3-rev0.7z

from:

http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/4.9.2/threads-posix/seh/

unzipped it and set up my path (and CPLUS_INCLUDE_PATH and
LIBRARY_PATH) to point to the 4.9.2 installation.

Download and build boost.

(Note: I hope that Wt gets A LOT of USEFUL functionality
from boost because boost is, at best, and UNWIELDY piece
of dependency BLOAT. I spent more time monkeying around
with boost than I did with Wt.)

First boost-build:
boost-build-2014-10.zip
from:
http://www.boost.org/doc/libs/1_57_0/tools/build/index.html

In boost-build (the root directory of the unzipped
boost-build-2014-10.zip archive) I ran bootstrap.bat:

...\boost-build>bootstrap mingw

Note, I first tried to run bootstrap.bat without gcc in
my path, and I got an unhelpful error:

****** B A T C H R E C U R S I O N exceeds STACK limits ******

but adding gcc to my path and re-running resolved the problem.

Then I built boost-build:

.\b2 --prefix=..\build_dir install

Now I "configure" b2 to use mingw / gcc by adding:
using gcc ;
to:
...\build_dir\share\boost-build\src\kernel\user-config.jam

Next boost itself:
boost_1_57_0.zip
from:
http://sourceforge.net/projects/boost/files/boost/1.57.0/

In boost_1_57_0 (the root directory of the unzipped
boost_1_57_0.zip archive) I ran:

...\b2.exe --build-dir=..\build_boost toolset=gcc --build-type=complete stage

There were a number of warnings and some "errors," but
most stuff built:
...failed updating 24 targets...
...skipped 56 targets...
...updated 5409 targets...

At least some of the failures are presumably due to missing
optional dependencies. I don't know if any of the "errors"
or "failed" targets represent real or serious errors or not.
(I didn't investigate.) Anyway, this build of boost, even
with the errors, was good enough to build Wt and the hello
example. The build took about four hours.

Download and build Wt.

Download cmake:
cmake-3.0.2-win32-x86.zip
from:
http://www.cmake.org/download/

Download Wt:
wt-3.3.3.tar.gz
from:
http://sourceforge.net/projects/witty/files/wt/3.3.3/

The build / install procedure for Wt was to run cmake, then
make, then make install.

For the cmake phase I had to tell cmake where boost was.
This was not clearly documented, but I needed to set
BOOST_INCLUDEDIR:
set BOOST_INCLUDEDIR=...\boost_1_57_0
(I had also tried setting BOOST_ROOT AND BOOST_PREFIX.
That didn't work, but it's possible that those are needed
in addition to BOOST_INCLUDEDIR.)

I created a build directory, wt-3.3.3_build, parallel to the
root directory of the unzipped Wt archive, wt-3.3.3.tar.gz

In wt-3.3.3_build, I ran the cmake command:
cmake ..\wt-3.3.3 -G "MinGW Makefiles"

That ran the cmake process and produced the Makefile (in
wt-3.3.3_build).

To build Wt itself I had to make some minor patches:

I added:
#include <boost/weak_ptr.hpp>
to:
...\boost_1_57_0\boost\signals2\trackable.hpp

This was to patch what appears to be a known bug in
boost 1.57.0:
https://svn.boost.org/trac/boost/ticket/10100

Then there were some issues with the spirit parser. It
appears that boost reorganized some headers as of 1.56
and this was addressed in Wt after 3.3.3:
http://redmine.webtoolkit.eu/issues/3561

I wanted to stick with a released version of Wt, so I
did not upgrade to 3.3.4 RC1 (nor download from git).
But I used 3.3.4 RC1 (wt-3.3.4-rc1.tar.gz) for guidance
for the patches:

In ...\wt-3.3.3\src\Wt\Json\Parser.C replace:
#include <boost/spirit/home/phoenix/statement/throw.hpp>
with:
#if BOOST_VERSION < 105600
#include <boost/spirit/home/phoenix/statement/throw.hpp>
#else
#include <boost/phoenix.hpp>
#endif

Replace ...\wt-3.3.3\src\Wt\Render\CssParser.C with the version
from Wt 3.3.4 RC1. (The new version has two changes wrapped with
"#if BOOST_VERSION < 105600".)

Replace ...\wt-3.3.3\src\Wt\Dbo\SqlQueryParse.C with the version
from Wt 3.3.4 RC1. (The new version has the same
"#include <boost/phoenix.hpp>" change that was hand-patched into
Parser.C.)

With these patches in place I ran:
mingw32-make
from:
wt-3.3.3_build
(the directory in which cmake created the Makefile).

This almost worked. The build failed compiling CssParser.C, but
there were hints it might have been an out-of-memory problem. I
killed off some unnecessary applications, and re-ran mingw32-make.
The build picked up where it left off, compiling CssParser.C, and
completing successfully.

Note, it looked like it took about 2 GB of RAM to compile CssParser.C.
(It appears that CssParser.C uses the boost spirit parser-generator
to build its parser, so probably boost's template metaprogramming
used a lot of memory during compilation.)

I then ran:
mingw32-make install

This created the directory:
C:/Program Files (x86)/WT
and copied relevant files to it.

(Note, I had to run "ming32-make install" as administrator, i.e., by
running the command in an "Administrator: Command Prompt" in
order for the above directory to be creatable / accessible.)

I then moved "C:\Program Files (x86)\WT" (and its contents) to a
desired location because I didn't want it in "C:\Program Files (x86)".
Unfortunately, I couldn't find any documented way of telling the
build process to install Wt where I wanted it.

The install process also created the directory C:/witty and the
single file it contained, C:/witty/wt_config.xml. Again, I
couldn't find any way to change this hard-wired location. I left
this location alone because it appears that Wt programs depend
upon it.

The install process did report some errors:
Process failed because: The system cannot find the file specified
for command: mkdir -p c:/witty
Process failed because: The system cannot find the file specified
for command: chown apache:apache c:/witty

It looks like some unix-isms have crept into the build script,
but it looks like these errors did not actually cause the install
process any problems.

Lastly, I built the hello.C example. I copied just that one source
file out of the Wt installation into its own test directory.

I added the Wt include files to CPLUS_INCLUDE_PATH:
...\WT\include
and the Wt libraries to LIBRARY_PATH:
...\WT\lib

(These path variables also contain the boost include files and
libraries.)

I then built hello.C with "g++ -std=gnu++14 -o hello hello.C"
and by observing which symbols were missing at link time, I
figured out which libraries to add. The complete build command
is:

g++ -std=gnu++14 -o hello hello.C -lwt -lwthttp
-lboost_date_time-mgw49-1_57 -lboost_filesystem-mgw49-1_57
-lboost_program_options-mgw49-1_57 -lboost_random-mgw49-1_57
-lboost_regex-mgw49-1_57 -lboost_system-mgw49-1_57
-lboost_thread-mgw49-mt-s-1_57 -lws2_32 -lwsock32

This command successfully compiles and links hello.C --> hello.exe.

Hooray! My first 100 MB executable!
12/03/2014 08:20 PM 110,604,961 hello.exe

Running:

hello --http-address=0.0.0.0 --http-port=80 --deploy-path=/hello --docroot=.

launches the hello-web-app server, and it is accessible from the url:

http://localhost/hello

Note, for hello.exe to run I need the boost libraries (as well as the
mingw-w64 libraries) in my path, but I do not need the Wt libraries in
my path. So it looks like my build is linking statically to Wt, but
dynamically to boost.


Thanks to the Wt team for developing the Wt framework and making
it available.


K. Frank
Nagaev Boris
2014-12-07 18:20:42 UTC
Permalink
Hello,

I cross-compile Wt 3.3.1, Windows binaries on Debian Wheezy (Linux):

# install requirements: http://mxe.cc/#requirements-debian

$ git clone https://github.com/mxe/mxe.git
$ cd mxe
$ make wt


Best regards,
Boris Nagaev
Post by K. Frank
Hello List!
I have been successful building Wt 3.3.3 with mingw-w64
gcc 4.9.2. At this point I have successfully built and
run the "hello" example.
(This is something of a follow-up to an earlier posting
of mine where I asked whether Wt was likely to build
smoothly with mingw-w64.)
I built and ran Wt natively on 64-bit windows 7. The
build went reasonably smoothly, but I did hit some issues
along the way, so I will take this opportunity to record
the process and what I had to do to work though things.
I worked on this on and off for the past couple of weeks,
so these notes are relevant to the time period of the last
two weeks of November 2014. I generally worked with the
latest stable versions of the various components. In general
I followed the "standard" instructions for building the
various pieces, although these instructions were not always
complete nor in a centralized location.
Download latest mingw-w64. I used the mingw-builds version.
The mingw-builds installer didn't work for some reason, so
x86_64-4.9.2-release-posix-seh-rt_v3-rev0.7z
http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/4.9.2/threads-posix/seh/
unzipped it and set up my path (and CPLUS_INCLUDE_PATH and
LIBRARY_PATH) to point to the 4.9.2 installation.
Download and build boost.
(Note: I hope that Wt gets A LOT of USEFUL functionality
from boost because boost is, at best, and UNWIELDY piece
of dependency BLOAT. I spent more time monkeying around
with boost than I did with Wt.)
boost-build-2014-10.zip
http://www.boost.org/doc/libs/1_57_0/tools/build/index.html
In boost-build (the root directory of the unzipped
...\boost-build>bootstrap mingw
Note, I first tried to run bootstrap.bat without gcc in
****** B A T C H R E C U R S I O N exceeds STACK limits ******
but adding gcc to my path and re-running resolved the problem.
.\b2 --prefix=..\build_dir install
using gcc ;
...\build_dir\share\boost-build\src\kernel\user-config.jam
boost_1_57_0.zip
http://sourceforge.net/projects/boost/files/boost/1.57.0/
In boost_1_57_0 (the root directory of the unzipped
...\b2.exe --build-dir=..\build_boost toolset=gcc --build-type=complete stage
There were a number of warnings and some "errors," but
...failed updating 24 targets...
...skipped 56 targets...
...updated 5409 targets...
At least some of the failures are presumably due to missing
optional dependencies. I don't know if any of the "errors"
or "failed" targets represent real or serious errors or not.
(I didn't investigate.) Anyway, this build of boost, even
with the errors, was good enough to build Wt and the hello
example. The build took about four hours.
Download and build Wt.
cmake-3.0.2-win32-x86.zip
http://www.cmake.org/download/
wt-3.3.3.tar.gz
http://sourceforge.net/projects/witty/files/wt/3.3.3/
The build / install procedure for Wt was to run cmake, then
make, then make install.
For the cmake phase I had to tell cmake where boost was.
This was not clearly documented, but I needed to set
set BOOST_INCLUDEDIR=...\boost_1_57_0
(I had also tried setting BOOST_ROOT AND BOOST_PREFIX.
That didn't work, but it's possible that those are needed
in addition to BOOST_INCLUDEDIR.)
I created a build directory, wt-3.3.3_build, parallel to the
root directory of the unzipped Wt archive, wt-3.3.3.tar.gz
cmake ..\wt-3.3.3 -G "MinGW Makefiles"
That ran the cmake process and produced the Makefile (in
wt-3.3.3_build).
#include <boost/weak_ptr.hpp>
...\boost_1_57_0\boost\signals2\trackable.hpp
This was to patch what appears to be a known bug in
https://svn.boost.org/trac/boost/ticket/10100
Then there were some issues with the spirit parser. It
appears that boost reorganized some headers as of 1.56
http://redmine.webtoolkit.eu/issues/3561
I wanted to stick with a released version of Wt, so I
did not upgrade to 3.3.4 RC1 (nor download from git).
But I used 3.3.4 RC1 (wt-3.3.4-rc1.tar.gz) for guidance
#include <boost/spirit/home/phoenix/statement/throw.hpp>
#if BOOST_VERSION < 105600
#include <boost/spirit/home/phoenix/statement/throw.hpp>
#else
#include <boost/phoenix.hpp>
#endif
Replace ...\wt-3.3.3\src\Wt\Render\CssParser.C with the version
from Wt 3.3.4 RC1. (The new version has two changes wrapped with
"#if BOOST_VERSION < 105600".)
Replace ...\wt-3.3.3\src\Wt\Dbo\SqlQueryParse.C with the version
from Wt 3.3.4 RC1. (The new version has the same
"#include <boost/phoenix.hpp>" change that was hand-patched into
Parser.C.)
mingw32-make
wt-3.3.3_build
(the directory in which cmake created the Makefile).
This almost worked. The build failed compiling CssParser.C, but
there were hints it might have been an out-of-memory problem. I
killed off some unnecessary applications, and re-ran mingw32-make.
The build picked up where it left off, compiling CssParser.C, and
completing successfully.
Note, it looked like it took about 2 GB of RAM to compile CssParser.C.
(It appears that CssParser.C uses the boost spirit parser-generator
to build its parser, so probably boost's template metaprogramming
used a lot of memory during compilation.)
mingw32-make install
C:/Program Files (x86)/WT
and copied relevant files to it.
(Note, I had to run "ming32-make install" as administrator, i.e., by
running the command in an "Administrator: Command Prompt" in
order for the above directory to be creatable / accessible.)
I then moved "C:\Program Files (x86)\WT" (and its contents) to a
desired location because I didn't want it in "C:\Program Files (x86)".
Unfortunately, I couldn't find any documented way of telling the
build process to install Wt where I wanted it.
The install process also created the directory C:/witty and the
single file it contained, C:/witty/wt_config.xml. Again, I
couldn't find any way to change this hard-wired location. I left
this location alone because it appears that Wt programs depend
upon it.
Process failed because: The system cannot find the file specified
for command: mkdir -p c:/witty
Process failed because: The system cannot find the file specified
for command: chown apache:apache c:/witty
It looks like some unix-isms have crept into the build script,
but it looks like these errors did not actually cause the install
process any problems.
Lastly, I built the hello.C example. I copied just that one source
file out of the Wt installation into its own test directory.
...\WT\include
...\WT\lib
(These path variables also contain the boost include files and
libraries.)
I then built hello.C with "g++ -std=gnu++14 -o hello hello.C"
and by observing which symbols were missing at link time, I
figured out which libraries to add. The complete build command
g++ -std=gnu++14 -o hello hello.C -lwt -lwthttp
-lboost_date_time-mgw49-1_57 -lboost_filesystem-mgw49-1_57
-lboost_program_options-mgw49-1_57 -lboost_random-mgw49-1_57
-lboost_regex-mgw49-1_57 -lboost_system-mgw49-1_57
-lboost_thread-mgw49-mt-s-1_57 -lws2_32 -lwsock32
This command successfully compiles and links hello.C --> hello.exe.
Hooray! My first 100 MB executable!
12/03/2014 08:20 PM 110,604,961 hello.exe
hello --http-address=0.0.0.0 --http-port=80 --deploy-path=/hello --docroot=.
http://localhost/hello
Note, for hello.exe to run I need the boost libraries (as well as the
mingw-w64 libraries) in my path, but I do not need the Wt libraries in
my path. So it looks like my build is linking statically to Wt, but
dynamically to boost.
Thanks to the Wt team for developing the Wt framework and making
it available.
K. Frank
------------------------------------------------------------------------------
Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server
from Actuate! Instantly Supercharge Your Business Reports and Dashboards
with Interactivity, Sharing, Native Excel Exports, App Integration & more
Get technology previously reserved for billion-dollar corporations, FREE
http://pubads.g.doubleclick.net/gampad/clk?id=164703151&iu=/4140/ostg.clktrk
_______________________________________________
witty-interest mailing list
https://lists.sourceforge.net/lists/listinfo/witty-interest
Loading...