Class: RBT::PostInstall

Inherits:
CompileBase show all
Defined in:
lib/rbt/utility_scripts/post_install.rb

Overview

RBT::PostInstall

Constant Summary

Constants included from CompileBaseModule

CompileBaseModule::FILE_AUTOGEN

Constants inherited from LeanPrototype

LeanPrototype::ALL_COLOUR_METHODS, LeanPrototype::ARRAY_KDE_KONSOLE_COLOURS_IN_USE, LeanPrototype::DAY_NAMES, LeanPrototype::NAMESPACE, LeanPrototype::SILENT_REDIRECTION

Instance Method Summary collapse

Methods included from CompileBaseModule

#always_show_dependencies?, #capitalize_program_names?, #cflags?, #check_whether_we_will_install_only_programs_from_the_bin_subdirectory, #cleanup_system_tag_directory, #config?, #consider_removing_libtool_la_files, #consider_symlinking_cmake_modules, #consider_symlinking_header_files_into_the_usr_include_hierarchy, #consider_symlinking_lib64_into_lib, #cookbook_dataset_autosymlink_lib64?, #cookbook_dataset_program_version?, #create_a_new_current_symlink_here, #create_architecture_file, #do_invoke_symlink_program, #do_play_song, #editor_to_use?, #email?, #exit_on_unregistered_cookbook_entries?, #has_an_error_occurred?, #host_cpu?, #install_only_binaries?, #installer_constant?, make_command?, #no_error_has_occurred?, #play_song?, #recipes_dir?, #register_program, #remove_compiling_is_in_progress, #report_to_developers, #reset_the_module, #return_build_type, #return_chained_programs, #return_files_from_the_profiles_directory, #return_these_programs, #run_ldconfig?, #shall_we_symlink_the_header_files_into_the_usr_include_hierarchy?, #store_full_configure_command_into_resources_directory, #symlink_into_tags, #symlink_into_usr_lib_dir?, #symlink_m4_macros, #symlink_program, #symlink_program?, #update_kde_apps, #use_ccache?, #use_gobolinux_symlinkprogram?, #use_mrxvt?, #use_porg?, #use_stow?, #use_tags?, #validate_the_cookbook_aliases

Methods inherited from Base

#cat, #cd_back_to_the_current_working_directory, #consider_reporting_how_many_programs_are_registered, #cookbook_files?, #copy_recursively, #delete_code_of_conduct?, #determine_appdir_prefix_from_this_input, #directory_validation?, #do_not_show_names, #fast_return_file_size_of_this_program, #file_last_symlinked_program?, #file_programs_version_url, #gem_version, #is_a_64bit_system?, #is_ccache_available?, #is_porg_available?, #is_this_binary_registered?, #is_this_program_included?, #make_command?, #make_install_command?, #new_cookbook_instance_for, #program_exists?, #publish_list_of_all_programs_version, #rcp, registered_binaries?, #remove_symlink, #rename_kde_konsole_tab, #repackage, #report_n_programs, #report_working_directory, #return_compile_time_statistics, #return_n_random_characters, #return_version_of_this_program, #run_make_then_make_install, #sanitize_url1_entry, #set_source_directory, #show_overview_over_available_utility_scripts, #symlink_all_files_from_this_directory_to_that_directory, #system_tags?, #upload_list_of_all_programs_version, #use_yaml_database_for_tags?, #warn_and_exit, #wget

Methods inherited from LeanPrototype

