+ my ($srcfile, @stat)=srcfile_stat($file);
+ if (! exists $pagemtime{$page} ||
+ $stat[9] > $pagemtime{$page} ||
+ $forcerebuild{$page}) {
+ $pagemtime{$page}=$stat[9];
+
+ if (isinternal($page)) {
+ # Preprocess internal page in scan-only mode.
+ preprocess($page, $page, readfile($srcfile), 1);
+ push @internal_change, $file;
+ }
+ else {
+ push @needsbuild, $file;
+ }
+ }
+ }
+ run_hooks(needsbuild => sub { shift->(\@needsbuild) });
+
+ # before scanning, make a note of where pages'
+ # old links pointed
+ my %oldlink_targets;
+ foreach my $file (@needsbuild, @del) {
+ my $page=pagename($file);
+ if (exists $oldlinks{$page}) {
+ foreach my $l (@{$oldlinks{$page}}) {
+ $oldlink_targets{$page}{$l}=bestlink($page, $l);
+ }
+ }
+ }
+
+ # scan and render changed files
+ foreach my $file (@needsbuild) {
+ debug(sprintf(gettext("scanning %s"), $file));
+ scan($file);
+ }
+ calculate_links();
+ foreach my $file (@needsbuild) {
+ debug(sprintf(gettext("building %s"), $file));
+ render($file);
+ $rendered{$file}=1;
+ }
+ foreach my $file (@internal, @internal_change) {
+ # internal pages are not rendered
+ my $page=pagename($file);
+ delete $depends{$page};
+ delete $depends_simple{$page};
+ foreach my $old (@{$renderedfiles{$page}}) {
+ delete $destsources{$old};