aboutsummaryrefslogtreecommitdiff
path: root/system-clock/genmake.pl
blob: 3403759dd2a8038695f65df217e4c7e24d854994 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#!/usr/bin/perl

# This script is designed to introspect C files and generate a makefile to use.

sub header_deps {
  my $file = @_[0];
  my @headers;

  if (open(my $fh, '<:encoding(UTF-8)', $file)) {
    print STDERR "\x1b[35m[Trace] - Reading file $file\x1b[00m\n";
    push(@headers, $file);

    while (<$fh>) {
      /#include\s+"(.*)"\s*$/ && push(@headers, header_deps($1));
    }
  }

  return @headers;
}

my @files = glob('./*.c');
my @obj_files;

open(my $fh, '<:encoding(UTF-8)', "Makefile.preamble") or die "Missing Makefile.preamble";
while (<$fh>) {
  print "$_";
}

foreach $file (@files) {
  (my $file_no_ext = $file) =~ s/^\.\/(.*)\.c$/\1/g;

  my $obj_file = "${file_no_ext}.o";
  my $c_file = "${file_no_ext}.c";
  my $s_file = "${file_no_ext}.s";

  push(@obj_files, $obj_file);
  my @deps = header_deps($c_file);

  my $deps_as_join = join(" ", @deps);

  # Emit the rule to make the object file.
  print "$obj_file: $deps_as_join\n\t";
  print '$(CC) -c ' . $c_file . ' -o ' . $obj_file . ' $(CFLAGS)' . "\n\n";

  # Emit the rule to make the assembly file.
  print "$s_file: $deps_as_join\n\t";
  print '$(CC) -S ' . $c_file . ' -o ' . $s_file . ' $(CFLAGS)' . "\n\n";
}

my $obj_files_deps = join(' ', @obj_files);
print "main.elf: $obj_files_deps linker_script.ld\n\t";
print '$(LD) -o main.elf $(LD_FLAGS) ' . "$obj_files_deps\n\n";