.. Athena document is copyright 2016 Bruce Ravel and released under The Creative Commons Attribution-ShareAlike License http://creativecommons.org/licenses/by-sa/3.0/ Building Demeter and Ifeffit on Windows with MinGW and Strawberry Perl ====================================================================== This is my page of notes on how I built :demeter:`ifeffit` and :demeter:`demeter` to work with `Strawberry Perl `_ and how I managed to build the :demeter:`demeter` with Strawberry Perl installer package. These are mostly notes to myself, so this may not be completely coherent |nd| `raise an issue `_ is anything is unclear. First steps ----------- #. Install the latest version of :program:`Strawberry Perl` from http://strawberryperl.com/. The rest of this page presumes that you have installed perl into :file:`C:\\Strawberry`. At the time of the most recent update of this document, the current version of Strawberry perl is 5.24.0.1. #. You may want to install the GutHub Desktop application from https://desktop.github.com/ #. Clone a copy of :demeter:`demeter` from https://github.com/bruceravel/demeter #. :command:`cd` into the installation folder for :demeter:`demeter` and do :command:`perl Build.pl`. If you just installed (or updated) :program:`Strawberry Perl` on your computer, you will be missing the mountain of dependencies that :demeter:`demeter` uses, so ... #. At the command line, do :command:`perl Build installdeps` and wait. This will take quite a while |nd| even hours on a slow computer. Happily, once all the dependencies are installed, they are installed. When you upgrade :demeter:`demeter`, this step will only be required to update any new dependencies. The first time through, it took over 2 hours to compile up all the dependencies on my fairly old Windows machine. Three packages failed to install: ``Wx``, ``Win32::Unicode::File``, and ``File::Monitor::Lite``. ``Wx`` This failed because one of the tests hung for some reason. Clicking the red X button allowed the tests to continue, but caused one to fail. It was safe to do :command:`cpanm -f -n Wx` to force the installation despite the test failure. Of course, I had to pay attention and dismiss the window from the hung test.... ``Win32::Unicode::File`` This failed a test having to do with printing `a Unicode character `_ to standard output. I suspect this has something to do with the terminal I was using on my Windows machine. In any case, it is benign in the context of how this module is used in Demeter. Doing :command:`cpanm -f -n Win32::Unicode::File` is safe. ``File::Monitor::Lite`` Here, the failures have to do with a test failing to deal correctly with slashes and backslashes. Again doing :command:`cpanm -f -n File::Monitor::Lite` is safe. .. ``Syntax::Highlight::Perl`` I'm not sure what caused this to fail, but it seems benign. Doing :command:`cpanm -f Syntax::Highlight::Perl` worked without any failures in the testing phase. The earlier failure seems to have something to do with a problem unpacking the package downloaded by :program:`cpanm`. Any other problems |nd| just do :command:`cpan -f ` and see what happens. The worst case scenario is that you have to `submit a bug report `_, thus making :demeter:`demeter` better. Horrors! Using Gnuplot ------------- Grab the latest version of gnuplot from http://gnuplot.info/. You will be directed to SourceForge. Use the latest installer and have the installer put all the files in :file:`C:\Strawberry\c\bin\gnuplot`. When prompted for the default terminal type, you can select any, but my preferred choice is wxt. Preparing to compile Ifeffit ---------------------------- `Here is a useful page `_ on using :program:`pgplot` and :program:`MinGW`. First, need to establish a build environment from which Strawberry+Demeter can be bootstrapped. #. Would like to have installed PDCurses and Readline from `GnuWin32 `_ into :file:`C:\\GnuWin32` (or somewhere), but I could not get these to work with my 64-bit build. See below. #. It is no longer necessary to fetch a copy of gfortran from MinGW. Strawberry now comes with it. #. Installed the pre-built :program:`pgplot` and :program:`GrWin` libraries available at http://spdg1.sci.shizuoka.ac.jp/grwinlib/english/ into :file:`C:\\MinGW\\lib\\pgplot` (or grab them from an old Demeter installer). #. Set the ``PGPLOT_DIR`` variable to ``/c/mingw/lib/pgplot``, which is the location to which :program:`pgplot` was installed in step 3. #. In principle, ``PGPLOT_DEV`` should be set to ``/GW``, but that does not seem to get picked up by :demeter:`ifeffit`. I have to do :command:`$plot_device=/gw` before plotting. Compiling Ifeffit to be placed in C:/strawberry ----------------------------------------------- #. Replace :file:`iconf_pgplot`, :file:`iconf_term`, and :file:`iconf_iff` with the versions from :file:`win/` in the :demeter:`demeter` distribution #. Modify line 85 of the main :file:`Makefile.in` to read :: SUBDIRS = src (i.e. remove ``readline`` so it does not get compiled.) #. Modify line 90 in :file:`src/cmdline/Makefile.in` to read :: readline_LIB = $(TERMCAP_LIB) #. Do :: ./configure --prefix='/c/strawberry/c/lib' (Note: this should be done in the MinGW window and **not** in the Windows command prompt.) #. Edit :file:`src/lib/sys.h`, changing the ``sysdir`` and ``pgdev`` lines like so: .. code-block:: fortran c{sys.h -*-fortran-*- c system and build specific stuff goes here c to be included in iff_config.f sysdir = 'C:\strawberry\c\share\ifeffit' pgdev = '/gw' inifile= 'startup.iff .ifeffit' build = '1.2.11d'// $ ' Copyright (c) 2008 Matt Newville, Univ of Chicago' c} #. Now :command:`make` and :command:`make install` . You may instead need to do :command:`make -k` and :command:`make -k install` if you run into trouble building the command line :program:`ifeffit`. curses and readline ------------------- The readline library compiled for 64 bit Windows and usable with the mingw toolchain is `available here `_. Open the 7zip file and copy the various files in the :file:`bin`, :file:`include`, :file:`lib`, and :file:`share` folders into :file:`C:\\Strawberry\\c` (or wherever your :demeter:`demeter` root is located). I could not find a pre-compiled curses library, nor could I figure out how to compile `PDCurses `_ on my Windows/mingw machine. As a result, I was unable to compile the command line version of :program:`ifeffit`, although the library compiled up just fine. Thus the installer package does not currently have a copy of the command line :program:`ifeffit`. Without a curses library, you will certainly need to do :command:`make -k` and :command:`make -k install` to skip over the problem building the command line :program:`ifeffit`. Compiling the SWIG wrapper -------------------------- I found that the wrapper generated by :program:`SWIG` 1.3.1 works well but that the wrappers from 1.3.4 or 2.0.2 do not. I have not investigated the cause yet and have the 1.3.1 wrapper committed to the git repository. Here is the `file defining the compilation and linking rules `_ for the :demeter:`ifeffit` SWIG wrapper. - the linking order **is** important. - the locations of :program:`MinGW`, :program:`GnuWin`, and :program:`strawberry` are currently hardwired In any case, it should compile up just fine when you do the ``perl Build`` step. If you have build :demeter:`demeter` for an earlier version of perl, you should do ``perl Build touch_wrapper`` to make sure the SWIG wrapper is rebuilt. If rebuilding after updating Strawberry, don't forget to do :command:`perl ./Build touch_wrapper`, which forces a rebuild of the wrapper. .. note:: The block around lines 36-42 in :file:`DemeterBuilder.pm` attempts to set the root of the :demeter:`demeter` installation correctly. (It is :file:`C:\\Strawberry\\c` on my build machine.) Make sure it resolves to the correct location on your machine. Building documentation ---------------------- The documentation requires `Sphinx `_, which I did not bother to install on my computer. I just built the document on a linux machine and zipped it up in a directory structure that looks like this: .. blockdiag:: blockdiag { node_width = 200; default_fontsize = 14; documentation -> Artemis, Athena, DPG, SinglePage; } where each of :file:`Artemis`, :file:`Athena`, :file:`DPG`, and :file:`SinglePage` contains the contents of their respective :file:`_build/html` folders. This tree is then dropped in place in :file:`C:\\Strawberry\\perl\\site\\lib\\Demeter\\share`. With Sphinx, I imagine it would build and install normally. Building with also requires these packages: pybtex, sphinxcontrib-bibtex, and sphinxcontrib-blockdiag, which can be installed with pip.