lib/autobuild/packages/cmake.rb in autobuild-1.17.0 vs lib/autobuild/packages/cmake.rb in autobuild-1.18.0

- old
+ new

@@ -7,14 +7,22 @@ end # Handler class to build CMake-based packages class CMake < Configurable class << self - def builddir; @builddir || Configurable.builddir end + def builddir + @builddir || Configurable.builddir + end + def builddir=(new) - raise ConfigException, "absolute builddirs are not supported" if (Pathname.new(new).absolute?) - raise ConfigException, "builddir must be non-nil and non-empty" if (new.nil? || new.empty?) + if Pathname.new(new).absolute? + raise ConfigException, "absolute builddirs are not supported" + end + if new.nil? || new.empty? + raise ConfigException, "builddir must be non-nil and non-empty" + end + @builddir = new end attr_writer :full_reconfigures def full_reconfigures? @@ -65,23 +73,21 @@ end # If true, always run cmake before make during the build attr_accessor :always_reconfigure # If true, we always remove the CMake cache before reconfiguring. - # + # # See #full_reconfigures? for more details attr_writer :full_reconfigures # Sets a generator explicitely for this component. See #generator and # CMake.generator attr_writer :generator # The CMake generator to use. You must choose one that generates # Makefiles. If not set for this package explicitely, it is using the # global value CMake.generator. def generator - if @generator then @generator - else CMake.generator - end + @generator || CMake.generator end # If true, we always remove the CMake cache before reconfiguring. This # is to workaround the aggressive caching behaviour of CMake, and is set # to true by default. @@ -94,28 +100,32 @@ else @full_reconfigures end end - def cmake_cache; File.join(builddir, "CMakeCache.txt") end - def configurestamp; cmake_cache end + def cmake_cache + File.join(builddir, "CMakeCache.txt") + end + def configurestamp + cmake_cache + end + def initialize(options) @defines = Hash.new super - @delete_obsolete_files_in_prefix = self.class.delete_obsolete_files_in_prefix? + @delete_obsolete_files_in_prefix = self.class. + delete_obsolete_files_in_prefix? end # (see CMake.delete_obsolete_files_in_prefix?) def delete_obsolete_files_in_prefix? @delete_obsolete_files_in_prefix end # (see CMake.delete_obsolete_files_in_prefix=) - def delete_obsolete_files_in_prefix=(flag) - @delete_obsolete_files_in_prefix = flag - end + attr_writer :delete_obsolete_files_in_prefix @@defines = Hash.new def self.defines @@defines @@ -130,11 +140,10 @@ else 'OFF' end end - def define(name, value) @defines[name] = if value.respond_to?(:to_str) value.to_str elsif value @@ -143,16 +152,16 @@ 'OFF' end end DOXYGEN_ACCEPTED_VARIABLES = { - '@CMAKE_SOURCE_DIR@' => lambda { |pkg| pkg.srcdir }, - '@PROJECT_SOURCE_DIR@' => lambda { |pkg| pkg.srcdir }, - '@CMAKE_BINARY_DIR@' => lambda { |pkg| pkg.builddir }, - '@PROJECT_BINARY_DIR@' => lambda { |pkg| pkg.builddir }, - '@PROJECT_NAME@' => lambda { |pkg| pkg.name } - } + '@CMAKE_SOURCE_DIR@' => ->(pkg) { pkg.srcdir }, + '@PROJECT_SOURCE_DIR@' => ->(pkg) { pkg.srcdir }, + '@CMAKE_BINARY_DIR@' => ->(pkg) { pkg.builddir }, + '@PROJECT_BINARY_DIR@' => ->(pkg) { pkg.builddir }, + '@PROJECT_NAME@' => ->(pkg) { pkg.name } + }.freeze class << self # Flag controlling whether autobuild should run doxygen itself or # use the "doc" target generated by CMake # @@ -195,11 +204,11 @@ # # See also CMake.always_use_doc_target= and CMake.always_use_doc_target? # for a global control of that feature def always_use_doc_target? if @always_use_doc_target.nil? - return CMake.always_use_doc_target? + CMake.always_use_doc_target? else @always_use_doc_target end end @@ -213,21 +222,18 @@ # #always_use_doc_target= # # This method returns true if the package can use the internal doxygen # mode and false otherwise def internal_doxygen_mode? - if always_use_doc_target? - return false - end + return false if always_use_doc_target? doxyfile_in = File.join(srcdir, "Doxyfile.in") - if !File.file?(doxyfile_in) - return false - end + return false unless File.file?(doxyfile_in) + File.readlines(doxyfile_in).each do |line| matches = line.scan(/@[^@]+@/) - if matches.any? { |str| !DOXYGEN_ACCEPTED_VARIABLES.has_key?(str) } + if matches.any? { |str| !DOXYGEN_ACCEPTED_VARIABLES.key?(str) } return false end end end @@ -243,15 +249,18 @@ # This method generates the corresponding doxygen file in # <builddir>/Doxygen and runs doxygen. It raises if the internal doxygen # support cannot be used on this package def run_doxygen doxyfile_in = File.join(srcdir, "Doxyfile.in") - if !File.file?(doxyfile_in) - raise RuntimeError, "no Doxyfile.in in this package, cannot use the internal doxygen support" + unless File.file?(doxyfile_in) + raise "no Doxyfile.in in this package, "\ + "cannot use the internal doxygen support" end doxyfile_data = File.readlines(doxyfile_in).map do |line| - line.gsub(/@[^@]+@/) { |match| DOXYGEN_ACCEPTED_VARIABLES[match].call(self) } + line.gsub(/@[^@]+@/) do |match| + DOXYGEN_ACCEPTED_VARIABLES[match].call(self) + end end doxyfile = File.join(builddir, "Doxyfile") File.open(doxyfile, 'w') do |io| io.write(doxyfile_data) end @@ -294,11 +303,11 @@ CMAKE_EQVS = { 'ON' => 'ON', 'YES' => 'ON', 'OFF' => 'OFF', 'NO' => 'OFF' - } + }.freeze def equivalent_option_value?(old, new) if old == new true else old = CMAKE_EQVS[old] @@ -329,11 +338,11 @@ result = Array.new raw = (dependencies.map { |pkg_name| Autobuild::Package[pkg_name].prefix } + CMake.prefix_path) raw.each do |path| - if !seen.include?(path) + unless seen.include?(path) seen << path result << path end end result @@ -346,21 +355,24 @@ end end def defines_changed?(all_defines, cache_data) all_defines.any? do |name, value| - if match = /^#{name}:\w+=(.*)$/.match(cache_data) + if (match = /^#{name}:\w+=(.*)$/.match(cache_data)) old_value = match[1] end value = value.to_s if !old_value || !equivalent_option_value?(old_value, value) if Autobuild.debug - message "%s: option '#{name}' changed value: '#{old_value}' => '#{value}'" + message "%s: option '#{name}' changed value: "\ + "'#{old_value}' => '#{value}'" end + if old_value - message "%s: changed value of #{name} from #{old_value} to #{value}" + message "%s: changed value of #{name} "\ + "from #{old_value} to #{value}" else message "%s: setting value of #{name} to #{value}" end true @@ -371,12 +383,12 @@ def prepare # A failed initial CMake configuration leaves a CMakeCache.txt file, # but no Makefile. # # Delete the CMakeCache to force reconfiguration - if !File.exist?( File.join(builddir, 'Makefile') ) - FileUtils.rm_f cmake_cache + unless File.exist?(File.join(builddir, 'Makefile')) + FileUtils.rm_f(cmake_cache) end doc_utility.source_ref_dir = builddir if File.exist?(cmake_cache) @@ -394,33 +406,31 @@ # Configure the builddir directory before starting make def configure super do in_dir(builddir) do - if !File.file?(File.join(srcdir, 'CMakeLists.txt')) - raise ConfigException.new(self, 'configure'), "#{srcdir} contains no CMakeLists.txt file" + unless File.file?(File.join(srcdir, 'CMakeLists.txt')) + raise ConfigException.new(self, 'configure'), + "#{srcdir} contains no CMakeLists.txt file" end - command = [ "cmake" ] + command = ["cmake"] if Autobuild.windows? - command << '-G' + command << '-G' command << "MSYS Makefiles" end all_defines.each do |name, value| command << "-D#{name}=#{value}" end - if generator - command << Array(generator).map { |g| "-G#{g}" } - end + command << Array(generator).map { |g| "-G#{g}" } if generator command << srcdir - - progress_start "configuring CMake for %s", :done_message => "configured CMake for %s" do - if full_reconfigures? - FileUtils.rm_f cmake_cache - end + + progress_start "configuring CMake for %s", + done_message: "configured CMake for %s" do + FileUtils.rm_f cmake_cache if full_reconfigures? run('configure', *command) end end end end @@ -430,13 +440,11 @@ @show_make_messages else CMake.show_make_messages? end end - def show_make_messages=(value) - @show_make_messages = value - end + attr_writer :show_make_messages def self.show_make_messages? @show_make_messages end @@ -444,11 +452,11 @@ @show_make_messages = value end # Do the build in builddir def build - current_message = String.new + current_message = +"" in_dir(builddir) do progress_start "building %s" do if always_reconfigure || !File.file?('Makefile') run('build', Autobuild.tool(:cmake), '.') end @@ -457,13 +465,11 @@ Autobuild.make_subcommand(self, 'build') do |line| needs_display = false if line =~ /\[\s*(\d+)%\]/ progress "building %s (#{Integer($1)}%)" elsif line !~ /^(?:Generating|Linking|Scanning|Building|Built)/ - if line =~ /warning/ - warning_count += 1 - end + warning_count += 1 if line =~ /warning/ if show_make_messages? current_message += line + "\n" needs_display = true end end @@ -476,11 +482,12 @@ end current_message.split("\n").each do |l| message "%s: #{l}", :magenta end if warning_count > 0 - progress_done "built %s #{Autoproj.color("(#{warning_count} warnings)", :bold)}" + msg_warning = Autoproj.color("(#{warning_count} warnings)", :bold) + progress_done "built %s #{msg_warning}" else progress_done "built %s" end end end @@ -496,17 +503,16 @@ # # If {#delete_obsolete_files_in_prefix?} is set, files that are present # in the prefix but not in CMake's install manifest will be removed. def install in_dir(builddir) do - progress_start "installing %s", :done_message => 'installed %s' do - run('install', Autobuild.tool(:make), "-j#{parallel_build_level}", 'install') + progress_start "installing %s", done_message: 'installed %s' do + run('install', Autobuild.tool(:make), + "-j#{parallel_build_level}", 'install') end - if delete_obsolete_files_in_prefix? - delete_obsolete_files - end + delete_obsolete_files if delete_obsolete_files_in_prefix? end super end # @api private @@ -518,11 +524,12 @@ # per-package with {#delete_obsolete_files_in_prefix=}. Do NOT enable if packages # share the same prefix. def delete_obsolete_files # The expand_path is required to sanitize the paths, which can # contain e.g. double // - manifest_contents = File.readlines(File.join(builddir, 'install_manifest.txt')). + cmake_install_manifest = File.join(builddir, 'install_manifest.txt') + manifest_contents = File.readlines(cmake_install_manifest). map { |p| File.expand_path(p.chomp) }.to_set logdir = self.logdir counter = 0 Find.find(prefix) do |path| Find.prune if path == logdir @@ -535,6 +542,5 @@ message "%s: removed #{counter} obsolete files from prefix (cmake)" end end end end -