#!/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


