# Copyright Eric Niebler 2005. Use, modification, and distribution are
# subject to the Boost Software License, Version 1.0. (See accompanying
# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)

import os ;
import common ;
import doxygen ;
import quickbook ;

#
# Accumulators docs are dependent upon
# latex dvips and ps being in your PATH.
# This is true for most Unix installs, but
# not on Win32, where you will need to install
# MkTex and Ghostscript and add these tools
# to your path.
#
make latex.check : : @check-latex ;
actions check-latex
{
    latex -version > latex.version
}

make dvips.check : : @check-dvips ;
actions check-dvips
{
    dvips -version > dvips.version
}

make gs.check : : @check-gs ;

import os ;

if [ os.name ] = "NT"
{
   actions check-gs
   {
       gswin32c -version > gs.version
   }
}
else
{
   actions check-gs
   {
       gs -version > gs.version
   }
}

# Use Doxygen to emit a tagfile with the definition of depends_on<>. That
# tagfile will be used by Doxygen below when generating the Statistics Library
# Reference. This is all so that the Doxygen-generated documentation for the
# features shows the dependency relationships between them.
doxygen tagfile
    :
        ../include/boost/accumulators/framework/depends_on.hpp
        ../include/boost/accumulators/framework/extractor.hpp
    :
        <doxygen:param>MACRO_EXPANSION=YES
        <doxygen:param>EXPAND_ONLY_PREDEF=YES
        <doxygen:param>GENERATE_TAGFILE=accumulators.tag
        <doxygen:param>"PREDEFINED=\"BOOST_ACCUMULATORS_DOXYGEN_INVOKED=1\" \\
                                   \"BOOST_PP_REPEAT_FROM_TO(a,b,c,d)=\" \\
                                   \"BOOST_PP_ENUM_PARAMS(a,b)=b ## 1, b ## 2, ...\""
        <dependency>latex.check
        <dependency>dvips.check
        <dependency>gs.check
    ;

