#!/usr/bin/env ruby require 'mkmf' # This list is checked in reverse order, so this order allows mkmf on my Mac # to find BDB installed via Homebrew (/usr/local) before system installs %w[/usr / /usr/local /usr/local/db* /usr/local/BerkeleyDB*].each do |pdir| Dir[pdir].each do |dir| dir_config('db', "#{dir}/include", "#{dir}/lib") end end # MacPorts installs the directories "inside-out" compared to the structure expected above macports_db_versions = Dir["/opt/local/include/db*"].map { |dir| /\d\d$/.match(dir)[0] } macports_db_versions.each do |version| dir_config('db', "/opt/local/include/db#{version}", "/opt/local/lib/db#{version}") end %w(db-5.1 db-5.0 db-4.9 db-4.8 db-4.7 db-4.6 db-4.5 db-4.4 db-4.3 db-4.2).each do |ver| have_library ver, 'db_version', 'db.h' end def create_header if File.exist?("bdb_aux._c") message("Not writing bdb_aux._c (defines), already exists\n") return end message("Writing bdb_aux._c (defines), this takes a while\n") db_header = $CPPFLAGS.split.select { |f| f =~ /^-I/ }.map { |e| f = File.join(e[2..-1], 'db.h') File.exists?(f) ? f : nil }.select { |e| e }.first n=0 defines=[] File.open(db_header) {|fd| File.open("bdb_aux._c","w") {|hd| hd.puts("/* This file automatically generated by extconf.rb */\n") fd.each_line {|l| if l =~ %r{^#define\s+(DBC?_\w*)\s+([^\/]*)\s*(.*?)(\/\*.*)?$} name = $1 value = $2 if macro_defined?(name,"#include ") case value when /^"/ hd.print(%Q{cs(mBdb,%s);\n}%[name]) when /^\(?(0x|\d)/ hd.print(%Q{cu(mBdb,%s);\n}%[name]) when /^\(?-/ hd.print(%Q{ci(mBdb,%s);\n}%[name]) else $stderr.puts "don't know how to handle #{name} #{value.strip}, guessing UINT" hd.print(%Q{cu(mBdb,%s);\n}%[name]) end n+=1 end end } } message("\nwrote #{n} defines\n") } end create_header create_makefile('bdb')