software_smithy 1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. data/README.rdoc +114 -0
  2. data/bin/smithy +586 -0
  3. data/etc/completion/smithy-completion.bash +266 -0
  4. data/etc/completion/zsh/_smithy +130 -0
  5. data/etc/smithyrc +36 -0
  6. data/etc/templates/build/.owners +1 -0
  7. data/etc/templates/build/build-notes +0 -0
  8. data/etc/templates/build/dependencies +0 -0
  9. data/etc/templates/build/rebuild +13 -0
  10. data/etc/templates/build/relink +2 -0
  11. data/etc/templates/build/remodule.erb +21 -0
  12. data/etc/templates/build/retest +6 -0
  13. data/etc/templates/build/status +0 -0
  14. data/etc/templates/modulefile.erb +30 -0
  15. data/etc/templates/package/.check4newver +2 -0
  16. data/etc/templates/package/.exceptions +3 -0
  17. data/etc/templates/package/description +18 -0
  18. data/etc/templates/package/description.markdown +17 -0
  19. data/etc/templates/package/support +1 -0
  20. data/etc/templates/package/versions +3 -0
  21. data/etc/templates/web/all.html.erb +19 -0
  22. data/etc/templates/web/alphabetical.html.erb +12 -0
  23. data/etc/templates/web/category.html.erb +74 -0
  24. data/etc/templates/web/machine_version_table.html.erb +35 -0
  25. data/etc/templates/web/package.html.erb +53 -0
  26. data/etc/templates/web/version_list.html.erb +7 -0
  27. data/etc/templates/web/version_table.html.erb +24 -0
  28. data/lib/smithy/config.rb +167 -0
  29. data/lib/smithy/description.rb +276 -0
  30. data/lib/smithy/file_operations.rb +234 -0
  31. data/lib/smithy/format.rb +134 -0
  32. data/lib/smithy/helpers.rb +159 -0
  33. data/lib/smithy/module_file.rb +224 -0
  34. data/lib/smithy/package.rb +647 -0
  35. data/lib/smithy.rb +45 -0
  36. data/lib/smithy_version.rb +40 -0
  37. data/man/man1/smithy.1 +262 -0
  38. data/smithy.rdoc +281 -0
  39. metadata +230 -0
