bin/stmkmf.rb
author Jan Vrany <jan.vrany@labware.com>
Tue, 23 Jun 2020 12:16:02 +0100
changeset 294 0f3980335d2b
parent 257 c6a3ceed613c
child 334 eb15c224410b
permissions -rwxr-xr-x
CI: do not archive (and publish) i686 versions any more 32bit Intel is phasing out already - Microsoft is dropping i686 Windows 10, many Linux distros are dropping i686 architecture too. We still build and test 32bit versions, but no longer archive it nor publish it to save space and bandwidth. We might make it available again upon request.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
134
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     1
#!/usr/bin/env ruby
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     2
DOCUMENTATION = <<DOCEND
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     3
Generates a `Makefile` for compiling a Smalltalk/X class library. 
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     4
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     5
DOCEND
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     6
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     7
#
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     8
# Generates a makefile for a Smalltalk/X package. Return status code
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     9
# (0 means success)
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    10
def stmkmf(cwd: '.', out: 'makefile', top: nil)   
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    11
  if not File.exist? cwd then
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    12
    STDERR.puts "error: no such directory: #{cwd}"
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    13
    return 1
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    14
  end
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    15
  if not File.directory? cwd then
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    16
    STDERR.puts "error: not a directory: #{cwd}"
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    17
    return 2
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    18
  end
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    19
  if not File.exist? File.join(cwd, 'Make.proto') then
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    20
    STDERR.puts "error: could not find Make.proto: #{File.join(cwd, 'Make.proto')}"    
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    21
    return 3
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    22
  end
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    23
  if top.nil? then 
135
0325651d2b43 Makefiles: use our own makefiles rather than eXept's
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 134
diff changeset
    24
    # Spuriously it happens the `Make.proto` is somehow corrupted and not properly
0325651d2b43 Makefiles: use our own makefiles rather than eXept's
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 134
diff changeset
    25
    # UTF8 encoded. This would result in error like
0325651d2b43 Makefiles: use our own makefiles rather than eXept's
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 134
diff changeset
    26
    #
0325651d2b43 Makefiles: use our own makefiles rather than eXept's
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 134
diff changeset
    27
    #    `match': invalid byte sequence in UTF-8 (ArgumentError)
0325651d2b43 Makefiles: use our own makefiles rather than eXept's
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 134
diff changeset
    28
    #
0325651d2b43 Makefiles: use our own makefiles rather than eXept's
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 134
diff changeset
    29
    # To prevent, replace all invalid character by $?. Not a safest
0325651d2b43 Makefiles: use our own makefiles rather than eXept's
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 134
diff changeset
    30
    # approach, though.
0325651d2b43 Makefiles: use our own makefiles rather than eXept's
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 134
diff changeset
    31
    make_proto_contents = File.read(File.join(cwd, 'Make.proto')).encode("UTF-8", :invalid=>:replace, :replace=>"?").encode('UTF-8')
0325651d2b43 Makefiles: use our own makefiles rather than eXept's
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 134
diff changeset
    32
    match = /^TOP=(.*)$/.match(make_proto_contents)
0325651d2b43 Makefiles: use our own makefiles rather than eXept's
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 134
diff changeset
    33
    if match.nil? then
215
b62a3ec9be82 Makefiles: trim trailing whitespaces from TOP in `stmkmf.rb`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 136
diff changeset
    34
      STDERR.puts "error: could not extract TOP from Make.proto (missing TOP=.. definition?)"    
134
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    35
      return 4
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    36
    end
215
b62a3ec9be82 Makefiles: trim trailing whitespaces from TOP in `stmkmf.rb`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 136
diff changeset
    37
    top = match[1].rstrip()
134
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    38
  end
257
c6a3ceed613c `stmkmf`: fix incorrect `TOP` test when using `-C / `--cd`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 237
diff changeset
    39
  if not File.directory? File.join(cwd, top) then
215
b62a3ec9be82 Makefiles: trim trailing whitespaces from TOP in `stmkmf.rb`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 136
diff changeset
    40
    require 'pry'
b62a3ec9be82 Makefiles: trim trailing whitespaces from TOP in `stmkmf.rb`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 136
diff changeset
    41
    require 'pry-byebug'
b62a3ec9be82 Makefiles: trim trailing whitespaces from TOP in `stmkmf.rb`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 136
diff changeset
    42
    binding.pry
b62a3ec9be82 Makefiles: trim trailing whitespaces from TOP in `stmkmf.rb`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 136
diff changeset
    43
    STDERR.puts "error: TOP does not exist or not a directory: #{top}"    
134
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    44
    return 5
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    45
  end
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    46
  makelib = File.join(cwd, top, '..', '..' , 'makelib')
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    47
  if not File.exist? makelib then
215
b62a3ec9be82 Makefiles: trim trailing whitespaces from TOP in `stmkmf.rb`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 136
diff changeset
    48
    STDERR.puts "error: makefile include library does not exist or not a directory: #{makelib}"
134
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    49
    return 6
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    50
  end
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    51
  File.open(File.join(cwd, out), "w") do | f |
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    52
    f.puts <<-CONTENTS
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    53
#  
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    54
# Do not edit! Automatically generated by stmkmf.
135
0325651d2b43 Makefiles: use our own makefiles rather than eXept's
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 134
diff changeset
    55
#
0325651d2b43 Makefiles: use our own makefiles rather than eXept's
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 134
diff changeset
    56
0325651d2b43 Makefiles: use our own makefiles rather than eXept's
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 134
diff changeset
    57
MAKELIB ?= #{top}/../../makelib
0325651d2b43 Makefiles: use our own makefiles rather than eXept's
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 134
diff changeset
    58
136
29bd0a3c4a31 Makefiles: configure Smalltalk/X by defining TARGET rather then symlinking a file
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 135
diff changeset
    59
include $(MAKELIB)/definitions.make
134
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    60
237
69ab924b97bf Rakefiles: fixes to make it working on SWING build slaves
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 215
diff changeset
    61
#{File.exists?(File.join(cwd, 'Make.spec')) ? 'include Make.spec' : ''}
134
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    62
include Make.proto
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    63
136
29bd0a3c4a31 Makefiles: configure Smalltalk/X by defining TARGET rather then symlinking a file
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 135
diff changeset
    64
include $(MAKELIB)/rules.make
134
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    65
CONTENTS
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    66
  end
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    67
  return 0
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    68
end
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    69
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    70
if __FILE__ == $0
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    71
  require 'optparse'
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    72
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    73
  cwd = '.'
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    74
  out = 'makefile'
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    75
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    76
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    77
  optparser = OptionParser.new do | optparser |
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    78
    optparser.banner = "Usage: stmkmf.rb [options] [stx-top-directory]"
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    79
    optparser.on('-C', '--cd DIRECTORY', "Generates makefile in DIRECTORY. Optional, default is current working cwd.") do | value |
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    80
      cwd = value
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    81
    end
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    82
    optparser.on('-o', '--out FILE', "Write result to FILE. Optional, default is 'makefile'") do | value |
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    83
      out = value
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    84
    end    
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    85
    optparser.on(nil, '--help', "Prints this message") do
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    86
      puts DOCUMENTATION
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    87
      puts optparser.help()
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    88
      exit 0
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    89
    end
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    90
  end
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    91
  optparser.parse!
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    92
  top = ARGV[0] || nil
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    93
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    94
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    95
  exit stmkmf(cwd: cwd, out: out, top: top)
78f8c3f3390d Makefiles: Added our own implementation of `stmkmf`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    96
end