GNU Web HowTo

This is step-by-step guideline, how to enable GNU Build System for Web/PHP applications. You can replay all examples on demo.tgz package is distributed with GNU Web. You should find a copy in prefix/share/gnuweb/demo.tgz, where prefix is the installation prefix during configuration either /usr/local or /usr.

1. Create a new project

We would create an empty project and underlying folder structure.

   mkdir web-php-demo
   mkdir web-php-demo/src
   mkdir web-php-demo/tsrc
   mkdir web-php-demo/js
   mkdir web-php-demo/css

We are recommending to maintain the following high-level folder structure for your projects

src
your source code
tsrc
unit test, demos, etc.
js
javascripts
css
stylesheets

2. General settings

You have to create a additional files into root folder of your project (web-php-demo)

  • configure.ac, use the template below for simple PHP-based web application
   AC_INIT([web-php-demo], [0.0], [xxx])
   AM_INIT_AUTOMAKE
   #
   # check for programs, configure runtime, PHP and W3C
   ACX_PREFIX
   ACX_PHP
   ACX_W3C
   #
   # defines Makefile rules
   AMX_PHP
   AMX_W3C
   AMX_TARBALL
   #
   # check for libraries
   ACX_CHECK_PHP_LIB([libxyz.php], [], [AC_MSG_NOTICE('Install libxyz.php')])
   ACX_CHECK_JS_LIB([libxyz.js],   [], [AC_MSG_NOTICE('Install libxyz.js')])
   #
   # optional features 
   ACX_FEATURE([fea])
   #
   # output configuration
   AM_CONFIG_HEADER(config.h)
   AC_OUTPUT(         \
        Makefile      \
        js/Makefile   \
        css/Makefile  \
        src/Makefile  \
        tsrc/Makefile \
   )
   ACX_DONE
  • root Makefile.am
   SUBDIRS = data doc src tsrc
   #includes additional rules from aminclude.am
   @INC_AMINCLUDE@
  • Files NEWS, README, AUTHORS, Changelog to distribute all additional information on your package. They are required by autotools.

3. Makefile.am for PHP scripts

You have to create Makefile.am into web-php-demo/src

   # 
   # This example application: consist of library and UI template
   # 
   
   # library source files
   SRC  = lib-php-demo/demo1.php
   SRC += lib-php-demo/demo2.php
   # source files that implements optional feature
   if HAVE_FEA
   SRC += lib-php-demo/fea.php
   endif
   
   # target library and its component installed into ${libphpdir}
   libphp_SCRIPTS = libphpdemo.php
   nobase_libphp_SCRIPTS = $(SRC)
   
   #bin script is a template in this example
   bin_SCRIPTS = $(PACKAGE).php
   #index.php  executes application from httpd context
   www_SCRIPTS = index.php
   
   CLEANFILES = libphpdemo.php index.php
   EXTRA_DIST = $(SRC)
   
   #includes additional rules from aminclude.am
   @INC_AMINCLUDE@
  • libphp_SCRIPTS is automake constructions, "Variables that end with _SCRIPTS are special variables that list of non-native scripts that the resulting Makefile should build." The libphp part tells that the resulting programs should be installed in libphpdir.
  • $(SRC) defines all source files that are required to assemble library. One of current limitation is one library per Makefile.
  • if HAVE_FEA ... endif includes files into library if FEA is configured, variable HAVE_FEA is automatically managed by ACX_FEATURE([fea]) macro.
  • @INC_AMINCLUDE@ is automatically replaced by include $(top_builddir)/aminclude.am. This script contains rules to build libphpdemo.php and index.php.

4. Makefile.am for Javascript

You have to create Makefile.am into web-php-demo/js

   # library source files
   SRC  = demo1.js
   SRC += demo2.js
   # source files that implements optional feature
   if HAVE_FEA
   SRC += fea.js
   endif
   
   #target libraries
   LIB  = libdemo.yc.js libdemo.nc.js
   libjs_SCRIPTS = $(LIB)
   static_DATA   = $(LIB)
   CLEANFILES = $(LIB)
   EXTRA_DIST = $(SRC)
   
   #includes additional rules
   @INC_AMINCLUDE@
  • In this example we install javascript both to libjsdir and staticdir
  • Javascript libraries a assembled in non-compressed (.nc.js) version and compressed (.yc.js)

5. Makefile.am for Stylesheet

You have to create Makefile.am into web-php-demo/css

   # common stylesheet
   SRC  = demo1.css
   SRC += demo2.css
   # optional stylesheet
   if HAVE_FEA
   SRC += fea.css
   endif
   
   #targets
   CSS  =  libdemo.nc.css libdemo.yc.css
   
   static_DATA = $(CSS)
   CLEANFILES  = $(CSS)
   EXTRA_DIST  = $(SRC)
   
   @INC_AMINCLUDE@

6. Configure package

In the root folder of your project (web-php-demo)

   autoreconf -i
   ./configure

By default everything would be installed under /usr/local

   libphpdir:	 /usr/local/lib/php
   wwwdir:	 /usr/local/var/www
   staticdir:	 /usr/local/var/www/static
   libjsdir:	 /usr/local/lib/js

Adjust configuration according you httpd setup

   ./configure wwwdir=/var/www staticdir=/var/www/static

7. Build and Install package

   make
   make install