@@ -0,0 +1,224 @@
1
+ # Smithy is freely available under the terms of the BSD license given below. {{{
2
+ #
3
+ # Copyright (c) 2012. UT-BATTELLE, LLC. All rights reserved.
4
+ #
5
+ # Produced by the National Center for Computational Sciences at Oak Ridge
6
+ # National Laboratory. Smithy is a based on SWTools, more information on SWTools
7
+ # can be found at: http://www.olcf.ornl.gov/center-projects/swtools/
8
+ #
9
+ # This product includes software produced by UT-Battelle, LLC under Contract No.
10
+ # DE-AC05-00OR22725 with the Department of Energy.
11
+ #
12
+ # Redistribution and use in source and binary forms, with or without
13
+ # modification, are permitted provided that the following conditions are met:
14
+ #
15
+ # - Redistributions of source code must retain the above copyright notice, this
16
+ # list of conditions and the following disclaimer.
17
+ #
18
+ # - Redistributions in binary form must reproduce the above copyright notice, this
19
+ # list of conditions and the following disclaimer in the documentation and/or
20
+ # other materials provided with the distribution.
21
+ #
22
+ # - Neither the name of the UT-BATTELLE nor the names of its contributors may
23
+ # be used to endorse or promote products derived from this software without
24
+ # specific prior written permission.
25
+ #
26
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
27
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
29
+ # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
30
+ # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31
+ # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
32
+ # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
33
+ # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
34
+ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35
+ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36
+ # }}}
37
+
38
+ module Smithy
39
+ class ModuleFile
40
+ attr_accessor :package, :builds
41
+
42
+ PackageModulePathName = "modulefile"
43
+ SystemModulePathName = "modulefiles"
44
+
45
+ Environments = [
46
+ {:prg_env => "PrgEnv-gnu", :compiler_name => "gcc", :human_name => "gnu", :regex => /(gnu|gcc)(.*)/,
47
+ :build_name_regex => /(gnu|gcc)([\d\.]+)/ },
48
+ {:prg_env => "PrgEnv-pgi", :compiler_name => "pgi", :human_name => "pgi", :regex => /(pgi)(.*)/,
49
+ :build_name_regex => /(pgi)([\d\.]+)/ },
50
+ {:prg_env => "PrgEnv-intel", :compiler_name => "intel", :human_name => "intel", :regex => /(intel)(.*)/,
51
+ :build_name_regex => /(intel)([\d\.]+)/ },
52
+ {:prg_env => "PrgEnv-cray", :compiler_name => "cce", :human_name => "cray", :regex => /(cce|cray)(.*)/,
53
+ :build_name_regex => /(cce|cray)([\d\.]+)/ }
54
+ ]
55
+ #{:prg_env => "PrgEnv-pathscale", :compiler_name => "pathscale", :human_name => "pathscale", :regex => /(pathscale)(.*)/}
56
+
57
+ def initialize(args = {})
58
+ @package = args[:package]
59
+ @builds = @package.alternate_builds
60
+ end
61
+
62
+ def get_binding
63
+ binding
64
+ end
65
+
66
+ def module_path
67
+ File.join(package.version_directory, PackageModulePathName)
68
+ end
69
+
70
+ def module_file
71
+ File.join(module_path, package.name, package.version)
72
+ end
73
+
74
+ def system_module_path
75
+ File.join(package.software_root, SystemModulePathName)
76
+ end
77
+
78
+ def system_module_file
79
+ File.join(system_module_path, package.name, package.version)
80
+ end
81
+
82
+ def create(args = {})
83
+ notice "Creating Modulefile for #{package.prefix}"
84
+ notice_warn "Dry Run! (no files will be created or changed)" if args[:dry_run]
85
+
86
+ options = {:noop => false, :verbose => false}
87
+ options[:noop] = true if args[:dry_run]
88
+
89
+ FileUtils.mkdir_p(File.join(module_path, package.name), options)
90
+
91
+ FileOperations.render_erb :destination => module_file,
92
+ :erb => File.join(@@smithy_bin_root, "/etc/templates/modulefile.erb"),
93
+ :binding => get_binding, :options => options
94
+
95
+ FileOperations.make_group_writable(module_path, options.merge(:recursive => true))
96
+ FileOperations.set_group(module_path, package.group, options.merge(:recursive => true))
97
+ end
98
+
99
+ def deploy(args = {})
100
+ options = {:noop => false, :verbose => false}
101
+ options[:noop] = true if args[:dry_run]
102
+
103
+ g = system_module_path+"/*#{package.name}*/*#{package.version}*"
104
+ module_matches = Dir.glob(g)
105
+ if module_matches.size > 1
106
+ notice_warn "Warning - multiple existing modulefiles found:"
107
+ puts module_matches
108
+ end
109
+
110
+ if module_matches.empty?
111
+ destination = system_module_file
112
+ else
113
+ destination = module_matches.first
114
+ end
115
+
116
+ notice "Deploying modulefile #{destination}"
117
+ install_dir = File.join(system_module_path, package.name)
118
+ FileOperations.make_directory install_dir, options
119
+ FileOperations.install_file module_file, destination, options
120
+ FileOperations.make_group_writable(install_dir, options.merge(:recursive => true))
121
+ FileOperations.set_group(install_dir, package.group, options.merge(:recursive => true))
122
+ end
123
+
124
+ def module_build_list(package, builds, args = {})
125
+ output = ""
126
+ notice "Multiple Builds Found"
127
+ notice_info "Build Name".rjust(25)+" Required Modules"
128
+ Environments.each_with_index do |e,i|
129
+ if i == 0
130
+ output << "if "
131
+ else
132
+ output << "} elseif "
133
+ end
134
+ output << "[ is-loaded #{e[:prg_env]} ] {\n"
135
+ if j=builds.index{|b|b=~e[:regex]}
136
+ sub_builds = builds.select{|b|b=~e[:regex]}
137
+ if sub_builds.size > 1
138
+ sub_builds.each_with_index do |b,k|
139
+ b =~ e[:build_name_regex]
140
+ name = e[:compiler_name]
141
+ version = $2
142
+ if k == 0
143
+ output << " if "
144
+ else
145
+ output << " } elseif "
146
+ end
147
+ output << "[ is-loaded #{name}/#{version} ] {\n"
148
+ output << " set BUILD #{b}\n"
149
+ notice_info b.rjust(25) + " #{e[:prg_env]} + #{name}/#{version}"
150
+ end
151
+ output << " } else {\n"
152
+ output << " set BUILD #{sub_builds.last}\n"
153
+ output << " }\n"
154
+ else
155
+ output << " set BUILD #{builds[j]}\n"
156
+ notice_info builds[j].rjust(25) + " #{e[:prg_env]}"
157
+ end
158
+ else
159
+ output << " puts stderr \"Not implemented for the #{e[:human_name]} compiler\"\n"
160
+ end
161
+ end
162
+
163
+ output << "}\n"
164
+ output << "if {![info exists BUILD]} {\n"
165
+ output << " puts stderr \"[module-info name] is only available for the following environments:\"\n"
166
+ builds.each do |build|
167
+ output << " puts stderr \"#{build}\"\n"
168
+ end
169
+ output << " break\n}\n"
170
+
171
+ return output
172
+ end
173
+
174
+ def self.get_module_names(options = {})
175
+ if options[:only]
176
+ module_dirs = options[:only].split(':')
177
+ raise "No module directories could be found" if module_dirs.empty?
178
+ else
179
+ raise "$MODULEPATH is not set" unless ENV.has_key?('MODULEPATH')
180
+ module_dirs = ENV['MODULEPATH'].split(':')
181
+ raise "$MODULEPATH is empty" if module_dirs.empty?
182
+ end
183
+
184
+ system_module_names = []
185
+ system_module_defaults = []
186
+ if options[:except]
187
+ module_dirs.delete_if{|p| options[:except].split(":").include?(p)}
188
+ end
189
+ module_dirs.each do |p|
190
+ module_files = Dir.glob(p+"/*/*").sort
191
+ module_files_defaults = module_files.dup
192
+ version_files = Dir.glob(p+"/*/.version").sort
193
+
194
+ version_files.each do |version_file|
195
+ module_name = File.basename(File.dirname(version_file))
196
+ file_content = ""
197
+ File.open(version_file).readlines.each { |line| file_content << line.chomp }
198
+
199
+ if file_content =~ /ModulesVersion "(.*?)"/
200
+ version = $1
201
+ module_files_defaults.collect! do |m|
202
+ if m =~ /#{module_name}\/#{version}$/
203
+ m+"(default)"
204
+ else
205
+ m
206
+ end
207
+ end
208
+ end
209
+
210
+ end
211
+
212
+ module_files.collect!{|s| s.gsub(p+"/", '')}
213
+ system_module_names += module_files
214
+ system_module_defaults += module_files_defaults
215
+ end
216
+
217
+ # desired_modules = %w{ ^cce ^pgi ^intel ^gcc ^hdf5 ^netcdf ^fftw ^petsc ^trilinos ^chapel ^java ^ntk ^papi ^stat ^gdb ^perftools ^tpsl ^ga\/ ^libsci_acc ^acml }
218
+ # stub_packages = system_module_names.select{|m| m =~ /(#{desired_modules.join('|')})/}
219
+
220
+ return system_module_names, system_module_defaults
221
+ end
222
+
223
+ end
224
+ end