#a_or_an?, #abbreviations?, #absolute_path, #action, #add_to_the_commandline_arguments, #all_binaries?, #all_files_from, #all_libraries?, #allowed_cookbook_entries?, #appdir_location_of?, #append_onto_the_internal_hash, #append_what_into, #archive_type_of?, #available_programs?, #be_quiet?, #be_verbose?, #begins_with_a_comment?, #capitalize_first_alphabetical_character, #cd_to_the_log_directory, #cd_to_the_temp_directory, #change_directory, #change_permission, #cheering_person?, #chmod, #chop_off_archive, #clear_commandline_arguments, #cliner, #coloured_and_padded_e, #coloured_and_padded_esystem, #coloured_esystem, #colourize_directory_for_system_results, #colourize_this_error, #colourize_this_file_path, #colourize_this_warning, #commandline_arguments?, #commandline_arguments_without_hyphens?, #comment, #convert_dd_mm_yyyy_to_its_long_variant, #convert_env_variable, #copy_directory, #copy_files, #cpr, #create_directory, #current_hour?, #dd_mmm_yyy, #debug, #debug?, #directory_expanded_cookbooks?, #disable_colours, #display_md5sum?, #do_not_debug, #does_the_cookbook_include_this_program?, #does_this_expanded_cookbook_file_exist_for_this_program?, #does_this_file_exist?, #does_this_file_exist_and_is_it_a_file?, #e, #eblue, #ecomment, #ecrimson, #edir, #editor?, #efancy, #eimp, #enable_colours, #enable_debug, #ensure_main_encoding_for, #eparse, #esystem, #esystem_gold, #etomato, #ewarn, #exit_program, #expanded_cookbooks_directory_exists?, #extract_this_archive, #extract_to?, #file_compiled_programs?, #file_dirname_retaining_trailing_slash, #file_predefined_installation_instructions?, #file_specification_of_registered_cookbook_entries, #find_cookbook_alias_for, #find_this_yaml_file, #first_argument?, #first_non_hyphen_argument?, #get_all_directories_from, #get_all_files_from, #get_all_programs, #get_date, #get_extended_date, #get_files_and_directories_from, #go_to_base_dir, #home_dir?, #host_system?, #infer_the_namespace, #internal_hash?, #internal_hash_set_commandline_arguments, #is_an_archive?, #is_directory?, #is_file?, #is_github_url?, #is_make_available?, #is_meson_installed?, #is_on_gobolinux?, #is_on_windows?, #is_roebe?, #is_superuser?, #is_symlink?, #is_this_a_header?, #is_this_a_library?, #is_this_program_included?, #iso_encoding?, #load_dataset_from_this_expanded_cookbook, #load_yaml, #load_yaml_file_from_the_cookbook_directory_for_this_program, #log_directory?, #main_encoding?, #meson_build_file_exists?, #months?, #move_file, #n_programs_are_available?, #n_programs_available?, #namespace?, #no_directory_exists_at, #no_directory_was_found_at, #no_opn, #no_such_file_exists, #open_in_browser, #open_in_editor, #opncomment, #opne, #opnef, #opnerev, #opnerror, #opnesystem, #opnewarn, #opnfancy, #opnn, #otomato, #packages_directory?, #path_to_this_expanded_cookbooks_dataset, #pkgconfig_directory?, #populate_the_internal_hash_with_default_values, #predefined_installation_instructions?, #prepend_this_commandline_argument, #program_version_of?, #project_base_directory?, #project_yaml_directory?, #query_path?, #rarrow?, #read_file, #read_file_in_default_encoding, #read_file_with_default_encoding, #readlines, #readlines_with_proper_encoding, #register_sigint, #registered_cookbook_entries?, #remove, #remove_archive_from_the_end, #remove_comments_from_each_line, #remove_directory, #remove_double_slashes, #remove_file, #remove_newlines, #remove_parens, #remove_symlink, #remove_the_first_commandline_argument, #remove_this_commandline_argument, #remove_this_entry_from_the_commandline_arguments, #remove_trailing_ANSII_escape_code, #remove_unnecessary_data_from_url, #rename, #report_pwd, #require_the_rbt_aliases, #reset_the_internal_hash, #return_all_archives_from_this_directory, #return_appdir_prefix, #return_commandline_arguments_with_leading_hyphens, #return_current_hour_minutes_second, #return_date, #return_day_of_the_month_based_on_utc, #return_full_time, #return_hours_minutes_seconds_based_on_utc, #return_location_to_this_programs_yaml_file, #return_month_based_on_this_number, #return_month_based_on_utc, #return_opnn, #return_program_name, #return_program_name_for_gobolinux_systems, #return_program_name_via_program_information, #return_pwd, #return_unicode_warning_symbol_or_empty_string, #return_utc, #return_utc_time_in_a_format_similar_to_slackware, #return_weekday_based_on_utc, #return_year_based_on_utc, #rev, #rpn, #run_simulation=, #run_simulation?, #sdir, #sdir_return_pwd, #set_be_silent, #set_be_verbose, #set_first_commandline_argument, #set_namespace, #set_use_colours, #set_use_opn, #set_xorg_buffer, #sfancy, #sfile, #silent_redirection?, #silently_create_this_directory_if_it_does_not_yet_exist, #simp, #source_base_directory?, #ssym, #stderr, #store_into_this_directory?, #string_right_arrow?, #swarn, #symlink, #sysbin_directory?, #sysetc_directory?, #sysinclude_directory?, #syslib_directory?, #sysshare_directory?, #system_directory?, #temp_directory?, #to_bool, #to_camelcase, #to_iso_encoding, #to_unicode, #today?, #touch, #try_to_require_beautiful_url, #try_to_require_the_environment_information_gem, #try_to_require_the_extracter_gem, #try_to_require_the_open_gem, #try_to_require_the_xorg_buffer, #try_to_require_wget, #try_to_return_a_special_compile_component, #unicode_cliner, #unicode_middle_cliner, #use_colours=, #use_colours?, #use_opn=, #use_opn?, #utf_encoding?, #verbose_truth, #word_wrap, #write_what_into, #write_what_into_via_unicode, #yes_or_no

