diff options
Diffstat (limited to 'defs/gmake.mk')
-rw-r--r-- | defs/gmake.mk | 379 |
1 files changed, 265 insertions, 114 deletions
diff --git a/defs/gmake.mk b/defs/gmake.mk index e533396bae..c914b39690 100644 --- a/defs/gmake.mk +++ b/defs/gmake.mk @@ -1,29 +1,32 @@ # -*- mode: makefile-gmake; indent-tabs-mode: t -*- reconfig config.status: export MAKE:=$(MAKE) +export BASERUBY:=$(BASERUBY) override gnumake_recursive := $(if $(findstring n,$(firstword $(MFLAGS))),,+) override mflags := $(filter-out -j%,$(MFLAGS)) MSPECOPT += $(if $(filter -j%,$(MFLAGS)),-j) nproc = $(subst -j,,$(filter -j%,$(MFLAGS))) ifeq ($(GITHUB_ACTIONS),true) -override ACTIONS_GROUP = @echo "\#\#[group]$(@:yes-=)" -override ACTIONS_ENDGROUP = @echo "\#\#[endgroup]" +# 93(bright yellow) is copied from .github/workflows/mingw.yml +override ACTIONS_GROUP = @echo "::group::[93m$(@:yes-%=%)[m" +override ACTIONS_ENDGROUP = @echo "::endgroup::" endif -ifneq ($(filter %darwin%,$(arch)),) -INSTRUBY_ENV += SDKROOT=/ +ifneq ($(filter darwin%,$(target_os)),) +INSTRUBY_ENV += SDKROOT= endif INSTRUBY_ARGS += --gnumake +ifeq ($(DOT_WAIT),) CHECK_TARGETS := great exam love check test check% test% btest% # expand test targets, and those dependents TEST_TARGETS := $(filter $(CHECK_TARGETS),$(MAKECMDGOALS)) TEST_DEPENDS := $(filter-out commit $(TEST_TARGETS),$(MAKECMDGOALS)) TEST_TARGETS := $(patsubst great,exam,$(TEST_TARGETS)) TEST_DEPENDS := $(filter-out great $(TEST_TARGETS),$(TEST_DEPENDS)) -TEST_TARGETS := $(patsubst exam,check,$(TEST_TARGETS)) -TEST_TARGETS := $(patsubst check,test-spec test-all test-tool test-short,$(TEST_TARGETS)) +TEST_TARGETS := $(patsubst exam,test-bundled-gems test-bundler-parallel check,$(TEST_TARGETS)) +TEST_TARGETS := $(patsubst check,test-syntax-suggest test-spec test-all test-tool test-short,$(TEST_TARGETS)) TEST_TARGETS := $(patsubst test-rubyspec,test-spec,$(TEST_TARGETS)) TEST_DEPENDS := $(filter-out exam check test-spec $(TEST_TARGETS),$(TEST_DEPENDS)) TEST_TARGETS := $(patsubst love,check,$(TEST_TARGETS)) @@ -33,15 +36,19 @@ TEST_DEPENDS := $(filter-out test-all $(TEST_TARGETS),$(TEST_DEPENDS)) TEST_TARGETS := $(patsubst test,test-short,$(TEST_TARGETS)) TEST_DEPENDS := $(filter-out test $(TEST_TARGETS),$(TEST_DEPENDS)) TEST_TARGETS := $(patsubst test-short,btest-ruby test-knownbug test-basic,$(TEST_TARGETS)) +TEST_TARGETS := $(patsubst test-basic,test-basic test-leaked-globals,$(TEST_TARGETS)) +TEST_TARGETS := $(patsubst test-bundled-gems,test-bundled-gems-run,$(TEST_TARGETS)) +TEST_TARGETS := $(patsubst test-bundled-gems-run,test-bundled-gems-run $(PREPARE_BUNDLED_GEMS),$(TEST_TARGETS)) +TEST_TARGETS := $(patsubst test-bundled-gems-prepare,test-bundled-gems-prepare $(PRECHECK_BUNDLED_GEMS) test-bundled-gems-fetch,$(TEST_TARGETS)) +TEST_TARGETS := $(patsubst test-bundler-parallel,test-bundler-parallel $(PREPARE_BUNDLER),$(TEST_TARGETS)) +TEST_TARGETS := $(patsubst test-syntax-suggest,test-syntax-suggest $(PREPARE_SYNTAX_SUGGEST),$(TEST_TARGETS)) TEST_DEPENDS := $(filter-out test-short $(TEST_TARGETS),$(TEST_DEPENDS)) TEST_DEPENDS += $(if $(filter great exam love check,$(MAKECMDGOALS)),all exts) +TEST_TARGETS := $(patsubst yes-%,%,$(filter-out no-%,$(TEST_TARGETS))) +endif in-srcdir := $(if $(filter-out .,$(srcdir)),$(CHDIR) $(srcdir) &&) -ifneq ($(filter -O0 -Od,$(optflags)),) -override XCFLAGS := $(filter-out -D_FORTIFY_SOURCE=%,$(XCFLAGS)) -endif - ifeq ($(if $(filter all main exts enc trans libencs libenc libtrans \ prog program ruby ruby$(EXEEXT) \ wprogram rubyw rubyw$(EXEEXT) \ @@ -50,6 +57,13 @@ ifeq ($(if $(filter all main exts enc trans libencs libenc libtrans \ -include $(SHOWFLAGS) endif +ifeq ($(HAVE_BASERUBY):$(HAVE_GIT),yes:yes) +override modified := $(shell $(BASERUBY) -C $(srcdir) tool/file2lastrev.rb --modified='%Y %m %d') +override RUBY_RELEASE_YEAR := $(word 1,$(modified)) +override RUBY_RELEASE_MONTH := $(word 2,$(modified)) +override RUBY_RELEASE_DAY := $(word 3,$(modified)) +endif + ifneq ($(filter universal-%,$(arch)),) define archcmd %.$(1).S: %.c @@ -65,10 +79,11 @@ define archcmd %.i: %.$(1).i endef -$(foreach arch,$(arch_flags),\ +$(foreach arch,$(filter -arch=%,$(subst -arch ,-arch=,$(ARCH_FLAG))),\ $(eval $(call archcmd,$(patsubst -arch=%,%,$(value arch)),$(patsubst -arch=%,-arch %,$(value arch))))) endif +ifeq ($(DOT_WAIT),) .PHONY: $(addprefix yes-,$(TEST_TARGETS)) ifneq ($(filter-out btest%,$(TEST_TARGETS)),) @@ -76,14 +91,33 @@ $(addprefix yes-,$(TEST_TARGETS)): $(TEST_DEPENDS) endif ORDERED_TEST_TARGETS := $(filter $(TEST_TARGETS), \ - btest-ruby test-knownbug test-basic \ + btest-ruby test-knownbug test-leaked-globals test-basic \ test-testframework test-tool test-ruby test-all \ - test-spec test-bundler-prepare test-bundler test-bundler-parallel \ + test-spec test-syntax-suggest-prepare test-syntax-suggest \ + test-bundler-prepare test-bundler test-bundler-parallel \ + test-bundled-gems-precheck test-bundled-gems-fetch \ + test-bundled-gems-prepare test-bundled-gems-run \ ) -prev_test := $(if $(filter test-spec,$(ORDERED_TEST_TARGETS)),test-spec-precheck) + +# grep ^yes-test-.*-precheck: template/Makefile.in defs/gmake.mk common.mk +test_prechecks := $(filter $(ORDERED_TEST_TARGETS),\ + test-leaked-globals \ + test-all \ + test-spec \ + test-syntax-suggest \ + test-bundler \ + test-bundler-parallel \ + test-bundled-gems\ + ) +prev_test := $(subst test-bundler-parallel,test-bundler,$(test_prechecks)) +prev_test := $(addsuffix -precheck,$(prev_test)) +first_test_prechecks := $(prev_test) + $(foreach test,$(ORDERED_TEST_TARGETS), \ - $(eval yes-$(value test) no-$(value test): $(value prev_test)); \ + $(eval yes-$(value test): $(addprefix yes-,$(value prev_test))); \ + $(eval no-$(value test): $(addprefix no-,$(value prev_test))); \ $(eval prev_test := $(value test))) +endif ifneq ($(if $(filter install,$(MAKECMDGOALS)),$(filter uninstall,$(MAKECMDGOALS))),) install-targets := $(filter install uninstall,$(MAKECMDGOALS)) @@ -129,7 +163,7 @@ config.status: $(wildcard config.cache) STUBPROGRAM = rubystub$(EXEEXT) IGNOREDPATTERNS = %~ .% %.orig %.rej \#%\# SCRIPTBINDIR := $(if $(EXEEXT),,exec/) -SCRIPTPROGRAMS = $(addprefix $(SCRIPTBINDIR),$(addsuffix $(EXEEXT),$(filter-out $(IGNOREDPATTERNS),$(notdir $(wildcard $(srcdir)/libexec/*))))) +SCRIPTPROGRAMS = $(addprefix $(SCRIPTBINDIR),$(addsuffix $(EXEEXT),$(filter-out $(IGNOREDPATTERNS),$(notdir $(wildcard $(srcdir)/bin/*))))) stub: $(STUBPROGRAM) scriptbin: $(SCRIPTPROGRAMS) @@ -155,28 +189,34 @@ $(SCRIPTBINDIR)%$(EXEEXT): bin/% $(STUBPROGRAM) \ $(Q) chmod +x $@ $(Q) $(POSTLINK) -$(TIMESTAMPDIR)/.exec.time: - $(Q) mkdir exec - $(Q) exit > $@ +$(SCRIPTBINDIR): + $(Q) mkdir $@ .PHONY: commit -commit: $(if $(filter commit,$(MAKECMDGOALS)),$(filter-out commit,$(MAKECMDGOALS))) up +COMMIT_PREPARE := $(subst :,\:,$(filter-out commit do-commit,$(MAKECMDGOALS))) up + +commit: pre-commit $(DOT_WAIT) do-commit $(DOT_WAIT) post_commit +pre-commit: $(COMMIT_PREPARE) +do-commit: $(if $(DOT_WAIT),,pre-commit) @$(BASERUBY) -C "$(srcdir)" -I./tool/lib -rvcs -e 'VCS.detect(".").commit' +post-commit: $(if $(DOT_WAIT),,do-commit) +$(Q) \ { \ $(in-srcdir) \ exec sed -f tool/prereq.status defs/gmake.mk template/Makefile.in common.mk; \ } | \ - $(MAKE) $(mflags) Q=$(Q) ECHO=$(ECHO) srcdir="$(srcdir)" srcs_vpath="" CHDIR="$(CHDIR)" \ - BOOTSTRAPRUBY="$(BOOTSTRAPRUBY)" MINIRUBY="$(BASERUBY)" BASERUBY="$(BASERUBY)" \ + $(MAKE) $(mflags) Q=$(Q) ECHO=$(ECHO) \ + top_srcdir="$(top_srcdir)" srcdir="$(srcdir)" srcs_vpath="" CHDIR="$(CHDIR)" \ + BOOTSTRAPRUBY="$(BOOTSTRAPRUBY)" BOOTSTRAPRUBY_OPT="$(BOOTSTRAPRUBY_OPT)" \ + MINIRUBY="$(BASERUBY)" BASERUBY="$(BASERUBY)" HAVE_BASERUBY="$(HAVE_BASERUBY)" \ VCSUP="" ENC_MK=.top-enc.mk REVISION_FORCE=PHONY CONFIGURE="$(CONFIGURE)" -f - \ update-src srcs all-incs GITHUB_RUBY_URL = https://github.com/ruby/ruby PR = -COMMIT_GPG_SIGN = $(shell git -C "$(srcdir)" config commit.gpgsign) -REMOTE_GITHUB_URL = $(shell git -C "$(srcdir)" config remote.github.url) +COMMIT_GPG_SIGN = $(shell $(GIT) -C "$(srcdir)" config commit.gpgsign) +REMOTE_GITHUB_URL = $(shell $(GIT) -C "$(srcdir)" config remote.github.url) COMMITS_NOTES = commits .PHONY: fetch-github @@ -189,21 +229,21 @@ define fetch-github exit 1; \ ) $(eval REMOTE_GITHUB_URL := $(REMOTE_GITHUB_URL)) - $(if $(REMOTE_GITHUB_URL),, \ - echo adding $(GITHUB_RUBY_URL) as remote github; \ - git -C "$(srcdir)" remote add github $(GITHUB_RUBY_URL); \ - git -C "$(srcdir)" config --add remote.github.fetch +refs/notes/$(COMMITS_NOTES):refs/notes/$(COMMITS_NOTES) - $(eval REMOTE_GITHUB_URL := $(GITHUB_RUBY_URL)) \ + $(if $(REMOTE_GITHUB_URL),, + echo adding $(GITHUB_RUBY_URL) as remote github + $(GIT) -C "$(srcdir)" remote add github $(GITHUB_RUBY_URL) + $(GIT) -C "$(srcdir)" config --add remote.github.fetch +refs/notes/$(COMMITS_NOTES):refs/notes/$(COMMITS_NOTES) + $(eval REMOTE_GITHUB_URL := $(GITHUB_RUBY_URL)) ) - $(if $(git -C "$(srcdir)" rev-parse "github/pull/$(1)/head" -- 2> /dev/null), \ - git -C "$(srcdir)" branch -f "gh-$(1)" "github/pull/$(1)/head", \ - git -C "$(srcdir)" fetch -f github "pull/$(1)/head:gh-$(1)" \ + $(if $(shell $(GIT) -C "$(srcdir)" rev-parse "github/pull/$(1)/head" -- 2> /dev/null), + $(GIT) -C "$(srcdir)" branch -f "gh-$(1)" "github/pull/$(1)/head", + $(GIT) -C "$(srcdir)" fetch -f github "pull/$(1)/head:gh-$(1)" ) endef .PHONY: checkout-github checkout-github: fetch-github - git -C "$(srcdir)" checkout "gh-$(PR)" + $(GIT) -C "$(srcdir)" checkout "gh-$(PR)" .PHONY: update-github update-github: fetch-github @@ -216,30 +256,31 @@ update-github: fetch-github $(eval PR_BRANCH := $(word 2,$(PULL_REQUEST_FORK_BRANCH))) $(eval GITHUB_UPDATE_WORKTREE := $(shell mktemp -d "$(srcdir)/gh-$(PR)-XXXXXX")) - git -C "$(srcdir)" worktree add $(notdir $(GITHUB_UPDATE_WORKTREE)) "gh-$(PR)" - git -C "$(GITHUB_UPDATE_WORKTREE)" merge master --no-edit + $(GIT) -C "$(srcdir)" worktree add $(notdir $(GITHUB_UPDATE_WORKTREE)) "gh-$(PR)" + $(GIT) -C "$(GITHUB_UPDATE_WORKTREE)" merge master --no-edit @$(BASERUBY) -e 'print "Are you sure to push this to PR=$(PR)? [Y/n]: "; exit(gets.chomp != "n")' - git -C "$(srcdir)" remote add fork-$(PR) git@github.com:$(FORK_REPO).git - git -C "$(GITHUB_UPDATE_WORKTREE)" push fork-$(PR) gh-$(PR):$(PR_BRANCH) - git -C "$(srcdir)" remote rm fork-$(PR) - git -C "$(srcdir)" worktree remove $(notdir $(GITHUB_UPDATE_WORKTREE)) - git -C "$(srcdir)" branch -D gh-$(PR) + $(GIT) -C "$(srcdir)" remote add fork-$(PR) git@github.com:$(FORK_REPO).git + $(GIT) -C "$(GITHUB_UPDATE_WORKTREE)" push fork-$(PR) gh-$(PR):$(PR_BRANCH) + $(GIT) -C "$(srcdir)" remote rm fork-$(PR) + $(GIT) -C "$(srcdir)" worktree remove $(notdir $(GITHUB_UPDATE_WORKTREE)) + $(GIT) -C "$(srcdir)" branch -D gh-$(PR) .PHONY: pull-github pull-github: fetch-github $(call pull-github,$(PR)) define pull-github - $(eval GITHUB_MERGE_BASE := $(shell git -C "$(srcdir)" log -1 --format=format:%H)) - $(eval GITHUB_MERGE_BRANCH := $(shell git -C "$(srcdir)" symbolic-ref --short HEAD)) + $(eval GITHUB_MERGE_BASE := $(shell $(GIT) -C "$(srcdir)" log -1 --format=format:%H)) + $(eval GITHUB_MERGE_BRANCH := $(shell $(GIT) -C "$(srcdir)" symbolic-ref --short HEAD)) $(eval GITHUB_MERGE_WORKTREE := $(shell mktemp -d "$(srcdir)/gh-$(1)-XXXXXX")) - git -C "$(srcdir)" worktree add $(notdir $(GITHUB_MERGE_WORKTREE)) "gh-$(1)" - git -C "$(GITHUB_MERGE_WORKTREE)" rebase $(GITHUB_MERGE_BRANCH) + $(GIT) -C "$(srcdir)" worktree prune + $(GIT) -C "$(srcdir)" worktree add $(notdir $(GITHUB_MERGE_WORKTREE)) "gh-$(1)" + $(GIT) -C "$(GITHUB_MERGE_WORKTREE)" rebase $(GITHUB_MERGE_BRANCH) $(eval COMMIT_GPG_SIGN := $(COMMIT_GPG_SIGN)) $(if $(filter true,$(COMMIT_GPG_SIGN)), \ - git -C "$(GITHUB_MERGE_WORKTREE)" rebase --exec "git commit --amend --no-edit -S" "$(GITHUB_MERGE_BASE)"; \ + $(GIT) -C "$(GITHUB_MERGE_WORKTREE)" rebase --exec "$(GIT) commit --amend --no-edit -S" "$(GITHUB_MERGE_BASE)"; \ ) - git -C "$(GITHUB_MERGE_WORKTREE)" rebase --exec "git notes add --message 'Merged: $(GITHUB_RUBY_URL)/pull/$(1)'" "$(GITHUB_MERGE_BASE)" + $(GIT) -C "$(GITHUB_MERGE_WORKTREE)" rebase --exec "$(GIT) notes add --message 'Merged: $(GITHUB_RUBY_URL)/pull/$(1)'" "$(GITHUB_MERGE_BASE)" endef .PHONY: fetch-github-% @@ -248,23 +289,48 @@ fetch-github-%: .PHONY: checkout-github-% checkout-github-%: fetch-github-% - git -C "$(srcdir)" checkout "gh-$*" + $(GIT) -C "$(srcdir)" checkout "gh-$*" .PHONY: pr-% pull-github-% pr-% pull-github-%: fetch-github-% $(call pull-github,$*) HELP_EXTRA_TASKS = \ - " checkout-github: checkout GitHub Pull Request [PR=1234]" \ - " pull-github: rebase GitHub Pull Request to new worktree [PR=1234]" \ - " update-github: merge master branch and push it to Pull Request [PR=1234]" \ + " checkout-github: checkout GitHub Pull Request [PR=1234]" \ + " pull-github: rebase GitHub Pull Request to new worktree [PR=1234]" \ + " update-github: merge master branch and push it to Pull Request [PR=1234]" \ + " tags: generate TAGS file" \ "" -extract-gems: $(HAVE_BASERUBY:yes=update-gems) - -bundled-gems := $(shell sed '/^[ ]*\#/d;/^[ ]*$$/d;s/[ ][ ]*/-/;s/[ ].*//' $(srcdir)/gems/bundled_gems) - -update-gems: | $(patsubst %,gems/%.gem,$(bundled-gems)) +# 1. squeeze spaces +# 2. strip and skip comment/empty lines +# 3. "gem x.y.z URL xxxxxx" -> "gem|x.y.z|xxxxxx|URL" +# 4. "gem x.y.z URL" -> "gem-x.y.z" +bundled-gems := $(shell sed \ + -e 's/[ ][ ]*/ /g' \ + -e 's/^ //;/\#/d;s/ *$$//;/^$$/d' \ + $(if $(filter yes,$(HAVE_GIT)), \ + -e 's/^\(.*\) \(.*\) \(.*\) \(.*\)/\1|\2|\4|\3/' \ + ) \ + -e 's/ /-/;s/ .*//' \ + $(srcdir)/gems/bundled_gems) + +bundled-gems-rev := $(filter-out $(subst |,,$(bundled-gems)),$(bundled-gems)) +bundled-gems := $(filter-out $(bundled-gems-rev),$(bundled-gems)) + +# calls $(1) with name, version, revision, URL +foreach-bundled-gems-rev = \ + $(foreach g,$(bundled-gems-rev),$(call foreach-bundled-gems-rev-0,$(1),$(subst |, ,$(value g)))) +foreach-bundled-gems-rev-0 = \ + $(call $(1),$(word 1,$(2)),$(word 2,$(2)),$(word 3,$(2)),$(word 4,$(2))) +bundled-gem-gemfile = $(srcdir)/gems/$(1)-$(2).gem +bundled-gem-gemspec = $(srcdir)/gems/src/$(1)/$(1).gemspec +bundled-gem-extracted = $(srcdir)/.bundle/gems/$(1)-$(2) +bundled-gem-revision = $(srcdir)/.bundle/.timestamp/$(1).revision + +update-gems: | $(patsubst %,$(srcdir)/gems/%.gem,$(bundled-gems)) +update-gems: | $(call foreach-bundled-gems-rev,bundled-gem-gemfile) +update-gems: | $(call foreach-bundled-gems-rev,bundled-gem-gemspec) test-bundler-precheck: | $(srcdir)/.bundle/cache @@ -272,7 +338,7 @@ $(srcdir)/.bundle/cache: $(MAKEDIRS) $(@D) $(CACHE_DIR) $(LN_S) ../.downloaded-cache $@ -gems/%.gem: +$(srcdir)/gems/%.gem: $(ECHO) Downloading bundled gem $*... $(Q) $(BASERUBY) -C "$(srcdir)" \ -I./tool -rdownloader \ @@ -283,68 +349,99 @@ gems/%.gem: -e 'File.unlink(*old) and' \ -e 'FileUtils.rm_rf(old.map{'"|n|"'n.chomp(".gem")})' -extract-gems: | $(patsubst %,.bundle/gems/%,$(bundled-gems)) +extract-gems: | $(patsubst %,$(srcdir)/.bundle/gems/%,$(bundled-gems)) +extract-gems: | $(call foreach-bundled-gems-rev,bundled-gem-extracted) -.bundle/gems/%: gems/%.gem | .bundle/gems +$(srcdir)/.bundle/gems/%: $(srcdir)/gems/%.gem | .bundle/gems $(ECHO) Extracting bundle gem $*... $(Q) $(BASERUBY) -C "$(srcdir)" \ - -Itool -rgem-unpack \ - -e 'Gem.unpack("gems/$(@F).gem", ".bundle/gems")' + -Itool/lib -rbundled_gem \ + -e 'BundledGem.unpack("gems/$(@F).gem", ".bundle")' + +$(srcdir)/.bundle/.timestamp: + $(MAKEDIRS) $@ + +define build-gem +$(srcdir)/gems/src/$(1)/.git: | $(srcdir)/gems/src + $(ECHO) Cloning $(4) + $(Q) $(GIT) clone $(4) $$(@D) + +$(bundled-gem-revision): \ + $(if $(if $(wildcard $$(@)),$(filter $(3),$(shell cat $$(@)))),,PHONY) \ + | $(srcdir)/.bundle/.timestamp $(srcdir)/gems/src/$(1)/.git + $(ECHO) Update $(1) to $(3) + $(Q) $(CHDIR) "$(srcdir)/gems/src/$(1)" && \ + if [ `$(GIT) rev-parse HEAD` != $(3) ]; then \ + $(GIT) fetch origin $(3) && \ + $(GIT) checkout --detach $(3) && \ + :; \ + fi + echo $(3) | $(IFCHANGE) $$(@) - + +# The repository of minitest does not include minitest.gemspec because it uses hoe. +# This creates a dummy gemspec. +$(bundled-gem-gemspec): $(bundled-gem-revision) \ + | $(srcdir)/gems/src/$(1)/.git + $(Q) $(BASERUBY) -I$(tooldir)/lib -rbundled_gem -e 'BundledGem.dummy_gemspec(*ARGV)' $$(@) + +$(bundled-gem-gemfile): $(bundled-gem-gemspec) $(bundled-gem-revision) + $(ECHO) Building $(1)@$(3) to $$(@) + $(Q) $(BASERUBY) -C "$(srcdir)" \ + -Itool/lib -rbundled_gem \ + -e 'BundledGem.build("gems/src/$(1)/$(1).gemspec", "$(2)", "gems", validation: false)' + +endef +define build-gem-0 +$(eval $(call build-gem,$(1),$(2),$(3),$(4))) +endef + +$(call foreach-bundled-gems-rev,build-gem-0) + +$(srcdir)/gems/src: + $(MAKEDIRS) $@ $(srcdir)/.bundle/gems: $(MAKEDIRS) $@ +ifneq ($(DOT_WAIT),) +up:: $(DOT_WAIT) after-update +endif + ifneq ($(filter update-bundled_gems refresh-gems,$(MAKECMDGOALS)),) update-gems: update-bundled_gems endif -ifeq ($(filter 0 1,$(words $(arch_flags))),) -$(foreach x,$(patsubst -arch=%,%,$(arch_flags)), \ - $(eval $$(MJIT_HEADER:.h=)-$(value x).h \ - $$(MJIT_MIN_HEADER:.h=)-$(value x).h \ - $$(TIMESTAMPDIR)/$$(MJIT_HEADER:.h=)-$(value x).time \ - : ARCH_FLAG := -arch $(value x))) - -$(foreach x,$(patsubst -arch=%,%,$(arch_flags)), \ - $(eval $$(MJIT_HEADER:.h=)-$(value x).h: \ - $$(TIMESTAMPDIR)/$$(MJIT_HEADER:.h=)-$(value x).time)) - -mjit_min_headers := $(patsubst -arch=%,$(MJIT_MIN_HEADER:.h=-%.h),$(arch_flags)) -$(MJIT_MIN_HEADER): $(mjit_min_headers) $(PREP) - @ set -e; set $(patsubst -arch=%,%,$(arch_flags)); \ - cd $(@D); h=$(@F:.h=); \ - exec > $(@F).new; \ - echo '#if 0'; \ - for arch; do\ - echo "#elif defined __$${arch}__"; \ - echo "# include \"$$h-$$arch.h\""; \ - done; \ - echo "#else"; echo "# error unsupported platform"; echo "#endif" - $(IFCHANGE) $@ $@.new - $(Q) $(MAKEDIRS) $(MJIT_HEADER_INSTALL_DIR) - $(Q) $(MAKE_LINK) $@ $(MJIT_HEADER_INSTALL_DIR)/$(@F) - +.SECONDARY: update-unicode-files +.SECONDARY: update-unicode-auxiliary-files +.SECONDARY: update-unicode-ucd-emoji-files +.SECONDARY: update-unicode-emoji-files + +ifneq ($(DOT_WAIT),) +.NOTPARALLEL: update-unicode +.NOTPARALLEL: update-unicode-files +.NOTPARALLEL: update-unicode-auxiliary-files +.NOTPARALLEL: update-unicode-ucd-emoji-files +.NOTPARALLEL: update-unicode-emoji-files +.NOTPARALLEL: $(UNICODE_FILES) $(UNICODE_PROPERTY_FILES) +.NOTPARALLEL: $(UNICODE_AUXILIARY_FILES) +.NOTPARALLEL: $(UNICODE_UCD_EMOJI_FILES) $(UNICODE_EMOJI_FILES) endif -ifeq ($(if $(wildcard $(filter-out .,$(UNICODE_FILES) $(UNICODE_PROPERTY_FILES))),,\ - $(wildcard $(srcdir)/lib/unicode_normalize/tables.rb)),) -# Needs the dependency when any Unicode data file exists, or -# normalization tables script doesn't. Otherwise, when the target -# only exists, use it as-is. -.PHONY: $(UNICODE_SRC_DATA_DIR)/.unicode-tables.time -UNICODE_TABLES_TIMESTAMP = -$(UNICODE_SRC_DATA_DIR)/.unicode-tables.time: \ - $(UNICODE_FILES) $(UNICODE_PROPERTY_FILES) +ifeq ($(HAVE_GIT),yes) +REVISION_LATEST := $(shell $(CHDIR) $(srcdir) && $(GIT) log -1 --format=%H 2>/dev/null) +else +REVISION_LATEST := update +endif +REVISION_IN_HEADER := $(shell sed '/^\#define RUBY_FULL_REVISION "\(.*\)"/!d;s//\1/;q' $(wildcard $(srcdir)/revision.h revision.h) /dev/null 2>/dev/null) +ifeq ($(REVISION_IN_HEADER),) +REVISION_IN_HEADER := none endif - -REVISION_IN_HEADER := $(shell sed -n 's/^\#define RUBY_FULL_REVISION "\(.*\)"/\1/p' $(srcdir)/revision.h 2>/dev/null) -REVISION_LATEST := $(shell $(CHDIR) $(srcdir) && git log -1 --format=%H 2>/dev/null) ifneq ($(REVISION_IN_HEADER),$(REVISION_LATEST)) -# GNU make treat the target as unmodified when its dependents get -# updated but it is not updated, while others may not. -$(srcdir)/revision.h: $(REVISION_H) +$(REVISION_H): PHONY endif +include $(top_srcdir)/yjit/yjit.mk + # Query on the generated rdoc # # $ make rdoc:Integer#+ @@ -361,11 +458,10 @@ spec/bundler: test-bundler-parallel $(Q)$(NULLCMD) # workaround to avoid matching non ruby files with "spec/%/" under GNU make 3.81 -spec/%_spec.c spec/%_spec.$(DLEXT): +spec/%_spec.c: + $(empty) +$(srcdir)/$(RUBYSPEC_CAPIEXT)/rubyspec.h: $(empty) - -spec/%/ spec/%_spec.rb: programs exts PHONY - +$(RUNRUBY) -r./$(arch)-fake $(srcdir)/spec/mspec/bin/mspec-run -B $(srcdir)/spec/default.mspec $(SPECOPTS) $(patsubst %,$(srcdir)/%,$@) benchmark/%: miniruby$(EXEEXT) update-benchmark-driver PHONY $(Q)$(BASERUBY) -rrubygems -I$(srcdir)/benchmark/lib $(srcdir)/benchmark/benchmark-driver/exe/benchmark-driver \ @@ -373,6 +469,10 @@ benchmark/%: miniruby$(EXEEXT) update-benchmark-driver PHONY --executables="built-ruby::$(BENCH_RUBY) --disable-gem" \ $(srcdir)/$@ $(BENCH_OPTS) $(OPTS) +clean-local:: TARGET_SO = $(PROGRAM) $(WPROGRAM) $(LIBRUBY_SO) $(STATIC_RUBY) miniruby goruby +clean-local:: + -$(Q)$(RMALL) $(cleanlibs) + clean-srcs-ext:: $(Q)$(RM) $(patsubst $(srcdir)/%,%,$(EXT_SRCS)) @@ -388,31 +488,82 @@ endif update-deps: $(eval update_deps := $(shell date +update-deps-%Y%m%d)) $(eval deps_dir := $(shell mktemp -d)/$(update_deps)) - $(eval GIT_DIR := $(shell git -C $(srcdir) rev-parse --absolute-git-dir)) - git --git-dir=$(GIT_DIR) worktree add $(deps_dir) + $(eval GIT_DIR := $(shell $(GIT) -C $(srcdir) rev-parse --absolute-git-dir)) + $(GIT) --git-dir=$(GIT_DIR) worktree add $(deps_dir) cp $(tooldir)/config.guess $(tooldir)/config.sub $(deps_dir)/tool [ -f config.status ] && cp config.status $(deps_dir) cd $(deps_dir) && autoconf && \ exec ./configure -q -C --enable-load-relative --disable-install-doc --disable-rubygems 'optflags=-O0' 'debugflags=-save-temps=obj -g' $(RUNRUBY) -C $(deps_dir) tool/update-deps --fix - git -C $(deps_dir) diff --no-ext-diff --ignore-submodules --exit-code || \ - git -C $(deps_dir) commit --all --message='Update dependencies' - git --git-dir=$(GIT_DIR) worktree remove $(deps_dir) + $(GIT) -C $(deps_dir) diff --no-ext-diff --ignore-submodules --exit-code || \ + $(GIT) -C $(deps_dir) commit --all --message='Update dependencies' + $(GIT) --git-dir=$(GIT_DIR) worktree remove $(deps_dir) $(RMDIR) $(dir $(deps_dir)) - git --git-dir=$(GIT_DIR) merge --no-edit --ff-only $(update_deps) - git --git-dir=$(GIT_DIR) branch --delete $(update_deps) + $(GIT) --git-dir=$(GIT_DIR) merge --no-edit --ff-only $(update_deps) + $(GIT) --git-dir=$(GIT_DIR) branch --delete $(update_deps) # order-only-prerequisites doesn't work for $(RUBYSPEC_CAPIEXT) # because the same named directory exists in the source tree. $(RUBYSPEC_CAPIEXT)/%.$(DLEXT): $(srcdir)/$(RUBYSPEC_CAPIEXT)/%.c $(srcdir)/$(RUBYSPEC_CAPIEXT)/rubyspec.h $(RUBY_H_INCLUDES) $(LIBRUBY) $(ECHO) building $@ $(Q) $(MAKEDIRS) $(@D) - $(Q) $(DLDSHARED) $(XDLDFLAGS) $(XLDFLAGS) $(LDFLAGS) $(INCFLAGS) $(CPPFLAGS) $(OUTFLAG)$@ $< $(LIBRUBYARG) + $(Q) $(DLDSHARED) -L. $(XDLDFLAGS) $(XLDFLAGS) $(LDFLAGS) $(INCFLAGS) $(CPPFLAGS) $(OUTFLAG)$@ $< $(LIBRUBYARG) +ifneq ($(POSTLINK),) + $(Q) $(POSTLINK) +endif $(Q) $(RMALL) $@.* -rubyspec-capiext: $(patsubst %.c,$(RUBYSPEC_CAPIEXT)/%.$(DLEXT),$(notdir $(wildcard $(srcdir)/$(RUBYSPEC_CAPIEXT)/*.c))) +RUBYSPEC_CAPIEXT_SO := $(patsubst %.c,$(RUBYSPEC_CAPIEXT)/%.$(DLEXT),$(notdir $(wildcard $(srcdir)/$(RUBYSPEC_CAPIEXT)/*.c))) +rubyspec-capiext: $(RUBYSPEC_CAPIEXT_SO) @ $(NULLCMD) ifeq ($(ENABLE_SHARED),yes) +ruby: $(if $(LIBRUBY_SO_UPDATE),$(RUBYSPEC_CAPIEXT_SO)) exts: rubyspec-capiext endif + +spec/%/ spec/%_spec.rb: programs exts PHONY + +$(RUNRUBY) -r./$(arch)-fake $(srcdir)/spec/mspec/bin/mspec-run -B $(srcdir)/spec/default.mspec $(SPECOPTS) $(patsubst %,$(srcdir)/%,$@) + +ruby.pc: $(filter-out ruby.pc,$(ruby_pc)) + +matz: up + $(eval OLD := $(MAJOR).$(MINOR).0) + $(eval MINOR := $(shell expr $(MINOR) + 1)) + $(eval NEW := $(MAJOR).$(MINOR).0) + $(eval message := Development of $(NEW) started.) + $(eval files := include/ruby/version.h include/ruby/internal/abi.h) + $(GIT) -C $(srcdir) mv -f NEWS.md doc/NEWS/NEWS-$(OLD).md + $(GIT) -C $(srcdir) commit -m "[DOC] Flush NEWS.md" + sed -i~ \ + -e "s/^\(#define RUBY_API_VERSION_MINOR\) .*/\1 $(MINOR)/" \ + -e "s/^\(#define RUBY_ABI_VERSION\) .*/\1 0/" \ + $(files:%=$(srcdir)/%) + $(GIT) -C $(srcdir) add $(files) + $(BASERUBY) -C $(srcdir) -p -00 \ + -e 'BEGIN {old, new = ARGV.shift(2); STDOUT.reopen("NEWS.md")}' \ + -e 'case $$.' \ + -e 'when 1; $$_.sub!(/Ruby \K[0-9.]+/, new)' \ + -e 'when 2; $$_.sub!(/\*\*\K[0-9.]+(?=\*\*)/, old)' \ + -e 'end' \ + -e 'next if /^[\[ *]/ =~ $$_' \ + -e '$$_.sub!(/\n{2,}\z/, "\n\n")' \ + $(OLD) $(NEW) doc/NEWS/NEWS-$(OLD).md + $(GIT) -C $(srcdir) add NEWS.md + $(GIT) -C $(srcdir) commit -m "$(message)" + +tags: + $(MAKE) GIT="$(GIT)" -C "$(srcdir)" -f defs/tags.mk + + +# ripper_srcs makes all sources at once. invoking this target multiple +# times in parallel means all sources will be built for the number of +# sources times respectively. +ifneq ($(DOT_WAIT),) +.NOTPARALLEL: ripper_srcs +else +ripper_src = +$(foreach r,$(RIPPER_SRCS),$(eval $(value r): | $(value ripper_src))\ + $(eval ripper_src := $(value r))) +ripper_srcs: $(ripper_src) +endif |