# Units documentation Jamfile
#
# Copyright (c) 2007-2008
# Steven Watanabe
#
# Distributed under 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 path ;
import quickbook ;
using boostbook ;
using doxygen ;
import print ;
import regex ;
import sequence ;

path-constant here : . ;

rule run_doxygen ( target : files * : name )
{
    doxygen $(target)
      :
        $(files)
      :
        <doxygen:param>EXTRACT_ALL=YES
        <doxygen:param>EXPAND_ONLY_PREDEF=YES

        # Horribly ugly, but then macros usually are :(
        <doxygen:param>"PREDEFINED= \\
            \"BOOST_MPL_ASSERT(expr)=\" \\
            \"BOOST_UNITS_STATIC_CONSTANT(a,b)=static const b a\" \\
            \"BOOST_UNITS_AUTO_STATIC_CONSTANT(a,b)=static const auto a = b\" \\
            \"BOOST_UNITS_TYPEOF(a)=typeof(a)\" \\
            \"BOOST_PREVENT_MACRO_SUBSTITUTION=\" \\
            \"BOOST_UNITS_HAS_TYPEOF=1\" \\
            \"BOOST_UNITS_DEFINE_BASE_UNIT_WITH_CONVERSIONS(namespace_, name_, name_string, symbol_, factor, other_unit, id)= \\
                namespace boost { namespace units { namespace namespace_ { \\
                    struct name_ ## _base_unit : boost::units::base_unit<name_ ## _base_unit, other_unit::dimension_type, id> { \\
                        static const char* name(); \\
                        static const char* symbol(); \\
                    }; \\
                } } }\" \\
            \"BOOST_UNITS_DOXYGEN=1\""
        <doxygen:param>HIDE_UNDOC_MEMBERS=NO
        <doxygen:param>EXTRACT_PRIVATE=NO
        <doxygen:param>ENABLE_PREPROCESSING=YES
        <doxygen:param>MACRO_EXPANSION=YES
        $(expand)
        <doxygen:param>SEARCH_INCLUDES=NO
        <reftitle>$(name)
    ;

}

run_doxygen units_reference
  :
    [ glob $(here)/../../../boost/units/*.hpp :
           $(here)/../../../boost/units/physical_dimensions.hpp ]
  :
    "Units Reference"
  ;

run_doxygen si_reference
  :
    $(here)/../../../boost/units/systems/si.hpp
    [ path.glob-tree $(here)/../../../boost/units/systems/si : *.hpp : detail ]
  :
    "SI System Reference"
  ;

run_doxygen cgs_reference
  :
    $(here)/../../../boost/units/systems/cgs.hpp
    [ path.glob-tree $(here)/../../../boost/units/systems/cgs : *.hpp : detail ]
  :
    "CGS System Reference"
  ;

rule make_base_units_doc ( directory : name )
{
    run_doxygen $(directory)_base_units_reference
      :
        [ path.glob-tree $(here)/../../../boost/units/base_units/$(directory) : *.hpp : detail conversions.hpp ]
      :
        "$(name) Base Units Reference"
      ;
}

make_base_units_doc angle : Angle ;
make_base_units_doc astronomical : Astronomical ;
make_base_units_doc cgs : CGS ;
make_base_units_doc imperial : Imperial ;
make_base_units_doc metric : Metric ;
make_base_units_doc si : SI ;
make_base_units_doc temperature : Temperature ;
make_base_units_doc us : US ;

all_base_units_doc = angle astronomical cgs imperial metric si temperature us ;
all_base_units_doc = $(all_base_units_doc)_base_units_reference ;

run_doxygen dimensions_reference
  :
    $(here)/../../../boost/units/physical_dimensions.hpp
    [ path.glob-tree $(here)/../../../boost/units/physical_dimensions : *.hpp : detail ]
  :
    "Dimensions Reference"
  ;

run_doxygen trig_reference
  :
    #../../../boost/units/systems/trig.hpp
    [ path.glob-tree $(here)/../../../boost/units/systems/angle : *.hpp : detail ]
  :
    "Trigonometry and Angle System Reference"
  ;

run_doxygen temperature_reference
  :
    [ path.glob-tree $(here)/../../../boost/units/systems/temperature : *.hpp : detail ]
  :
    "Temperature System Reference"
  ;

run_doxygen abstract_reference
  :
    $(here)/../../../boost/units/systems/abstract.hpp
  :
    "Abstract System Reference"
  ;

rule less ( a b )
{
    if [ path.basename $(a) ]  < [ path.basename $(b) ] 
    {
        return true ;
    }
}

rule generate-qbk ( target : sources * : properties * )
{
    print.output $(target) ;
    local as-path = [ sequence.transform path.make : $(sources:G=) ] ;
    local known = ;
    local duplicated = ;
    for local file in $(as-path)
    {
        local base = [ path.basename $(file) ] ;
        if $(base) in $(known)
        {
            if ! $(base) in $(duplicated)
            {
                duplicated += $(base) ;
            }
        } else
        {
            known += $(base) ;
        }
    }
    for local file in [ sequence.insertion-sort $(as-path) : less ]
    {
        local output_filename = [ path.relative-to [ path.make $(here)/../../.. ] $(file) ] ;
        local base_filename = [ path.basename $(file) ] ;
        local base_unit = [ regex.replace $(base_filename) "\\.hpp" "" ] ;
        if $(base_filename) in $(duplicated)
        {
            # tack the directory name onto the end
            local dir-name = [ path.basename [ path.parent $(file) ] ] ;
            base_unit = "$(base_unit) ($(dir-name))" ;
        }
        print.text "[headerref $(output_filename) $(base_unit)]\\n" : overwrite ;
    }
}

make base_units.qbk : [ path.glob-tree $(here)/../../../boost/units/base_units : *.hpp : detail conversions.hpp ] : @generate-qbk ;
explicit base_units ;

install base_units_install : base_units.qbk : <location>. ;

xml units
  :
    units.qbk
  :
    <dependency>base_units_install
    <dependency>units_reference
    <dependency>si_reference
    <dependency>cgs_reference
    <dependency>$(all_base_units_doc)
    <dependency>dimensions_reference
    <dependency>trig_reference
    <dependency>temperature_reference
    <dependency>abstract_reference
;

boostbook standalone
  :
    units
  :
    <xsl:param>toc.max.depth=1
    <xsl:param>toc.section.depth=8
    <xsl:param>chunk.section.depth=8
    <xsl:param>boost.root="../../../.."
    <format>pdf:<xsl:param>boost.url.prefix=http://www.boost.org/doc/libs/release/doc/html
;




