content: #!/user/bin/env stack
  -- stack --resolver lts-11.8 script --package process --package directory --package filepath --package mtl
  
  --
  -- Copyright (c) 2014-18 Nicola Bonelli <nicola@pfq.io>
  --
  -- This program is free software; you can redistribute it and/or modify
  -- it under the terms of the GNU General Public License as published by
  -- the Free Software Foundation; either version 2 of the License, or
  -- (at your option) any later version.
  --
  -- This program is distributed in the hope that it will be useful,
  -- but WITHOUT ANY WARRANTY; without even the implied warranty of
  -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  -- GNU General Public License for more details.
  --
  -- You should have received a copy of the GNU General Public License
  -- along with this program; if not, write to the Free Software
  -- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  --
  
  {-# LANGUAGE OverloadedStrings #-}
  
  import Development.SimpleBuilder
  import System.Environment
  import Control.Monad(when)
  
  
  options = defaultOptions { stack = True }
  script :: BuilderScript
  script = do
  
      -- PFQ kernel module
  
      objective "pfq.ko" "kernel/" $ do
  
          config    $ empty
          build     $ make
          install   $ make_install `req` buildOf "pfq.ko"
          clean     $ make_clean
          distclean $ make_clean
  
     -- PFQ C library
  
      objective "pfq-clib" "user/lib/C/" $ do
  
         config     $ cmake
         build      $ make            `req` configOf "pfq-clib"  `req` installOf "pfq.ko"
         install    $ make_install    `req` buildOf  "pfq-clib" >> ldconfig
         clean      $ make_clean      `req` configOf "pfq-clib"
         distclean  $ cmake_distclean `req` cleanOf  "pfq-clib"
  
      -- PFQ C++ library
  
      objective "pfq-cpplib" "user/lib/C++/pfq/" $ do
          config    $ empty
          build     $ empty
          install   $ make_install `req` installOf "pfq-clib" `req` installOf "pfq.ko"
          clean     $ empty
  
       -- PFQ Haskell library
  
      objective "pfq-haskell-lib" "user/lib/Haskell/" $ do
          config    $ cabalConfigure  `req` installOf "pfq-clib"
          build     $ cabalBuild      `req` installOf "pfq.ko" `req` configOf "pfq-haskell-lib"
          install   $ cabalInstall    `req` buildOf "pfq-haskell-lib"
          clean     $ cabalClean
          distclean $ cabalDistClean
  
       -- PFQ pcap library 1.8.1
  
      objective "pfq-pcap" "user/lib/libpcap-1.8.1-fanout/" $ do
          config    $ cmd "autoconf" `req` installOf "pfq-clib" >> configure
          build     $ make           `req` installOf "pfq.ko" `req` configOf "pfq-pcap"
          install   $ empty          `req` buildOf   "pfq-pcap"
          clean     $ make_clean     `req` configOf  "pfq-pcap"
          distclean $ make_distclean `req` cleanOf   "pfq-pcap"
  
       -- PFQ hcounters (exmaple)
  
      objective "pfq-hcounters" "user/pfq-hcounters/" $ do
          config    $ cabalConfigure  `req` installOf   "pfq-haskell-lib"
          build     $ cabalBuild      `req` configOf    "pfq-hcounters"
          install   $ cabalInstall    `req` buildOf     "pfq-hcounters"
          clean     $ cabalClean
          distclean $ cabalDistClean
  
       -- pfq-lang compiler:
  
      objective "pfq-lang" "user/pfq-lang/" $ do
          config    $ cabalConfigure  `req` installOf   "pfq-haskell-lib"
          build     $ cabalBuild      `req` configOf    "pfq-lang"
          install   $ cabalInstall    `req` buildOf     "pfq-lang"
          clean     $ cabalClean
          distclean $ cabalDistClean
  
  
       -- PFQ user tools
  
      objective "pfq-affinity" "user/pfq-affinity/" $ do
          config    $ cabalConfigure    `req` installOf "pfq-haskell-lib"
          build     $ cabalBuild        `req` configOf  "pfq-affinity"
          install   $ cabalInstall      `req` buildOf   "pfq-affinity"
          clean     $ cabalClean
          distclean $ cabalDistClean
  
      objective "pfq-omatic" "user/pfq-omatic/" $ do
          config    $ cabalConfigure    `req` installOf "pfq-haskell-lib"
          build     $ cabalBuild        `req` configOf  "pfq-omatic"
          install   $ cabalInstall      `req` buildOf   "pfq-omatic"
          clean     $ cabalClean
          distclean $ cabalDistClean
  
      objective "pfq-load" "user/pfq-load/" $ do
          config    $ cabalConfigure
          build     $ cabalBuild        `req` installOf "pfq-affinity" `req` configOf "pfq-load"
          install   $ cabalInstall      `req` buildOf   "pfq-load"
          clean     $ cabalClean
          distclean $ cabalDistClean
  
      objective "pfq-stress" "user/pfq-stress/" $ do
          config    $ cabalConfigure
          build     $ cabalBuild        `reqs` [installOf "pfq-affinity", installOf "pfq-load", configOf "pfq-stress"]
          install   $ cabalInstall      `req` buildOf "pfq-stress"
          clean     $ cabalClean
          distclean $ cabalDistClean
  
      objective "pfqd" "user/pfqd/" $ do
          config    $ cabalConfigure    `req` installOf "pfq-haskell-lib"
          build     $ cabalBuild        `req` installOf "pfq.ko" `req` configOf "pfqd"
          install   $ cabalInstall      `req` buildOf   "pfqd"
          clean     $ cabalClean
          distclean $ cabalDistClean
  
      objective "pfq-regression" "user/pfq-regression/C/" $ do
          config    $ cmake
          build     $ make              `reqs` [installOf "pfq-clib", installOf "pfq-cpplib", configOf "pfq-regression"]
          install   $ empty             `req`  buildOf  "pfq-regression"
          clean     $ make_clean        `req`  configOf "pfq-regression"
          distclean $ cmake_distclean   `req`  cleanOf  "pfq-regression"
  
       -- PFQ htest (misc tests)
  
      objective "h-regression" "user/pfq-regression/Haskell/" $ do
          config    $ cabalConfigure  `req` installOf "pfq-haskell-lib"
          build     $ cabalBuild      `req` configOf  "h-regression"
          install   $ empty           `req` buildOf   "h-regression"
          clean     $ cabalClean
          distclean $ cabalDistClean
  
      objective "pfq-tools" "user/pfq-tools/" $ do
          config    $ cmake
          build     $ make             `reqs` [installOf "pfq-clib", configOf "pfq-tools"]
          install   $ make_install     `req`  buildOf  "pfq-tools"
          clean     $ make_clean       `req`  configOf "pfq-tools"
          distclean $ cmake_distclean  `req`  cleanOf  "pfq-tools"
  
  
  main = simpleBuilder script options =<< getArgs
  
  
  