3
# Copyright (C) 2002,2003,2004,2005,2006,2007,2008,2009 Free Software Foundation, Inc.
5
# This genmk.rb is free software; the author
6
# gives unlimited permission to copy and/or distribute it,
7
# with or without modifications, as long as this notice is preserved.
9
# This program is distributed in the hope that it will be useful,
10
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
11
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
15
def collect_with_index
17
self.each_with_index do |item, index|
18
ret.push(yield(item, index))
26
self.gsub(/[^a-zA-Z0-9_@]/, '_')
30
self.sub(/\.[^\.]*$/, '') + '.' + str
34
self.sub(/\.[^\.]*$/, '').to_var + '.o'
39
def initialize(dir, name)
44
attr_reader :dir, :name
49
exe = @name.suffix('exec')
50
objs = sources.collect do |src|
51
raise "unknown source file `#{src}'" if /\.[cS]$/ !~ src
52
prefix + '-' + src.to_obj
54
objs_str = objs.join(' ')
55
deps = objs.collect {|obj| obj.suffix('d')}
56
deps_str = deps.join(' ')
59
clean-image-#{@name}.#{@rule_count}:
60
rm -f #{@name} #{exe} #{objs_str}
62
CLEAN_IMAGE_TARGETS += clean-image-#{@name}.#{@rule_count}
64
mostlyclean-image-#{@name}.#{@rule_count}:
67
MOSTLYCLEAN_IMAGE_TARGETS += mostlyclean-image-#{@name}.#{@rule_count}
69
ifneq ($(TARGET_APPLE_CC),1)
71
$(OBJCOPY) -O $(#{prefix}_FORMAT) --strip-unneeded -R .note -R .comment -R .note.gnu.build-id -R .reginfo -R .rel.dyn $< $@
73
ifneq (#{exe},kernel.exec)
74
#{@name}: #{exe} ./grub-macho2img
75
./grub-macho2img $< $@
77
#{@name}: #{exe} ./grub-macho2img
78
./grub-macho2img --bss $< $@
83
$(TARGET_CC) -o $@ $^ $(TARGET_LDFLAGS) $(#{prefix}_LDFLAGS)
85
" + objs.collect_with_index do |obj, i|
87
fake_obj = File.basename(src).suffix('o')
89
flag = if /\.c$/ =~ src then 'CFLAGS' else 'ASFLAGS' end
90
extra_flags = if /\.S$/ =~ src then '-DASM_FILE=1' else '' end
91
dir = File.dirname(src)
93
"#{obj}: #{src} $(#{src}_DEPENDENCIES)
94
$(TARGET_CC) -I#{dir} -I$(srcdir)/#{dir} $(TARGET_CPPFLAGS) #{extra_flags} $(TARGET_#{flag}) $(#{prefix}_#{flag}) -MD -c -o $@ $<
102
# Use PModule instead Module, to avoid name conflicting.
104
def initialize(dir, name)
109
attr_reader :dir, :name
112
prefix = @name.to_var
114
objs = sources.collect do |src|
115
raise "unknown source file `#{src}'" if /\.[cS]$/ !~ src
116
prefix + '-' + src.to_obj
118
objs_str = objs.join(' ')
119
deps = objs.collect {|obj| obj.suffix('d')}
120
deps_str = deps.join(' ')
121
pre_obj = 'pre-' + @name.suffix('o')
122
mod_src = 'mod-' + @name.suffix('c')
123
mod_obj = mod_src.suffix('o')
124
defsym = 'def-' + @name.suffix('lst')
125
undsym = 'und-' + @name.suffix('lst')
126
mod_name = File.basename(@name, '.mod')
127
symbolic_name = mod_name.sub(/\.[^\.]*$/, '')
130
clean-module-#{@name}.#{@rule_count}:
131
rm -f #{@name} #{mod_obj} #{mod_src} #{pre_obj} #{objs_str} #{undsym}
133
CLEAN_MODULE_TARGETS += clean-module-#{@name}.#{@rule_count}
135
clean-module-#{@name}-symbol.#{@rule_count}:
138
CLEAN_MODULE_TARGETS += clean-module-#{@name}-symbol.#{@rule_count}
139
DEFSYMFILES += #{defsym}
140
mostlyclean-module-#{@name}.#{@rule_count}:
143
MOSTLYCLEAN_MODULE_TARGETS += mostlyclean-module-#{@name}.#{@rule_count}
144
UNDSYMFILES += #{undsym}
146
ifneq ($(TARGET_APPLE_CC),1)
147
#{@name}: #{pre_obj} #{mod_obj} $(TARGET_OBJ2ELF)
149
$(TARGET_CC) $(#{prefix}_LDFLAGS) $(TARGET_LDFLAGS) -Wl,-r,-d -o $@ #{pre_obj} #{mod_obj}
150
if test ! -z \"$(TARGET_OBJ2ELF)\"; then ./$(TARGET_OBJ2ELF) $@ || (rm -f $@; exit 1); fi
151
$(STRIP) --strip-unneeded -K grub_mod_init -K grub_mod_fini -K _grub_mod_init -K _grub_mod_fini -R .note -R .comment $@
153
#{@name}: #{pre_obj} #{mod_obj} $(TARGET_OBJ2ELF)
156
$(TARGET_CC) $(#{prefix}_LDFLAGS) $(TARGET_LDFLAGS) -Wl,-r,-d -o $@.bin #{pre_obj} #{mod_obj}
157
$(OBJCONV) -f$(TARGET_MODULE_FORMAT) -nr:_grub_mod_init:grub_mod_init -nr:_grub_mod_fini:grub_mod_fini -wd1106 -nu -nd $@.bin $@
161
#{pre_obj}: $(#{prefix}_DEPENDENCIES) #{objs_str}
163
$(TARGET_CC) $(#{prefix}_LDFLAGS) $(TARGET_LDFLAGS) -Wl,-r,-d -o $@ #{objs_str}
165
#{mod_obj}: #{mod_src}
166
$(TARGET_CC) $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) $(#{prefix}_CFLAGS) -c -o $@ $<
168
#{mod_src}: $(builddir)/moddep.lst $(srcdir)/genmodsrc.sh
169
sh $(srcdir)/genmodsrc.sh '#{mod_name}' $< > $@ || (rm -f $@; exit 1)
171
ifneq ($(TARGET_APPLE_CC),1)
172
#{defsym}: #{pre_obj}
173
$(NM) -g --defined-only -P -p $< | sed 's/^\\([^ ]*\\).*/\\1 #{mod_name}/' > $@
175
#{defsym}: #{pre_obj}
176
$(NM) -g -P -p $< | grep -E '^[a-zA-Z0-9_]* [TDS]' | sed 's/^\\([^ ]*\\).*/\\1 #{mod_name}/' > $@
179
#{undsym}: #{pre_obj}
180
echo '#{mod_name}' > $@
181
$(NM) -u -P -p $< | cut -f1 -d' ' >> $@
183
" + objs.collect_with_index do |obj, i|
185
fake_obj = File.basename(src).suffix('o')
186
extra_target = obj.sub(/\.[^\.]*$/, '') + '-extra'
187
command = 'cmd-' + obj.suffix('lst')
188
fs = 'fs-' + obj.suffix('lst')
189
partmap = 'partmap-' + obj.suffix('lst')
190
handler = 'handler-' + obj.suffix('lst')
191
terminal = 'terminal-' + obj.suffix('lst')
192
parttool = 'parttool-' + obj.suffix('lst')
193
video = 'video-' + obj.suffix('lst')
195
flag = if /\.c$/ =~ src then 'CFLAGS' else 'ASFLAGS' end
196
extra_flags = if /\.S$/ =~ src then '-DASM_FILE=1' else '' end
197
dir = File.dirname(src)
199
"#{obj}: #{src} $(#{src}_DEPENDENCIES)
200
$(TARGET_CC) -I#{dir} -I$(srcdir)/#{dir} $(TARGET_CPPFLAGS) #{extra_flags} $(TARGET_#{flag}) $(#{prefix}_#{flag}) -MD -c -o $@ $<
203
clean-module-#{extra_target}.#{@rule_count}:
204
rm -f #{command} #{fs} #{partmap} #{handler} #{parttool} #{video}
206
CLEAN_MODULE_TARGETS += clean-module-#{extra_target}.#{@rule_count}
208
COMMANDFILES += #{command}
210
PARTTOOLFILES += #{parttool}
211
PARTMAPFILES += #{partmap}
212
HANDLERFILES += #{handler}
213
TERMINALFILES += #{terminal}
214
VIDEOFILES += #{video}
216
#{command}: #{src} $(#{src}_DEPENDENCIES) gencmdlist.sh
218
$(TARGET_CC) -I#{dir} -I$(srcdir)/#{dir} $(TARGET_CPPFLAGS) #{extra_flags} $(TARGET_#{flag}) $(#{prefix}_#{flag}) -E $< \
219
| sh $(srcdir)/gencmdlist.sh #{symbolic_name} > $@ || (rm -f $@; exit 1)
221
#{fs}: #{src} $(#{src}_DEPENDENCIES) genfslist.sh
223
$(TARGET_CC) -I#{dir} -I$(srcdir)/#{dir} $(TARGET_CPPFLAGS) #{extra_flags} $(TARGET_#{flag}) $(#{prefix}_#{flag}) -E $< \
224
| sh $(srcdir)/genfslist.sh #{symbolic_name} > $@ || (rm -f $@; exit 1)
226
#{parttool}: #{src} $(#{src}_DEPENDENCIES) genparttoollist.sh
228
$(TARGET_CC) -I#{dir} -I$(srcdir)/#{dir} $(TARGET_CPPFLAGS) #{extra_flags} $(TARGET_#{flag}) $(#{prefix}_#{flag}) -E $< \
229
| sh $(srcdir)/genparttoollist.sh #{symbolic_name} > $@ || (rm -f $@; exit 1)
231
#{partmap}: #{src} $(#{src}_DEPENDENCIES) genpartmaplist.sh
233
$(TARGET_CC) -I#{dir} -I$(srcdir)/#{dir} $(TARGET_CPPFLAGS) #{extra_flags} $(TARGET_#{flag}) $(#{prefix}_#{flag}) -E $< \
234
| sh $(srcdir)/genpartmaplist.sh #{symbolic_name} > $@ || (rm -f $@; exit 1)
236
#{handler}: #{src} $(#{src}_DEPENDENCIES) genhandlerlist.sh
238
$(TARGET_CC) -I#{dir} -I$(srcdir)/#{dir} $(TARGET_CPPFLAGS) #{extra_flags} $(TARGET_#{flag}) $(#{prefix}_#{flag}) -E $< \
239
| sh $(srcdir)/genhandlerlist.sh #{symbolic_name} > $@ || (rm -f $@; exit 1)
241
#{terminal}: #{src} $(#{src}_DEPENDENCIES) genterminallist.sh
243
$(TARGET_CC) -I#{dir} -I$(srcdir)/#{dir} $(TARGET_CPPFLAGS) #{extra_flags} $(TARGET_#{flag}) $(#{prefix}_#{flag}) -E $< \
244
| sh $(srcdir)/genterminallist.sh #{symbolic_name} > $@ || (rm -f $@; exit 1)
246
#{video}: #{src} $(#{src}_DEPENDENCIES) genvideolist.sh
248
$(TARGET_CC) -I#{dir} -I$(srcdir)/#{dir} $(TARGET_CPPFLAGS) #{extra_flags} $(TARGET_#{flag}) $(#{prefix}_#{flag}) -E $< \
249
| sh $(srcdir)/genvideolist.sh #{symbolic_name} > $@ || (rm -f $@; exit 1)
257
def initialize(dir, name)
263
prefix = @name.to_var
264
print "#{@name}: $(#{prefix}_DEPENDENCIES) $(#{prefix}_OBJECTS)
265
$(CC) -o $@ $(#{prefix}_OBJECTS) $(LDFLAGS) $(#{prefix}_LDFLAGS)
269
attr_reader :dir, :name
272
prefix = @name.to_var
274
objs = sources.collect do |src|
275
raise "unknown source file `#{src}'" if /\.[cS]$/ !~ src
276
prefix + '-' + src.to_obj
278
objs_str = objs.join(' ');
279
deps = objs.collect {|obj| obj.suffix('d')}
280
deps_str = deps.join(' ');
283
clean-utility-#{@name}.#{@rule_count}:
284
rm -f #{@name}$(EXEEXT) #{objs_str}
286
CLEAN_UTILITY_TARGETS += clean-utility-#{@name}.#{@rule_count}
288
mostlyclean-utility-#{@name}.#{@rule_count}:
291
MOSTLYCLEAN_UTILITY_TARGETS += mostlyclean-utility-#{@name}.#{@rule_count}
293
#{prefix}_OBJECTS += #{objs_str}
295
" + objs.collect_with_index do |obj, i|
297
fake_obj = File.basename(src).suffix('o')
299
dir = File.dirname(src)
301
"#{obj}: #{src} $(#{src}_DEPENDENCIES)
302
$(CC) -I#{dir} -I$(srcdir)/#{dir} $(CPPFLAGS) $(CFLAGS) -DGRUB_UTIL=1 $(#{prefix}_CFLAGS) -MD -c -o $@ $<
311
def initialize(dir, name)
315
attr_reader :dir, :name
318
prefix = @name.to_var
319
objs = sources.collect do |src|
320
raise "unknown source file `#{src}'" if /\.[cS]$/ !~ src
321
prefix + '-' + src.to_obj
323
objs_str = objs.join(' ');
324
deps = objs.collect {|obj| obj.suffix('d')}
325
deps_str = deps.join(' ');
327
"CLEANFILES += #{@name} #{objs_str}
328
MOSTLYCLEANFILES += #{deps_str}
330
ifeq ($(#{prefix}_RELOCATABLE),yes)
331
#{@name}: $(#{prefix}_DEPENDENCIES) #{objs_str}
332
$(TARGET_CC) -Wl,-r,-d -o $@ #{objs_str} $(TARGET_LDFLAGS) $(#{prefix}_LDFLAGS)
333
$(STRIP) --strip-unneeded -K start -R .note -R .comment $@
335
#{@name}: $(#{prefix}_DEPENDENCIES) #{objs_str}
336
$(TARGET_CC) -o $@ #{objs_str} $(TARGET_LDFLAGS) $(#{prefix}_LDFLAGS)
337
$(STRIP) -R .rel.dyn -R .reginfo -R .note -R .comment $@
340
" + objs.collect_with_index do |obj, i|
342
fake_obj = File.basename(src).suffix('o')
344
flag = if /\.c$/ =~ src then 'CFLAGS' else 'ASFLAGS' end
345
extra_flags = if /\.S$/ =~ src then '-DASM_FILE=1' else '' end
346
dir = File.dirname(src)
348
"#{obj}: #{src} $(#{src}_DEPENDENCIES)
349
$(TARGET_CC) -I#{dir} -I$(srcdir)/#{dir} $(TARGET_CPPFLAGS) #{extra_flags} $(TARGET_#{flag}) $(#{prefix}_#{flag}) -MD -c -o $@ $<
359
def initialize(dir, name)
363
attr_reader :dir, :name
366
if sources.length != 1
367
raise "only a single source file must be specified for a script"
371
raise "unknown source file `#{src}'"
374
"CLEANFILES += #{@name}
376
#{@name}: #{src} $(#{src}_DEPENDENCIES) config.status
377
./config.status --file=-:#{src} | sed -e 's,@pkglib_DATA@,$(pkglib_DATA),g' > $@
392
print "# Generated by genmk.rb, please don't edit!\n"
406
str.gsub!(/\\\n/, ' ')
408
if /^([a-zA-Z0-9_]+)\s*\+?=\s*(.*?)\s*$/ =~ str
411
if var =~ /^([a-zA-Z0-9_]+)_([A-Z]+)$/
412
prefix, type = $1, $2
416
images += args.split(/\s+/).collect do |img|
417
Image.new(prefix, img)
421
pmodules += args.split(/\s+/).collect do |pmod|
422
PModule.new(prefix, pmod)
426
utils += args.split(/\s+/).collect do |util|
427
Utility.new(prefix, util)
431
programs += args.split(/\s+/).collect do |prog|
432
Program.new(prefix, prog)
436
scripts += args.split(/\s+/).collect do |script|
437
Script.new(prefix, script)
441
if img = images.detect() {|i| i.name.to_var == prefix}
442
print img.rule(args.split(/\s+/))
443
elsif pmod = pmodules.detect() {|m| m.name.to_var == prefix}
444
print pmod.rule(args.split(/\s+/))
445
elsif util = utils.detect() {|u| u.name.to_var == prefix}
446
print util.rule(args.split(/\s+/))
447
elsif program = programs.detect() {|u| u.name.to_var == prefix}
448
print program.rule(args.split(/\s+/))
449
elsif script = scripts.detect() {|s| s.name.to_var == prefix}
450
print script.rule(args.split(/\s+/))
460
utils.each {|util| util.print_tail()}