#!/usr/bin/env tclsh
###############################################################################
# BRLTTY - A background process providing access to the console screen (when in
#          text mode) for a blind person using a refreshable braille display.
#
# Copyright (C) 1995-2023 by The BRLTTY Developers.
#
# BRLTTY comes with ABSOLUTELY NO WARRANTY.
#
# This is free software, placed under the terms of the
# GNU Lesser General Public License, as published by the Free Software
# Foundation; either version 2.1 of the License, or (at your option) any
# later version. Please see the file LICENSE-LGPL for details.
#
# Web Page: http://brltty.app/
#
# This software is maintained by Dave Mielke <dave@mielke.cc>.
###############################################################################

source [file join [file dirname [info script]] .. prologue.tcl]
cd $sourceRoot

proc getBuildDirectories {{root ""}} {
   set directories [list]

   if {[string length $root] == 0} {
      set root .
      set setPath {
         set path $name
      }
   } else {
      set setPath {
         set path [file join $root $name]
      }
   }

   if {[file exists [file join $root Makefile.in]]} {
      lappend directories $root
   }

   foreach name [readdir $root] {
      eval $setPath
      set type [file type $path]

      if {[string equal $type link]} {
         continue
      }

      if {[string equal $type directory]} {
         lvarcat directories [getBuildDirectories $path]
      }
   }

   return $directories
}

proc generatedFile {file} {
   set name [file tail $file]

   if {[string equal [file extension [file rootname $name]] .auto]} {
      return 1
   }

   if {[regexp {\.tab\.c$} $name]} {
      return 1
   }

   if {[lcontain {brlapi_constants.h} $name]} {
      return 1
   }

   return 0
}

proc sourceFile {file} {
   set name [lindex [set components [file split $file]] end]
   regsub {^forbuild(\.)} $name {config\1} name
   set path [eval file join [lreplace $components end end "$name.in"]]

   if {[file exists $path]} {
      return $path
   }

   return ""
}

proc dependencyExists {file} {
   if {[file exists $file]} {
      return 1
   }

   if {[string length [set source [sourceFile $file]]] > 0} {
      if {[file exists $source]} {
         return 1
      }
   }

   return 0
}

proc getDependencies {file} {
   upvar #0 dependencies($file) dependencies

   if {![info exists dependencies]} {
      lappend dependencies $file

      if {[string length [set source [sourceFile $file]]] == 0} {
         set source $file
      }
      set stream [open $source {RDONLY}]

      set includes [list]
      while {[gets $stream line] >= 0} {
         if {[regexp {^ *# *include *"([^"]*)"} $line x header]} {
            lappend includes $header
         }
      }
      close $stream; unset stream

      if {[string equal [set directory [file dirname $file]] .]} {
         set directory ""
      }

      foreach include $includes {
         if {[generatedFile $include]} {
            if {[string first / $include] < 0} {
               set include [file join $directory $include]
            }

            lappend dependencies $include
         } else {
            set found 0
            foreach location [list $directory Programs Headers ""] {
               if {[dependencyExists [set path [file join $location $include]]]} {
                  lvarcat dependencies [lindex [intersect3 $dependencies [getDependencies $path]] 2]
                  set found 1
                  break
               }
            }
            if {!$found} {
               writeProgramMessage "missing dependency: $file includes $include"
            }
         }
      }
   }

   return $dependencies
}

set optionDefinitions {
}

processProgramArguments optionValues $optionDefinitions

set sourceExtensions {c cc y}
set sourceExtensionsGlob "{[join $sourceExtensions ,]}"

foreach buildDirectory [set buildDirectories [getBuildDirectories]] {
   foreach sourceFile [glob -nocomplain [file join $buildDirectory "*.$sourceExtensionsGlob"]] {
      regsub {^(\./)+} $sourceFile {} sourceFile
      if {![generatedFile $sourceFile]} {
         lappend sourceFiles($buildDirectory) $sourceFile
         getDependencies $sourceFile
      }
   }
}

set generatedDependencies [list]
set objectFiles [list]
set absoluteStream [open absdeps.mk {WRONLY CREAT TRUNC}]
foreach buildDirectory [lsort $buildDirectories] {
   set relativeStream [open [file join $buildDirectory reldeps.mk] {WRONLY CREAT TRUNC}]

   if {[info exists sourceFiles($buildDirectory)]} {
      foreach sourceFile [lsort $sourceFiles($buildDirectory)] {
         switch -exact -- [file extension $sourceFile] {
            ".y" {
               set objectExtension ".tab.c"
            }

            default {
               set objectExtension ".\$O"
            }
         }

         set objectFile "[file rootname $sourceFile]$objectExtension"
         set objectName [file tail $objectFile]

         puts $absoluteStream "# Dependencies for $objectFile:"
         puts $relativeStream "# Dependencies for $objectName:"
         lappend objectFiles $objectFile

         foreach dependency $dependencies($sourceFile) {
            if {[set generated [generatedFile $dependency]]} {
               lappend generatedDependencies $dependency
            }

            if {$generated || ([string length [sourceFile $dependency]] > 0)} {
               set tree BLD
            } else {
               set tree SRC
            }

            puts $absoluteStream "\$(BLD_TOP)$objectFile: \$(${tree}_TOP)$dependency"
            puts -nonewline $relativeStream "$objectName: "

            if {[string equal $buildDirectory [file dirname $dependency]]} {
               if {![string equal $tree BLD]} {
                  puts -nonewline $relativeStream "\$(${tree}_DIR)/"
               }
               puts $relativeStream [file tail $dependency]
            } else {
               puts $relativeStream "\$(${tree}_TOP)$dependency"
            }
         }

         puts $absoluteStream "\tcd \$(@D) && \$(MAKE) \$(@F)"
         puts $absoluteStream ""
         puts $relativeStream ""
      }
   }

   close $relativeStream; unset relativeStream
}

if {![lempty [set generatedDependencies [lindex [intersect3 [lrmdups $generatedDependencies] $objectFiles] 0]]]} {
   puts $absoluteStream "# Generated dependencies:"
   foreach dependency [lsort $generatedDependencies] {
      puts $absoluteStream "\$(BLD_TOP)$dependency:"
      puts $absoluteStream "\tcd \$(@D) && \$(MAKE) \$(@F)"
   }
   puts $absoluteStream ""
}
close $absoluteStream; unset absoluteStream

exit 0