Constructor Details

#initialize(use_this_dataset = nil, run_already = true) ⇒ PostInstall

#

initialize

The first argument must be our dataset, which shall be of class Cookbooks::Cookbook.

#


33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/rbt/utility_scripts/post_install.rb', line 33

def initialize(
    use_this_dataset = nil,
    run_already      = true
  )
  reset
  set_dataset(
    use_this_dataset
  )
  # ======================================================================= #
  # === Handle blocks next
  # ======================================================================= #
  if block_given?
    yielded = yield
    if yielded.is_a? Hash
      # =================================================================== #
      # === :use_this_compile_prefix
      # =================================================================== #
      if yielded.has_key? :use_this_compile_prefix
        set_compile_prefix(
          yielded.delete(:use_this_compile_prefix)
        )
      end
    end
  end
  run if run_already
end

Instance Method Details

#compile_prefix?Boolean

#

compile_prefix?

#

Returns:

  • (Boolean)


87
88
89
# File 'lib/rbt/utility_scripts/post_install.rb', line 87

def compile_prefix?
  @compile_prefix.to_s
end

#create_pkgconfig_fileObject

#

create_pkgconfig_file

This method will delegate towards creating a new .pc file.

#


167
168
169
170
171
172
173
174
# File 'lib/rbt/utility_scripts/post_install.rb', line 167

def create_pkgconfig_file
  RBT::CreatePkgconfigFile.new(
    pkgconfig_filename: pkgconfig_filename?,
    prefix: prefix?,
    version: program_version?,
    description: short_desc?
  )
end

#dataset?Boolean

#

dataset?

#

Returns:

  • (Boolean)


122
123
124
# File 'lib/rbt/utility_scripts/post_install.rb', line 122

def dataset?
  @dataset
end

#pkgconfig_filename?Boolean

#

pkgconfig_filename?

#

Returns:

  • (Boolean)


179
180
181
182
183
184
185
186
187
# File 'lib/rbt/utility_scripts/post_install.rb', line 179

def pkgconfig_filename?
  program_name = short_program_name?
  if program_name.start_with? 'lib' # .pc files do not usually have the lib part.
    program_name.sub!(/^lib/,'')
  end
  _ = rds("#{prefix?}/lib/pkgconfig/#{program_name}")
  _ << '.pc' unless _.end_with? '.pc'
  _ # ← Return that result here.
end

#postinstall?Boolean

#

postinstall?

#

Returns:

  • (Boolean)


144
145
146
# File 'lib/rbt/utility_scripts/post_install.rb', line 144

def postinstall?
  dataset?.postinstall?
end

#prefix?Boolean

#

prefix?

#

Returns:

  • (Boolean)


192
193
194
# File 'lib/rbt/utility_scripts/post_install.rb', line 192

def prefix?
  dataset?.prefix?
end

#program_name?Boolean

#

program_name?

#

Returns:

  • (Boolean)


158
159
160
# File 'lib/rbt/utility_scripts/post_install.rb', line 158

def program_name?
  dataset?.program_name?
end

#program_version?Boolean

#

program_version?

#

Returns:

  • (Boolean)


151
152
153
# File 'lib/rbt/utility_scripts/post_install.rb', line 151

def program_version?
  dataset?.program_version?
end

#resetObject

#

reset

#


63
64
65
66
67
68
69
70
# File 'lib/rbt/utility_scripts/post_install.rb', line 63

def reset
  super()
  infer_the_namespace
  # ======================================================================= #
  # === @compile_prefix
  # ======================================================================= #
  @compile_prefix = nil # This prefix is initially nil.
end

#runObject

#

run

#


208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
# File 'lib/rbt/utility_scripts/post_install.rb', line 208

