<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">#!/usr/bin/python

# Copyright 2012 Steven Watanabe
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)

import BoostBuild

t = BoostBuild.Tester(use_test_config=False)

# Test a header loop that depends on (but does not contain) a generated header.
t.write("test.cpp", '#include "header1.h"\n')

t.write("header1.h", """\
#ifndef HEADER1_H
#define HEADER1_H
#include "header2.h"
#endif
""")

t.write("header2.h", """\
#ifndef HEADER2_H
#define HEADER2_H
#include "header1.h"
#include "header3.h"
#endif
""")

t.write("header3.in", "/* empty file */\n")

t.write("jamroot.jam", """\
import common ;
make header3.h : header3.in : @common.copy ;
obj test : test.cpp : &lt;implicit-dependency&gt;header3.h ;
""")

t.run_build_system(["-j2"])
t.expect_addition("bin/$toolset/debug/header3.h")
t.expect_addition("bin/$toolset/debug/test.obj")
t.expect_nothing_more()

t.rm(".")

# Test a linear sequence of generated headers.
t.write("test.cpp", '#include "header1.h"\n')

t.write("header1.in", """\
#ifndef HEADER1_H
#define HEADER1_H
#include "header2.h"
#endif
""")

t.write("header2.in", """\
#ifndef HEADER2_H
#define HEADER2_H
#include "header3.h"
#endif
""")

t.write("header3.in", "/* empty file */\n")

t.write("jamroot.jam", """\
import common ;
make header1.h : header1.in : @common.copy ;
make header2.h : header2.in : @common.copy ;
make header3.h : header3.in : @common.copy ;
obj test : test.cpp :
    &lt;implicit-dependency&gt;header1.h
    &lt;implicit-dependency&gt;header2.h
    &lt;implicit-dependency&gt;header3.h ;
""")

t.run_build_system(["-j2", "test"])
t.expect_addition("bin/$toolset/debug/header1.h")
t.expect_addition("bin/$toolset/debug/header2.h")
t.expect_addition("bin/$toolset/debug/header3.h")
t.expect_addition("bin/$toolset/debug/test.obj")
t.expect_nothing_more()

t.rm(".")

# Test a loop in generated headers.
t.write("test.cpp", '#include "header1.h"\n')

t.write("header1.in", """\
#ifndef HEADER1_H
#define HEADER1_H
#include "header2.h"
#endif
""")

t.write("header2.in", """\
#ifndef HEADER2_H
#define HEADER2_H
#include "header3.h"
#endif
""")

t.write("header3.in", """\
#ifndef HEADER2_H
#define HEADER2_H
#include "header1.h"
#endif
""")

t.write("jamroot.jam", """\
import common ;

actions copy {
    sleep 1
    cp $(&gt;) $(&lt;)
}

make header1.h : header1.in : @common.copy ;
make header2.h : header2.in : @common.copy ;
make header3.h : header3.in : @common.copy ;
obj test : test.cpp :
    &lt;implicit-dependency&gt;header1.h
    &lt;implicit-dependency&gt;header2.h
    &lt;implicit-dependency&gt;header3.h ;
""")

t.run_build_system(["-j2", "test"])
t.expect_addition("bin/$toolset/debug/header1.h")
t.expect_addition("bin/$toolset/debug/header2.h")
t.expect_addition("bin/$toolset/debug/header3.h")
t.expect_addition("bin/$toolset/debug/test.obj")
t.expect_nothing_more()

t.rm(".")

# Test that all the dependencies of a loop are updated before any of the
# dependents.
t.write("test1.cpp", '#include "header1.h"\n')

t.write("test2.cpp", """\
#include "header2.h"
int main() {}
""")

t.write("header1.h", """\
#ifndef HEADER1_H
#define HEADER1_H
#include "header2.h"
#endif
""")

t.write("header2.h", """\
#ifndef HEADER2_H
#define HEADER2_H
#include "header1.h"
#include "header3.h"
#endif
""")

t.write("header3.in", "\n")

t.write("sleep.bat", """\
::@timeout /T %1 /NOBREAK &gt;nul
@ping 127.0.0.1 -n 2 -w 1000 &gt;nul
@ping 127.0.0.1 -n %1 -w 1000 &gt;nul
@exit /B 0
""")

t.write("jamroot.jam", """\
import common ;
import os ;

if [ os.name ] = NT
{
    SLEEP = call sleep.bat ;
}
else
{
    SLEEP = sleep ;
}

rule copy { common.copy $(&lt;) : $(&gt;) ; }
actions copy { $(SLEEP) 1 }

make header3.h : header3.in : @copy ;
exe test : test2.cpp test1.cpp : &lt;implicit-dependency&gt;header3.h ;
""")

t.run_build_system(["-j2", "test"])
t.expect_addition("bin/$toolset/debug/header3.h")
t.expect_addition("bin/$toolset/debug/test1.obj")
t.expect_addition("bin/$toolset/debug/test2.obj")
t.expect_addition("bin/$toolset/debug/test.exe")
t.expect_nothing_more()

t.touch("header3.in")
t.run_build_system(["-j2", "test"])
t.expect_touch("bin/$toolset/debug/header3.h")
t.expect_touch("bin/$toolset/debug/test1.obj")
t.expect_touch("bin/$toolset/debug/test2.obj")
t.expect_touch("bin/$toolset/debug/test.exe")
t.expect_nothing_more()

t.rm(".")

# Test a loop that includes a generated header
t.write("test1.cpp", '#include "header1.h"\n')
t.write("test2.cpp", """\
#include "header2.h"
int main() {}
""")

t.write("header1.h", """\
#ifndef HEADER1_H
#define HEADER1_H
#include "header2.h"
#endif
""")

t.write("header2.in", """\
#ifndef HEADER2_H
#define HEADER2_H
#include "header3.h"
#endif
""")

t.write("header3.h", """\
#ifndef HEADER3_H
#define HEADER3_H
#include "header1.h"
#endif
""")

t.write("sleep.bat", """\
::@timeout /T %1 /NOBREAK &gt;nul
@ping 127.0.0.1 -n 2 -w 1000 &gt;nul
@ping 127.0.0.1 -n %1 -w 1000 &gt;nul
@exit /B 0
""")

t.write("jamroot.jam", """\
import common ;
import os ;

if [ os.name ] = NT
{
    SLEEP = call sleep.bat ;
}
else
{
    SLEEP = sleep ;
}

rule copy { common.copy $(&lt;) : $(&gt;) ; }
actions copy { $(SLEEP) 1 }

make header2.h : header2.in : @copy ;
exe test : test2.cpp test1.cpp : &lt;implicit-dependency&gt;header2.h &lt;include&gt;. ;
""")

t.run_build_system(["-j2", "test"])
t.expect_addition("bin/$toolset/debug/header2.h")
t.expect_addition("bin/$toolset/debug/test1.obj")
t.expect_addition("bin/$toolset/debug/test2.obj")
t.expect_addition("bin/$toolset/debug/test.exe")
t.expect_nothing_more()

t.cleanup()
</pre></body></html>