|
4 | 4 |
|
5 | 5 | srcdir = File.join(__dir__, "..") |
6 | 6 | $INCFLAGS << " -I#{srcdir}" |
7 | | - |
8 | 7 | $CPPFLAGS << " -DBUILDING_MODULAR_GC" |
9 | 8 |
|
10 | 9 | append_cflags("-fPIC") |
11 | 10 |
|
| 11 | +DTRACE_RULES = <<~MAKE |
| 12 | +
|
| 13 | + probes.stamp: $(GC_DTRACE_OBJS) |
| 14 | + $(Q) if test -f $@ -o -f $(GC_DTRACE_OBJ); then \ |
| 15 | + $(RM) $(GC_DTRACE_OBJS) $@; \ |
| 16 | + $(ECHO) rebuilding objects which were modified by "dtrace -G"; \ |
| 17 | + $(MAKE) $(GC_DTRACE_OBJS); \ |
| 18 | + fi |
| 19 | + $(Q) touch $@ |
| 20 | +
|
| 21 | + $(GC_DTRACE_OBJ): $(top_srcdir)/probes.d $(GC_DTRACE_REBUILD:yes=probes.stamp) |
| 22 | + $(ECHO) processing GC probes in object files |
| 23 | + $(Q) CC="$(CC)" CFLAGS="$(CFLAGS) $(INCFLAGS) $(CPPFLAGS)" $(GC_DTRACE) -G -C $(INCFLAGS) -s $(top_srcdir)/probes.d -o $@ $(GC_DTRACE_OBJS) |
| 24 | +MAKE |
| 25 | + |
12 | 26 | def create_gc_makefile(name, &block) |
13 | | - create_makefile("librubygc.#{name}", &block) |
| 27 | + dtrace_obj = ENV.fetch("DTRACE_OBJ", "") |
| 28 | + dtrace_enabled = (name == "default" && !dtrace_obj.empty?) |
| 29 | + |
| 30 | + if name == "default" |
| 31 | + $INCFLAGS << " -I$(topdir)" |
| 32 | + $headers << "$(topdir)/probes.h" |
| 33 | + $cleanfiles << "probes.stamp" |
| 34 | + end |
| 35 | + |
| 36 | + create_makefile("librubygc.#{name}") do |conf| |
| 37 | + conf = block.call(conf) if block |
| 38 | + next conf unless dtrace_enabled |
| 39 | + |
| 40 | + gc_objs = $objs.join(" ") |
| 41 | + conf = Array(conf).join.sub(/^OBJS = .*$/, "OBJS = #{gc_objs} #{dtrace_obj}") |
| 42 | + conf + <<~MAKE |
| 43 | +
|
| 44 | + \tGC_DTRACE = #{ENV.fetch("DTRACE")} |
| 45 | + \tGC_DTRACE_OBJ = #{dtrace_obj} |
| 46 | + \tGC_DTRACE_OBJS = #{gc_objs} |
| 47 | + \tGC_DTRACE_REBUILD = #{ENV.fetch("DTRACE_REBUILD", "")} |
| 48 | + MAKE |
| 49 | + end |
| 50 | + |
| 51 | + File.write("Makefile", DTRACE_RULES, mode: "ab") if dtrace_enabled |
14 | 52 | end |
0 commit comments