#!/usr/bin/perl use strict; my $deps = {}; for my $line (split /\n/, `grep '^#include "' *.cpp *.h`) { if ($line =~ /^([^:]+):\#include "([^"]+)"/s) { $deps->{$1}->{$2} = 1; } } my $added; do { $added = 0; for my $file (keys %$deps) { for my $dep (keys %{$deps->{$file}}) { if ($deps->{$dep}) { for my $subdep (keys %{$deps->{$dep}}) { if (!$deps->{$file}->{$subdep}) { $added = 1; $deps->{$file}->{$subdep} = 1; } } } } } } while ($added); for my $file (sort keys %$deps) { if ($file =~ /\.cpp$/) { my $obj = $file; $obj =~ s/\.cpp$/.o/s; print "$obj: $file ".join(" ", sort keys %{$deps->{$file}})."\n"; print "\tg++ \$(CXXFLAGS) -c -o \$\@ \$\<\n"; } }