Merge remote-tracking branch 'origin/master' into mmosca-mavlinkrc
[inav.git] / src / utils / build_stamp.rb
bloba067c4653cafa531c68a5aa5e91298d0df6b92dd
1 #!/usr/bin/env ruby
3 # This file is part of INAV.
5 # author: Alberto Garcia Hierro <alberto@garciahierro.com>
7 # This Source Code Form is subject to the terms of the Mozilla Public
8 # License, v. 2.0. If a copy of the MPL was not distributed with this file,
9 # You can obtain one at http://mozilla.org/MPL/2.0/.
11 # Alternatively, the contents of this file may be used under the terms
12 # of the GNU General Public License Version 3, as described below:
14 # This file is free software: you may copy, redistribute and/or modify
15 # it under the terms of the GNU General Public License as published by the
16 # Free Software Foundation, either version 3 of the License, or (at your
17 # option) any later version.
19 # This file is distributed in the hope that it will be useful, but
20 # WITHOUT ANY WARRANTY; without even the implied warranty of
21 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
22 # Public License for more details.
24 # You should have received a copy of the GNU General Public License
25 # along with this program. If not, see http://www.gnu.org/licenses/.
27 require 'fileutils'
28 require 'stringio'
30 require_relative 'compiler'
32 class Stamper
33     def initialize(settings_file, stamp_file)
34         @settings_file = settings_file
35         @stamp_file = stamp_file
36         @stamp_dir = File.dirname(@stamp_file)
37         @compiler = Compiler.new
38     end
40     def stamp
41         buf = StringIO.new
42         buf << "CFLAGS = " << ENV["CFLAGS"] << "\n"
43         buf << "TARGET = " << ENV["TARGET"] << "\n"
44         buf << "CONFIG = " << hash_config() << "\n"
46         stamp = buf.string
48         old_stamp = nil
49         if File.file?(@stamp_file)
50             old_stamp = File.open(@stamp_file, 'rb') { |f| f.read }
51         end
52         if old_stamp != stamp
53             File.open(@stamp_file, 'w') {|f| f.write(stamp)}
54         end
55     end
57     def hash_config
58         buf = StringIO.new
59         ["target.h", "platform.h", "cstddef"].each do |h|
60             buf << "#include \"#{h}\"\n"
61         end
62         FileUtils.mkdir_p @stamp_dir
63         input = File.join(@stamp_dir, "stamp.cpp")
64         File.open(input, 'w') {|file| file.write(buf.string)}
65         output = File.join(@stamp_dir, "stamp")
66         stdout, stderr = @compiler.run(input, output, ["-dM", "-E"])
67         File.delete(input)
68         if File.file?(output)
69             File.delete(output)
70         end
71         return Digest::SHA1.hexdigest(stdout)
72     end
73 end
75 def usage
76     puts "Usage: ruby #{__FILE__} <settings_file> <stamp_file>"
77 end
79 if __FILE__ == $0
81     settings_file = ARGV[0]
82     stamp_file = ARGV[1]
83     if settings_file.nil? || stamp_file.nil?
84         usage()
85         exit(1)
86     end
88     stamper = Stamper.new(settings_file, stamp_file)
89     stamper.stamp()
90 end