def run
  show_header
  # ======================================================================= #
  # We will split on ',' entries.
  # ======================================================================= #
  dataset = postinstall?
  dataset = dataset.split(',') if dataset.is_a? String
  dataset.each { |post_install|
    # ===================================================================== #
    # === Big post-install sanitizer code block
    #
    # Keep in mind that the variable post_install is now a String, ideally.
    # A typically example for this may be the String
    # "symlink_this_binary vte-2.91 vte".
    # ===================================================================== #
    next if post_install.to_s.empty? # Skip empty entries.
    post_install = post_install.dup # Work on a copy here.
    post_install = rds(post_install).strip
    opne sfancy('Contemplating postinstall-action in `')+
         sdir_return_pwd+
         sfancy('` with')
    # ===================================================================== #
    # Use another colour next.
    # ===================================================================== #
    opne lightblue("  #{post_install}")
    opnfancy 'next.'
    # ===================================================================== #
    # Next, we have to split up the line based on ' ', so that we can
    # determine which action ought to be applied.
    # ===================================================================== #
    splitted = post_install.split(' ').map(&:strip).map {|entry|
      convert_env_variable(entry)
    }
    work_on_this_action = splitted.first
    first_argument      = splitted[1]
    second_argument     = splitted[2]
    third_argument      = splitted[3]
    fourth_argument     = splitted[4]
    # ===================================================================== #
    # Next, we work on the commands given in the postinstall entry.
    # The following variable will contain entry points such as
    # "symlink_this_binary".
    # ===================================================================== #
    case work_on_this_action # case tag
    # ===================================================================== #
    # === symlink_program
    # ===================================================================== #
    when /^symlink(_|-)?program/
      symlink_program(
        post_install.sub(/^post_install/,'').
                     sub(/^symlink_program/,'').rstrip
      )
    # ===================================================================== #
    # === create_program
    # ===================================================================== #
    when /^create_program/
      require 'rbt/requires/require_actions.rb'
      RBT.action(:create_appdir_skeleton, first_argument)
    # ===================================================================== #
    # === create_directory
    #
    # This entry point is for creating a directory.
    # ===================================================================== #
    when 'create_directory',
         /mkdir/
      _ = splitted[1].to_s.dup
      if _.include?('APPDIR_INSTALLATION_PREFIX') and uses_appdir_prefix?
        _.sub!(
          /APPDIR_INSTALLATION_PREFIX/,
          prefix?
        )
        _ = rds(_)
      end
      create_directory(_)
    # ===================================================================== #
    # === install
    #
    # This handles "install" steps, such as for the program called
    # ninja. We just run esystem() on this. We could also use ruby
    # to do what it does instead, but using esystem() for now
    # seems simpler.
    # ===================================================================== #
    when /^install$/
      esystem(post_install)
    # ===================================================================== #
    # === symlink_binary
    #
    # This handles both "symlink_binary" and "symlink_this_binary"
    # cases. The latter is simply an "alias" to the former. An example
    # for a .yml file making use of this is the file called 'vte.yml'.
    # ===================================================================== #
    when /^symlink(_|-)?binary$/,
         /^symlink(_|-)?this(_|-)?binary$/
      _ = "#{prefix?}bin/"
      symlink(_+first_argument,_+splitted[2])
    # ===================================================================== #
    # === ln
    #
    # This entry is the general symlink-entry.
    # ===================================================================== #
    when 'ln',
         'symlink' # run symlink here, but handle it internally.
      splitted.delete_at(1) if splitted[1] == '-s'
      splitted.delete_at(1) if splitted[1] == '-v'
      first_argument  = splitted[-1]
      second_argument = splitted[-2]
      if File.exist?(second_argument)
        if first_argument.include?(programs_directory?) and
          !appdir_prefix?
          opne crimson('Can not symlink into ')+sfancy(first_argument)+crimson(' as this program')
          opne crimson('is not compiled via an AppDir prefix.')
        else
          if @compile_prefix and !@compile_prefix.include?(programs_directory?)
            opne crimson('Can not symlink into an AppDir path, as the prefix in use is')
            opne crimson('`')+sfancy(@compile_prefix)+crimson('`.')
          else
            symlink(second_argument, first_argument)
          end
        end
      else
        opne "Can not symlink towards #{sfancy(second_argument)}"\
             " as it does not exist."
      end
    # ===================================================================== #
    # === copy_files
    # ===================================================================== #
    when 'copy_files'
      # =================================================================== #
      # This entry point can involve some more complicated instructions.
      # =================================================================== #
      if (first_argument == '{') and # In this case we assume the user wants to batch-copy some files.
         (third_argument == '}')
        target_dir = fourth_argument
        second_argument_splitted = second_argument.split(',')
        second_argument_splitted.each {|this_file|
          new_target = ("#{target_dir}/#{this_file}").squeeze('/')
          ftype = File.ftype(this_file)
          case ftype
          when 'directory'
            copy_directory(this_file, new_target, :be_verbose)
          when 'file'
            copy_file(this_file, new_target, :be_verbose)
          end
        }
      end
    # ===================================================================== #
    # === copy_file
    # ===================================================================== #
    when 'copy_file'
      copy_file(splitted[1], splitted[2])
    # ===================================================================== #
    # === create_pkgconfig_file
    # ===================================================================== #
    when /^create(_|-)?pkgconfig(_|-)?file$/
      create_pkgconfig_file
    # ===================================================================== #
    # === patch_pkgconfig_file
    # ===================================================================== #
    when /^-?-?patch(_|-)?pkgconfig(_|-)?file:?$/
      opne 'Now patching the version in the pkg-config file '\
           'for that program.'
      new_version = splitted.last
      # =================================================================== #
      # Currently, the path is hardcoded.
      # =================================================================== #
      use_this_as_pkgconfig_file = Dir[
        "/usr/lib/pkgconfig/*#{program?}*.pc"
      ].first
      # =================================================================== #
      # Now we can delegate to class RBT::FixPkgconfigFile.
      # =================================================================== #
      RBT::FixPkgconfigFile.new(
        {
          use_this_pkgconfig_file:     use_this_as_pkgconfig_file,
          use_this_as_the_new_version: new_version
        }
      )
    # ===================================================================== #
    # === add_user
    # ===================================================================== #
    when /^add_?user$/
      AddUser.new(splitted[1]) if Object.const_defined? :AddUser
    # ===================================================================== #
    # === make
    # ===================================================================== #
    when /^make$/
      esystem(post_install)
    # when 'install' # Install actions are handled by the else clause below.
    else # else, simply run through esystem().
      if is_on_roebe?
        opne tomato('Debug: the following use case is not handled.')
        opne tomato(work_on_this_action)
      end
      cliner
      esystem(post_install)
      cliner
    end
  }
  cliner