doxygen accdoc
    :
        [ glob ../include/boost/accumulators/accumulators*.hpp ]
        [ glob ../include/boost/accumulators/framework/*.hpp ]
        [ glob ../include/boost/accumulators/framework/parameters/*.hpp ]
        [ glob ../include/boost/accumulators/framework/accumulators/*.hpp ]
    :
        <doxygen:param>EXTRACT_ALL=YES
        <doxygen:param>"PREDEFINED=\"BOOST_ACCUMULATORS_DOXYGEN_INVOKED=1\" \\
                                   \"BOOST_PP_REPEAT_FROM_TO(a,b,c,d)=\" \\
                                   \"BOOST_PP_REPEAT(a,b,c)=\" \\
                                   \"BOOST_PARAMETER_KEYWORD(a,b)=\\
                                         namespace a { struct b {}; } \\
                                         boost::parameter::keyword<a::b> const b;\" \\
                                   \"BOOST_PP_ENUM_PARAMS(a,b)=b ## 1, b ## 2, ...\""
        <doxygen:param>HIDE_UNDOC_MEMBERS=NO
        <doxygen:param>EXTRACT_PRIVATE=NO
        <doxygen:param>ENABLE_PREPROCESSING=YES
        <doxygen:param>MACRO_EXPANSION=YES
        <doxygen:param>EXPAND_ONLY_PREDEF=YES
        <doxygen:param>SEARCH_INCLUDES=NO
        <reftitle>"Accumulators Framework Reference"
        <dependency>latex.check
        <dependency>dvips.check
        <dependency>gs.check
    ;

# Generate the HTML form of the stats documentation, as this causes Doxygen to
# generate .png images for the LaTeX formulas embedded in the doc comments.
doxygen statsdoc.html
    :
        [ glob ../include/boost/accumulators/statistics*.hpp ]
        [ glob ../include/boost/accumulators/statistics/*.hpp ]
        [ glob ../include/boost/accumulators/statistics/variates/*.hpp ]
    :
        <dependency>latex.check
        <dependency>dvips.check
        <dependency>gs.check
    ;

if [ os.name ] = NT
{
    CP = copy /y ;
    MKDIR = mkdir ;
    FROM = \\..\\..\\..\\html\\statsdoc\\*.png ;
    TOHTML = .\\html\\images\\accumulators ;
    TOPDF = \\images\\accumulators ;
}
else
{
    CP = cp ;
    MKDIR = mkdir -p ;
    FROM = /../../html/statsdoc/*.png ;
    TOHTML = ./html/images/accumulators ;
    TOPDF = /images/accumulators ;
}

actions copy-latex-pngs
{
    $(MKDIR) $(TOHTML)
    $(MKDIR) $(<:D)$(TOPDF)
    $(CP) $(<:D)$(FROM) $(TOHTML)
    $(CP) $(<:D)$(FROM) $(<:D)$(TOPDF)
    echo "Stamped" > "$(<)"
}

# This causes the png files built above to be copied into the
# html/images/accumulators directory.
make statsdoclatex.tag
    : statsdoc.html
    : @copy-latex-pngs
    ;

doxygen statsdoc
    :
        [ glob ../include/boost/accumulators/statistics*.hpp ]
        [ glob ../include/boost/accumulators/statistics/*.hpp ]
        [ glob ../include/boost/accumulators/statistics/variates/*.hpp ]
    :
        <doxygen:param>EXTRACT_ALL=YES
        <doxygen:param>"PREDEFINED=\"BOOST_ACCUMULATORS_DOXYGEN_INVOKED=1\" \\
                                   \"BOOST_PP_REPEAT_FROM_TO(a,b,c,d)=\" \\
                                   \"BOOST_PP_REPEAT(a,b,c)=\" \\
                                   \"BOOST_PARAMETER_KEYWORD(a,b)=\\
                                         namespace a { struct b {}; } \\
                                         boost::parameter::keyword<a::b> const b;\" \\
                                   \"BOOST_PP_ENUM_PARAMS(a,b)=b ## 1, b ## 2, ...\""
        <doxygen:param>HIDE_UNDOC_MEMBERS=NO
        <doxygen:param>EXTRACT_PRIVATE=NO
        <doxygen:param>ENABLE_PREPROCESSING=YES
        <doxygen:param>MACRO_EXPANSION=YES
        <doxygen:param>EXPAND_ONLY_PREDEF=YES
        <doxygen:param>SEARCH_INCLUDES=NO
        <doxygen:param>TAGFILES=accumulators.tag
        <xsl:param>boost.doxygen.formuladir=images/accumulators/
        <reftitle>"Statistics Library Reference"
        <dependency>tagfile
        <dependency>statsdoclatex.tag
        <dependency>latex.check
        <dependency>dvips.check
        <dependency>gs.check
    ;

doxygen opdoc
    :
        [ glob ../include/boost/accumulators/numeric/functional.hpp ]
        [ glob ../include/boost/accumulators/numeric/functional/*.hpp ]
    :
        <doxygen:param>EXTRACT_ALL=YES
        <doxygen:param>"PREDEFINED=\"BOOST_NUMERIC_FUNCTIONAL_DOXYGEN_INVOKED=1\" \\
                                   \"BOOST_NUMERIC_FUNCTIONAL_DEFINE_BINARY_OP(a,b,c)=\\
                                         namespace functional { \\
                                         template<class Left,class Right,class EnableIf=void> struct a ## _base \\
                                         : std::binary_function<Left, Right, typeof(lvalue<Left>() b lvalue<Right>())> { \\
                                         /** \\return left b right */ \\
                                         result_type operator()(Left &left, Right &right) const; }; \\
                                         template<class Left,class Right, \\
                                                  class LeftTag=typename tag<Left>::type, \\
                                                  class RightTag=typename tag<Right>::type> \\
                                         struct a : a ## _base<Left,Right,void> {}; } \\
                                         namespace op { \\
                                         struct a : boost::detail::function2< \\
                                             functional::a<_1,_2,functional::tag<_1>,functional::tag<_2> > > {}; } \\
                                         namespace { \\
                                         /** \\return functional::a<Left, Right>()(left, right) */ \\
                                         op::a const & a = boost::detail::pod_singleton<op::min_assign>::instance; } \" \\
                                   \"BOOST_NUMERIC_FUNCTIONAL_DEFINE_UNARY_OP(a,b)=\\
                                         namespace functional { \\
                                         template<class Arg,class EnableIf=void> struct a ## _base \\
                                         : std::unary_function<Arg, typeof(b lvalue<Arg>())> { \\
                                         /** \\return b arg */ \\
                                         result_type operator()(Arg & arg) const; }; \\
                                         template<class Arg,class Tag=typename tag<Arg>::type> \\
                                         struct a : a ## _base<Arg,void> {}; } \\
                                         namespace op { \\
                                         struct a : boost::detail::function1< \\
                                             functional::a<_,functional::tag<_> > > {}; } \\
                                         namespace { \\
                                         /** \\return functional::a<Arg>()(arg) */ \\
                                         op::a const & a = boost::detail::pod_singleton<op::min_assign>::instance; }\""
        <doxygen:param>HIDE_UNDOC_MEMBERS=NO
        <doxygen:param>EXTRACT_PRIVATE=NO
        <doxygen:param>ENABLE_PREPROCESSING=YES
        <doxygen:param>MACRO_EXPANSION=YES
        <doxygen:param>EXPAND_ONLY_PREDEF=YES
        <doxygen:param>SEARCH_INCLUDES=NO
        <reftitle>"Numeric Operators Library Reference"
        <dependency>latex.check
        <dependency>dvips.check
        <dependency>gs.check
    ;

xml accumulators
    :
        accumulators.qbk
    :
        <xsl:param>boost.max.id.length=1024
        <xsl:param>toc.max.depth=4
        <xsl:param>toc.section.depth=4
        <xsl:param>chunk.section.depth=2
    ;

path-constant images_location : html ;

boostbook standalone
    :
        accumulators
    :
        <xsl:param>boost.root=../../../..
        <xsl:param>boost.max.id.length=1024
        <xsl:param>toc.max.depth=4
        <xsl:param>toc.section.depth=4
        <xsl:param>chunk.section.depth=2
        <dependency>accdoc
        <dependency>statsdoc
        <dependency>opdoc
        <format>pdf:<xsl:param>img.src.path=$(images_location)/
        <format>pdf:<xsl:param>boost.url.prefix=http://www.boost.org/doc/libs/release/doc/html
    ;

###############################################################################
alias boostdoc
    : accumulators
    :
    : <dependency>accdoc <dependency>statsdoc <dependency>opdoc
    : ;
explicit boostdoc ;
alias boostrelease ;
explicit boostrelease ;
