ruby/enc/depend
Nobuyoshi Nakada 7d4461e162
[Misc #22206] Generate dependencies without compiler builds
Replace `tool/update-deps` with a Ruby source scanner so dependency
updates no longer require GNU make, a configured build, or compiler
preprocessor output.

Keep compact source mappings and scanner declarations in dependency
files, and expand complete rules into the build directory.  Avoid the
temporary fixture headers required by the compiler-driven prototype.

Use the generated rules from GNU make, BSD make, and NMake builds.
Support out-of-tree and read-only source trees, and retain expanded
dependencies shipped in release archives when baseruby is unavailable.
2026-07-23 00:04:47 +09:00

248 lines
9.1 KiB
Plaintext

# mkdepend: scan enc/jis/props.h => enc/jis/props.h.blt
% inplace = File.identical?($top_srcdir, ".")
% workdirs = %w"$(ENCSODIR) $(TRANSSODIR) enc enc/trans"
% CONFIG["WORKDIRS"] = workdirs.join(' ')
% enable_shared = CONFIG['ENABLE_SHARED'] == 'yes'
% deffile = (true if /\$\(DEFFILE\)/ =~ CONFIG["LINK_SO"])
% dependencies = ENCS + TRANS
% cleanlibs = Shellwords.shellwords(CONFIG["cleanlibs"] || "")
% cleanobjs = Shellwords.shellwords(CONFIG["cleanobjs"] || "")
% cleanobjs << "$*.def" if deffile
% rule_subst = CONFIG["RULE_SUBST"] || "%s"
% transvpath = rule_subst.dup.sub!(/\{[^{}]+\}/, '$(TRANSVPATH)/') || "enc/trans/%s"
% transvpath_prefix = (rule_subst.dup.sub!(/\{[^{}]+\}/, '{$(TRANSVPATH)}') || "%s") % ""
% CONFIG['ARFLAGS'] = 'rcu ' if (CONFIG['ARFLAGS'] || "").empty?
% CONFIG['RANLIB'] = ':' if (CONFIG['RANLIB'] || "").empty?
% CONFIG['CPPFLAGS'] += " -DRUBY_EXPORT=1" if CONFIG["EXTSTATIC"] == "static"
% if File::ALT_SEPARATOR
% pathrep = proc {|path| path.gsub('/', File::ALT_SEPARATOR).gsub(/\$\(([@<?*]\w?|\w+)\)/, "$(\\1:/=\\#{File::ALT_SEPARATOR})")}
% else
% pathrep = proc {|path| path}
% end
% ignore_error = $ignore_error
VPATH = <%=%w[$(arch_hdrdir)/ruby $(hdrdir)/ruby $(srcdir) $(encsrcdir)].join(CONFIG["PATH_SEPARATOR"])%>
LIBPATH = <%=libpathflag($DEFLIBPATH)%>
LIBS = <%=
if enable_shared or RbConfig.expand(CONFIG["LIBRUBY"].dup) != RbConfig.expand(CONFIG["LIBRUBY_A"].dup)
CONFIG['LIBRUBYARG']
else
''
end %> <%=CONFIG['LIBS']%> $(EXTLIBS)
ENCOBJS =<%ENCS.map {|e|%> enc/<%=e%>.$(OBJEXT) \
<%}%> #
ENCSOS =<%ENCS.map {|e|%> $(ENCSODIR)/<%=e%>.$(DLEXT) \
<%}%> #
ENCCLEANLIBS = <%=cleanlibs.map {|clean|
clean.gsub(/\$\*(\.\w+)?/) {"$(ENCOBJS#{$1 ? ":.#{CONFIG["OBJEXT"]}=#{$1}" : ""})"}
.gsub(/\$\(\KTARGET_SO(?=[:\)])/) {"ENCSOS"}
}.join(" ")%>
ENCCLEANOBJS = <%=cleanobjs.map {|clean|
clean.gsub(/\$\*(\.\w+)?/) {"$(ENCOBJS#{$1 ? ":.#{CONFIG["OBJEXT"]}=#{$1}" : ""})"}
}.join(" ")%>
LIBENC=enc/libenc.$(LIBEXT)
TRANSVPATH = $(srcdir)/enc/trans
TRANSCSRCS =<%ATRANS.map {|e|%> <%=transvpath % "#{e}.c"%> \
<%}%> #
TRANSOBJS =<%TRANS.map {|e|%> enc/<%=e%>.$(OBJEXT) \
<%}%> #
TRANSSOS =<%TRANS.map {|e|%> $(ENCSODIR)/<%=e%>.$(DLEXT) \
<%}%> #
TRANSCLEANLIBS = <%=cleanlibs.map {|clean|
clean.gsub(/\$\*(\.\w+)?/) {"$(TRANSOBJS#{$1 ? ":.#{CONFIG["OBJEXT"]}=#{$1}" : ""})"}
.gsub(/\$\(\KTARGET_SO(?=[:\)])/) {"TRANSSOS"}
}.join(" ")%>
TRANSCLEANOBJS = <%=cleanobjs.map {|clean|
clean.gsub(/\$\*(\.\w+)?/) {"$(TRANSOBJS#{$1 ? ":.#{CONFIG["OBJEXT"]}=#{$1}" : ""})"}
}.join(" ")%>
LIBTRANS=enc/libtrans.$(LIBEXT)
UNICODE_HDR_DIR = --missing-unicode-header-dir--
encs all: <%= MODULE_TYPE == :static ? "lib" : "mod" %>encs
modencs: enc trans
libencs: libenc libtrans
enc: $(ENCSOS)
libenc: $(LIBENC)
trans: $(TRANSSOS)
libtrans: $(LIBTRANS)
$(LIBENC): $(ENCOBJS)
@$(RM) $@
$(ECHO) linking statically-linked encoding library $@
$(Q) $(AR) $(ARFLAGS)$@ $(ENCOBJS)
@-$(RANLIB) $@<%=ignore_error%>
$(LIBTRANS): $(TRANSOBJS)
@$(RM) $@
$(ECHO) linking statically-linked transcoder library $@
$(Q) $(AR) $(ARFLAGS)$@ $(TRANSOBJS)
@-$(RANLIB) $@<%=ignore_error%>
enc trans $(ENCSOS) $(TRANSSOS): config.status
srcs: $(TRANSCSRCS)
$(ENC_TRANS_D):
$(Q) $(MAKEDIRS) enc/trans
@exit > $@
$(ENC_TRANS_SO_D):
$(Q) $(MAKEDIRS) $(TRANSSODIR)
@exit > $@
$(ENCOBJS) $(TRANSOBJS): $(ENC_TRANS_D)
$(ENCSOS) $(TRANSSOS): $(ENC_TRANS_SO_D)
<%=transvpath_prefix%>.trans<%=transvpath_prefix%>.c:
$(ECHO) generating table from $@
$(Q)$(MINIRUBY) "$(tooldir)/transcode-tblgen.rb" -v$(V0:1=v)o "$@" "$<"
% unless ENCS.empty? or TRANS.empty?
% ENC_DEPS.each do |e, deps|
enc/<%=e%>.$(OBJEXT): <%=deps.map {|n| rule_subst % n}.join(' ')%>
% end
% ATRANS.each do |e|
% src = "#{e}.trans"
<%=transvpath % "#{e}.c"%>: <%= transvpath % "#{e}.trans"%>
% trans = IO.read(File.join($srcdir, "trans", src))
% src = trans.scan(/^\s*require\s+[\'\"]([^\'\"]*)/).flatten.map{|c|c+".rb"}
% if src.empty?
% src = trans.scan(/^\s*transcode_tblgen_\w+\s+[\'\"]([^\'\"]*)/).flatten.map{|c|c.downcase+"-tbl.rb"}
% end
<%=transvpath % "#{e}.c"%>: <%= src.map {|s| transvpath % "#{s}"}.join(" ")%> $(tooldir)/transcode-tblgen.rb
% end
% end
% link_so = LINK_SO.gsub(/([^\\])\n/, "\\1\n$(Q) ").gsub(/\n/, "\n\t")
% link_so.gsub!(/(-(?:implib|pdb):\S+)-\$\(arch\)\./, '\1.')
% dependencies.each do |e|
% obj = "enc/#{e}.$(OBJEXT)"
% df = ("enc/#{e}.def" if deffile)
% target = e.dup
% if target.sub!(/\Atrans\//, '$(TRANSSODIR)/')
% mesg = "transcoder"
% else
% target = "$(ENCSODIR)/#{e}"
% mesg = "encoding"
% end
<%=target%>.$(DLEXT): <%=obj%>
$(ECHO) linking <%=mesg%> $(@F)
% cmd = link_so.sub(/\$\(OBJS\)/) {obj}
% base = File.basename(e)
% if df
$(Q)echo> <%=df%> EXPORTS
$(Q)echo>> <%=df%> <%=EXPORT_PREFIX%>Init_<%=base%>
% cmd.sub!(/\$\(DEFFILE\)/) {df}
% cmd.gsub!(/-(?:implib|pdb):/) {|s|"#{s}enc/#{e.sub(/[^\/]+\z/, '')}"}
% end
$(Q)<%=cmd%>
% end
% dependencies.each do |e|
<%="enc/#{e}.$(OBJEXT)"%>: <%="$(encsrcdir)/#{e}.c"%>
$(ECHO) compiling <%= "$(encsrcdir)/#{e}.c"%>
$(Q)<%=COMPILE_C.gsub(/\$(\()?<(\:[^)]+)?(\))?/){"$(encsrcdir)/#{e}.c"}%>
% end
enc/encdb.$(OBJEXT): encdb.h
enc/trans/transdb.$(OBJEXT): transdb.h
clean:
% %w[$(ENCSOS) $(LIBENC) $(ENCOBJS) $(ENCCLEANOBJS) $(ENCCLEANLIBS) $(TRANSSOS) $(LIBTRANS) $(TRANSOBJS) $(TRANSCLEANOBJS) $(TRANSCLEANLIBS) $(ENC_TRANS_D) $(ENC_TRANS_SO_D)].each do |clean|
$(Q)$(RMALL) <%=pathrep[clean]%>
% end
% unless inplace
$(Q)$(RM) enc/unicode/*/casefold.h enc/unicode/*/name2ctype.h
$(Q)$(RM) enc/trans/newline.c enc/jis/props.h
-$(Q)$(RMDIR) enc/trnas enc/unicode<%=ignore_error%>
% end
% workdirs.reverse_each do|d|
-$(Q)$(RMDIR) <%=pathrep[d]%><%=ignore_error%>
% end
clean-srcs:
$(Q)$(RM) <%=pathrep['$(TRANSCSRCS)']%> <%=pathrep['$(BUILTIN_TRANS_CSRCS)']%>
-$(Q)$(RMDIR) <%=pathrep['enc/trans']%><%=ignore_error%>
$(Q)$(RM) enc/unicode/*/casefold.h enc/unicode/*/name2ctype.h
$(Q)$(RM) enc/jis/props.h
-$(Q)$(RMDIR) <%=pathrep['enc/unicode']%><%=ignore_error%>
-$(Q)$(RMDIR) <%=pathrep['enc/props']%><%=ignore_error%>
-$(Q)$(RMDIR) <%=pathrep['enc']%><%=ignore_error%>
<%# vim: set ft=eruby noexpandtab ts=8 sw=2 : -%>
# AUTOGENERATED DEPENDENCIES START
enc/ascii.$(OBJEXT): enc/ascii.c
enc/big5.$(OBJEXT): enc/big5.c
enc/cesu_8.$(OBJEXT): enc/cesu_8.c
enc/cp949.$(OBJEXT): enc/cp949.c
enc/emacs_mule.$(OBJEXT): enc/emacs_mule.c
enc/encdb.$(OBJEXT): enc/encdb.c
enc/euc_jp.$(OBJEXT): enc/euc_jp.c
enc/euc_kr.$(OBJEXT): enc/euc_kr.c
enc/euc_tw.$(OBJEXT): enc/euc_tw.c
enc/gb18030.$(OBJEXT): enc/gb18030.c
enc/gb2312.$(OBJEXT): enc/gb2312.c
enc/gbk.$(OBJEXT): enc/gbk.c
enc/iso_8859_1.$(OBJEXT): enc/iso_8859_1.c
enc/iso_8859_10.$(OBJEXT): enc/iso_8859_10.c
enc/iso_8859_11.$(OBJEXT): enc/iso_8859_11.c
enc/iso_8859_13.$(OBJEXT): enc/iso_8859_13.c
enc/iso_8859_14.$(OBJEXT): enc/iso_8859_14.c
enc/iso_8859_15.$(OBJEXT): enc/iso_8859_15.c
enc/iso_8859_16.$(OBJEXT): enc/iso_8859_16.c
enc/iso_8859_2.$(OBJEXT): enc/iso_8859_2.c
enc/iso_8859_3.$(OBJEXT): enc/iso_8859_3.c
enc/iso_8859_4.$(OBJEXT): enc/iso_8859_4.c
enc/iso_8859_5.$(OBJEXT): enc/iso_8859_5.c
enc/iso_8859_6.$(OBJEXT): enc/iso_8859_6.c
enc/iso_8859_7.$(OBJEXT): enc/iso_8859_7.c
enc/iso_8859_8.$(OBJEXT): enc/iso_8859_8.c
enc/iso_8859_9.$(OBJEXT): enc/iso_8859_9.c
enc/koi8_r.$(OBJEXT): enc/koi8_r.c
enc/koi8_u.$(OBJEXT): enc/koi8_u.c
enc/shift_jis.$(OBJEXT): enc/shift_jis.c
enc/trans/big5.$(OBJEXT): enc/trans/big5.c
enc/trans/cesu_8.$(OBJEXT): enc/trans/cesu_8.c
enc/trans/chinese.$(OBJEXT): enc/trans/chinese.c
enc/trans/ebcdic.$(OBJEXT): enc/trans/ebcdic.c
enc/trans/emoji.$(OBJEXT): enc/trans/emoji.c
enc/trans/emoji_iso2022_kddi.$(OBJEXT): enc/trans/emoji_iso2022_kddi.c
enc/trans/emoji_sjis_docomo.$(OBJEXT): enc/trans/emoji_sjis_docomo.c
enc/trans/emoji_sjis_kddi.$(OBJEXT): enc/trans/emoji_sjis_kddi.c
enc/trans/emoji_sjis_softbank.$(OBJEXT): enc/trans/emoji_sjis_softbank.c
enc/trans/escape.$(OBJEXT): enc/trans/escape.c
enc/trans/gb18030.$(OBJEXT): enc/trans/gb18030.c
enc/trans/gbk.$(OBJEXT): enc/trans/gbk.c
enc/trans/iso2022.$(OBJEXT): enc/trans/iso2022.c
enc/trans/japanese.$(OBJEXT): enc/trans/japanese.c
enc/trans/japanese_euc.$(OBJEXT): enc/trans/japanese_euc.c
enc/trans/japanese_sjis.$(OBJEXT): enc/trans/japanese_sjis.c
enc/trans/korean.$(OBJEXT): enc/trans/korean.c
enc/trans/newline.$(OBJEXT): enc/trans/newline.c
enc/trans/single_byte.$(OBJEXT): enc/trans/single_byte.c
enc/trans/transdb.$(OBJEXT): enc/trans/transdb.c
enc/trans/utf8_mac.$(OBJEXT): enc/trans/utf8_mac.c
enc/trans/utf_16_32.$(OBJEXT): enc/trans/utf_16_32.c
enc/unicode.$(OBJEXT): enc/unicode.c
enc/us_ascii.$(OBJEXT): enc/us_ascii.c
enc/utf_16be.$(OBJEXT): enc/utf_16be.c
enc/utf_16le.$(OBJEXT): enc/utf_16le.c
enc/utf_32be.$(OBJEXT): enc/utf_32be.c
enc/utf_32le.$(OBJEXT): enc/utf_32le.c
enc/utf_8.$(OBJEXT): enc/utf_8.c
enc/windows_1250.$(OBJEXT): enc/windows_1250.c
enc/windows_1251.$(OBJEXT): enc/windows_1251.c
enc/windows_1252.$(OBJEXT): enc/windows_1252.c
enc/windows_1253.$(OBJEXT): enc/windows_1253.c
enc/windows_1254.$(OBJEXT): enc/windows_1254.c
enc/windows_1257.$(OBJEXT): enc/windows_1257.c
enc/windows_31j.$(OBJEXT): enc/windows_31j.c
# AUTOGENERATED DEPENDENCIES END