end

#set_compile_prefix(i) ⇒ Object

#

set_compile_prefix

The compile_prefix is the one that is used by RBT::Compile, e. g. /usr/ prefix usually or an AppDir prefix. The reason why this class here may need to know about it, is because some actions depend on this - such as postinstall-action involving symlinks.

#


80
81
82
# File 'lib/rbt/utility_scripts/post_install.rb', line 80

def set_compile_prefix(i)
  @compile_prefix = i
end

#set_dataset(i = nil) ⇒ Object

#

set_dataset

#


94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/rbt/utility_scripts/post_install.rb', line 94

def set_dataset(
    i = nil
  )
  i = i.first if i.is_a? Array
  # ======================================================================= #
  # Next handle nils.
  # ======================================================================= #
  if i.nil?
    if return_pwd.include? programs_dir?
      # =================================================================== #
      # Ok, input can be such as "/Programs/Gcc/5.2.0". Let's work on that.
      # =================================================================== #
      i = return_pwd.split('/').reject(&:empty?)[1].downcase
    end
  end
  if i.is_a? String # postinstall gcc
    # ===================================================================== #
    # We must turn it into an instance of RBT::Cookbooks::SanitizeCookbook
    # here.
    # ===================================================================== #
    i = action(:SanitizeCookbook, i) { :fast }
  end
  @dataset = i
end

#short_desc?Boolean

#

short_desc?

#

Returns:

  • (Boolean)


137
138
139
# File 'lib/rbt/utility_scripts/post_install.rb', line 137

def short_desc?
  dataset?.short_desc?
end

#short_name?Boolean Also known as: program?, short_program_name?

#

short_name?

#

Returns:

  • (Boolean)


129
130
131
# File 'lib/rbt/utility_scripts/post_install.rb', line 129

def short_name?
  dataset?.short_name?
end

#show_headerObject

#

show_header

#


412
413
414
415
# File 'lib/rbt/utility_scripts/post_install.rb', line 412

def show_header
  cliner
  opnfancy 'Starting postinstall instructions next.'
end

#use_appdir_prefix?Boolean Also known as: uses_appdir_prefix?, appdir_prefix?, is_appdir?

#

use_appdir_prefix?

#

Returns:

  • (Boolean)


199
200
201
# File 'lib/rbt/utility_scripts/post_install.rb', line 199

def use_appdir_prefix?
  prefix?.include?(programs_dir?)
end