# Jamfile
#
# Copyright (c) 2007-2008 Steven Watanabe
# Copyright (c) 2009 Joel de Guzman
# Copyright (c) 2009 Hartmut Kaiser
# Copyright (c) 2009 Francois Barel
#
# 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 testing ;
import path ;
import regex ;
import print ;
import sequence ;
import feature ;

project boost/spirit/repository/test/test_headers 
    : requirements 
        <include>$(BOOST_ROOT) 
        <include>../../../../..
        <toolset>gcc:<cxxflags>-ftemplate-depth-300
        <toolset>darwin:<cxxflags>-ftemplate-depth-300
    ;

headers = 
[ 
    path.glob-tree ../../../../../boost/spirit/repository/include : *.hpp 
] ;

main_headers = 
[ 
    path.glob-tree ../../../../../boost/spirit/include : *.hpp : classic* phoenix1*
] ;

for local file in $(headers)
{
    compile test.cpp
        : # requirements
            <define>BOOST_SPIRIT_HEADER_NAME=$(file)
            <dependency>$(file)
        : # test name
            [ regex.replace [ path.relative-to ../../../../../boost/spirit/repository $(file) ] "/" "_" ] 
        ;
}

feature.feature <generate-include-all-order> : forward reverse : incidental ;

rule generate-include-all ( target : sources * : properties * )
{
    print.output $(target) ;

    if <generate-include-all-order>reverse in $(properties)
    {
        sources = [ sequence.reverse $(sources) ] ;
    }

    for local file in $(sources)
    {
        print.text "#include <$(file:G=)>
" : overwrite ;
    }

}

make auto_all1.cpp 
    : $(headers) $(main_headers)
    : @generate-include-all 
    ;

make auto_all2.cpp 
    : $(headers) $(main_headers)
    : @generate-include-all 
    : <generate-include-all-order>reverse 
    ;

# this ought to catch non-inlined functions and other duplicate definitions
link auto_all1.cpp auto_all2.cpp main.cpp 
    : <include>. 
    : auto_all_headers 
    ;
