Makefile 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. ifneq ($(wildcard config.make),)
  2. include config.make
  3. NETCORETESTS_VERSION := $(shell cat ../eng/Versions.props | sed -n 's/.*MicrosoftPrivateCoreFxNETCoreAppVersion>\(.*\)<\/MicrosoftPrivateCoreFxNETCoreAppVersion.*/\1/p' )
  4. NETCOREAPP_VERSION := $(shell cat ../eng/Versions.props | sed -n 's/.*MicrosoftNETCoreAppVersion>\(.*\)<\/MicrosoftNETCoreAppVersion.*/\1/p' )
  5. ROSLYN_VERSION:= $(shell cat ../eng/Versions.props | sed -n 's/.*MicrosoftNetCompilersVersion>\(.*\)<\/MicrosoftNetCompilersVersion.*/\1/p' )
  6. # Should be automated but not sure how for now
  7. # the name is misleading osx version is used for any unix like systems
  8. # the url is manually extracted from coreclr-outerloop (https://dev.azure.com/dnceng/public/_build?definitionId=98&_a=summary) Build artifacts published page
  9. CORECLR_TESTS:=https://dev.azure.com/dnceng/9ee6d478-d288-47f7-aacc-f6e6d082ae6d/_apis/build/builds/368250/artifacts?artifactName=Tests_OSX_x64_checked_outerloop&api-version=5.2-preview.5&%24format=zip
  10. # runtime version used by $(DOTNET) - local .net core sdk to bootstrap stuff
  11. # it doesn't match NETCOREAPP_VERSION
  12. BOOTSTRAP_RUNTIME = $(shell ls ../.dotnet/shared/Microsoft.NETCore.App | tail -1)
  13. ifeq ($(HOST_PLATFORM),win32)
  14. PLATFORM_AOT_SUFFIX := .dll
  15. PLATFORM_AOT_PREFIX :=
  16. NETCORESDK_EXT = zip
  17. UNZIPCMD = $(PYTHON) -c "import zipfile,sys; zipfile.ZipFile(sys.argv[1], 'r').extractall()"
  18. XUNIT_INNER_ARGS = -notrait category=nonwindowstests @../../../../CoreFX.issues_windows.rsp
  19. TESTS_PLATFORM = Windows_NT.x64
  20. ON_RUNTIME_EXTRACT = chmod -R 755 {host,shared,./dotnet}
  21. DOTNET := $(shell powershell -ExecutionPolicy Bypass -Command "./init-tools.ps1")/dotnet.exe
  22. DOTNET := "$(subst \,/,$(DOTNET))"
  23. endif
  24. ifeq ($(HOST_PLATFORM),macos)
  25. PLATFORM_AOT_SUFFIX := .dylib
  26. PLATFORM_AOT_PREFIX := lib
  27. OBJDUMP = objdump -x86-asm-syntax=intel --no-show-raw-insn -no-leading-addr -no-leading-headers -d
  28. NETCORESDK_EXT = tar.gz
  29. UNZIPCMD = tar -xvf
  30. XUNIT_INNER_ARGS = -notrait category=nonosxtests @../../../../CoreFX.issues_mac.rsp
  31. TESTS_PLATFORM = OSX.x64
  32. DOTNET := $(shell ./init-tools.sh | tail -1)
  33. endif
  34. ifeq ($(HOST_PLATFORM),linux)
  35. PLATFORM_AOT_SUFFIX := .so
  36. PLATFORM_AOT_PREFIX := lib
  37. OBJDUMP = objdump -M intel --no-show-raw-insn -d
  38. NETCORESDK_EXT = tar.gz
  39. UNZIPCMD = tar -xvf
  40. XUNIT_INNER_ARGS = -notrait category=nonlinuxtests @../../../../CoreFX.issues_linux.rsp
  41. ifeq ($(COREARCH), arm64)
  42. XUNIT_INNER_ARGS += @../../../../CoreFX.issues_linux_arm64.rsp
  43. endif
  44. TESTS_PLATFORM = Linux.x64
  45. DOTNET := $(shell ./init-tools.sh | tail -1)
  46. endif
  47. NETCORESDK_FILE := dotnet-runtime-$(NETCOREAPP_VERSION)-$(RID).$(NETCORESDK_EXT)
  48. NETCORE_URL := https://dotnetcli.blob.core.windows.net/dotnet/Runtime/$(NETCOREAPP_VERSION)/$(NETCORESDK_FILE)
  49. FEED_BASE_URL := https://dotnetfeed.blob.core.windows.net/dotnet-core
  50. TEST_ASSETS_PATH := corefx-tests/$(NETCORETESTS_VERSION)/$(TESTS_PLATFORM)/netcoreapp/corefx-test-assets.xml
  51. # used to calculate exact version number for generating nupkg
  52. BLAME = $(shell git blame ../configure.ac | grep AC_INIT | cut -f1 -d' ')
  53. VERSTUB = .$(shell git rev-list --count $(BLAME)..HEAD)-preview
  54. all: bcl
  55. $(NETCORESDK_FILE):
  56. curl $(NETCORE_URL) --output $(NETCORESDK_FILE)
  57. rm -rf shared/Microsoft.NETCore.App
  58. $(UNZIPCMD) $(NETCORESDK_FILE)
  59. $(ON_RUNTIME_EXTRACT)
  60. update-corefx: corefx/.stamp-dl-corefx-$(NETCORETESTS_VERSION)
  61. corefx/.stamp-dl-corefx-$(NETCORETESTS_VERSION): corefx-restore.csproj
  62. $(DOTNET) build corefx-restore.csproj --runtime $(RID) --packages corefx/packages -p:MicrosoftPrivateCoreFxNETCoreAppVersion=$(NETCORETESTS_VERSION) -p:OutputPath=corefx/restore/ -p:UseSharedCompilation=false
  63. touch $@
  64. update-roslyn: roslyn/packages/microsoft.net.compilers.toolset/$(ROSLYN_VERSION)/microsoft.net.compilers.toolset.nuspec
  65. roslyn/packages/microsoft.net.compilers.toolset/$(ROSLYN_VERSION)/microsoft.net.compilers.toolset.nuspec:
  66. $(DOTNET) restore roslyn-restore.csproj -p:RoslynVersion=$(ROSLYN_VERSION) --packages roslyn/packages -p:OutputPath=roslyn/restore/ -p:UseSharedCompilation=false
  67. run-sample: prepare
  68. $(DOTNET) build sample/HelloWorld
  69. MONO_ENV_OPTIONS="--debug" COMPlus_DebugWriteToStdErr=1 ./dotnet --fx-version "$(NETCOREAPP_VERSION)" sample/HelloWorld/bin/netcoreapp3.0/HelloWorld.dll
  70. run-sample-dbg: prepare
  71. $(DOTNET) build sample/HelloWorld
  72. MONO_ENV_OPTIONS="--debug --debugger-agent=transport=dt_socket,address=127.0.0.1:1235,server=y,suspend=y" COMPlus_DebugWriteToStdErr=1 ./dotnet --fx-version "$(NETCOREAPP_VERSION)" sample/HelloWorld/bin/netcoreapp3.0/HelloWorld.dll
  73. run-sample-coreclr:
  74. cd sample/HelloWorld && $(DOTNET) run
  75. # build any app in "self contained" mode and patch coreclr.dll and corelib with mono bits
  76. # e.g. `make patch-app APP_PATH=/my/aspnetapp`
  77. patch-app: prepare
  78. @if test -z "$(APP_PATH)"; then echo "APP_PATH is not set"; exit 1; fi
  79. cp NuGet.config $(APP_PATH)
  80. cd $(APP_PATH) && $(DOTNET) publish -c Release -r $(RID) -f netcoreapp3.0
  81. cp ../mono/mini/.libs/libmonosgen-2.0$(PLATFORM_AOT_SUFFIX) $(APP_PATH)/bin/Release/netcoreapp3.0/$(RID)/publish/$(PLATFORM_AOT_PREFIX)coreclr$(PLATFORM_AOT_SUFFIX)
  82. cp System.Private.CoreLib/bin/$(COREARCH)/System.Private.CoreLib.dll $(APP_PATH)/bin/Release/netcoreapp3.0/$(RID)/publish
  83. cp System.Private.CoreLib/bin/$(COREARCH)/System.Private.CoreLib.pdb $(APP_PATH)/bin/Release/netcoreapp3.0/$(RID)/publish
  84. # makes $(DOTNET) to use mono runtime (to run real-world apps using '$(DOTNET) run')
  85. patch-local-dotnet: prepare
  86. cp ../mono/mini/.libs/libmonosgen-2.0$(PLATFORM_AOT_SUFFIX) ../.dotnet/shared/Microsoft.NETCore.App/$(BOOTSTRAP_RUNTIME)/$(PLATFORM_AOT_PREFIX)coreclr$(PLATFORM_AOT_SUFFIX)
  87. cp System.Private.CoreLib/bin/$(COREARCH)/System.Private.CoreLib.dll ../.dotnet/shared/Microsoft.NETCore.App/$(BOOTSTRAP_RUNTIME)
  88. cp System.Private.CoreLib/bin/$(COREARCH)/System.Private.CoreLib.pdb ../.dotnet/shared/Microsoft.NETCore.App/$(BOOTSTRAP_RUNTIME)
  89. # Precompile BCL libs in $(DOTNET) using LLVM (requires `--enable-llvm` build)
  90. patch-local-dotnet-aot-llvm: patch-local-dotnet
  91. for assembly in ../.dotnet/shared/Microsoft.NETCore.App/$(BOOTSTRAP_RUNTIME)/*.dll; do \
  92. echo "[AOT] $$assembly"; \
  93. PATH="../llvm/usr/bin/:$(PATH)" \
  94. MONO_ENV_OPTIONS="--aot=llvm,mcpu=native" \
  95. $(DOTNET) $$assembly ; \
  96. done; \
  97. # run 'dotnet/performance' benchmarks
  98. # e.g. 'make run-benchmarks DOTNET_PERF_REPO=/prj/performance'
  99. # you can append BDN parameters at the end, e.g. ` -- --filter Burgers --keepFiles`
  100. # NOTE: we have to delete a couple of System.Drawing files to make it work
  101. run-benchmarks: patch-local-dotnet
  102. @if test -z "$(DOTNET_PERF_REPO)"; then echo "DOTNET_PERF_REPO is not set"; exit 1; fi
  103. cd $(DOTNET_PERF_REPO)/src/benchmarks/micro/ && \
  104. > corefx/System.Drawing/Perf_Color.cs && \
  105. > corefx/System.Drawing/Perf_Graphics_DrawBeziers.cs && \
  106. > corefx/System.Drawing/Perf_Graphics_Transforms.cs && \
  107. > corefx/System.Drawing/Perf_Image_Load.cs && \
  108. $(DOTNET) run -c Release -f netcoreapp5.0 --cli $(CURDIR)/../.dotnet/dotnet
  109. # run HelloWorld using --aot=llvm (requires `--enable-llvm` build)
  110. run-sample-local-dotnet-llvm: patch-local-dotnet
  111. $(DOTNET) build -c Release sample/HelloWorld
  112. PATH="../llvm/usr/bin/:$(PATH)" \
  113. MONO_ENV_OPTIONS="--aot=llvm,mcpu=native" \
  114. $(DOTNET) sample/HelloWorld/bin/netcoreapp3.0/HelloWorld.dll
  115. $(DOTNET) sample/HelloWorld/bin/netcoreapp3.0/HelloWorld.dll
  116. # COREHOST_TRACE=1
  117. SHAREDRUNTIME := shared/Microsoft.NETCore.App/$(NETCOREAPP_VERSION)
  118. System.Private.CoreLib/src/System/Environment.Mono.cs: System.Private.CoreLib/src/System/Environment.Mono.in config.make
  119. test -n '$(MONO_CORLIB_VERSION)'
  120. sed -e 's,@''MONO_CORLIB_VERSION@,$(MONO_CORLIB_VERSION),' $< > $@
  121. CORLIB_BUILD_FLAGS?=-c Release
  122. bcl: update-roslyn System.Private.CoreLib/src/System/Environment.Mono.cs
  123. $(DOTNET) build $(CORETARGETS) $(CORLIB_BUILD_FLAGS) -p:UseSharedCompilation=false -p:BuildArch=$(COREARCH) \
  124. -p:OutputPath=bin/$(COREARCH) \
  125. -p:RoslynPropsFile="../roslyn/packages/microsoft.net.compilers.toolset/$(ROSLYN_VERSION)/build/Microsoft.Net.Compilers.Toolset.props" \
  126. System.Private.CoreLib/System.Private.CoreLib.csproj
  127. debug-bcl:
  128. $(MAKE) bcl CORLIB_BUILD_FLAGS="-c Debug"
  129. runtime:
  130. $(MAKE) -C ../mono
  131. link-mono: $(SHAREDRUNTIME)/.stamp-link-mono
  132. $(SHAREDRUNTIME)/.stamp-link-mono: ../mono/mini/.libs/libmonosgen-2.0$(PLATFORM_AOT_SUFFIX) System.Private.CoreLib/bin/$(COREARCH)/System.Private.CoreLib.dll System.Private.CoreLib/bin/$(COREARCH)/System.Private.CoreLib.pdb
  133. cp ../mono/mini/.libs/libmonosgen-2.0$(PLATFORM_AOT_SUFFIX) $(SHAREDRUNTIME)/$(PLATFORM_AOT_PREFIX)coreclr$(PLATFORM_AOT_SUFFIX)
  134. cp System.Private.CoreLib/bin/$(COREARCH)/System.Private.CoreLib.dll $(SHAREDRUNTIME)
  135. cp System.Private.CoreLib/bin/$(COREARCH)/System.Private.CoreLib.pdb $(SHAREDRUNTIME)
  136. touch $@
  137. prepare: $(NETCORESDK_FILE) update-corefx update-roslyn link-mono
  138. pack-%:
  139. $(DOTNET) pack roslyn-restore.csproj -p:IsPackable=true -p:NuspecFile=$*.nuspec -p:NuspecProperties=\"RID=$(RID)\;VERSION=$(VERSION)$(VERSTUB)\;PLATFORM_AOT_SUFFIX=$(PLATFORM_AOT_SUFFIX)\;COREARCH=$(COREARCH)\;PLATFORM_AOT_PREFIX=$(PLATFORM_AOT_PREFIX)\" --output ../artifacts/ --no-build
  140. nupkg: pack-metapackage pack-runtime
  141. nupkg-llvm: pack-metapackage-llvm pack-runtime-llvm
  142. clean:
  143. rm -rf .configured ../.dotnet sdk shared host dotnet tests obj corefx roslyn LICENSE.txt ThirdPartyNotices.txt $(NETCORESDK_FILE)
  144. update-tests-corefx: corefx/.stamp-dl-corefx-tests-$(NETCORETESTS_VERSION)
  145. corefx/.stamp-dl-corefx-tests-$(NETCORETESTS_VERSION):
  146. rm -rf corefx/tests
  147. $(DOTNET) msbuild corefx-tests-restore.proj -m -t:DownloadAllTests -p:TEST_ASSETS_PATH="$(TEST_ASSETS_PATH)" -p:FEED_BASE_URL="$(FEED_BASE_URL)"
  148. rm -rf corefx/tests/extracted/System.Utf8String.Experimental.Tests
  149. touch $@
  150. #
  151. # Running CoreFX tests
  152. #
  153. # You can run either individual test assembly or run all CoreFX tests. The tests are automatically downloaded
  154. # from the shared location and built locally.
  155. #
  156. # Running all test: `make run-tests-corefx`
  157. #
  158. # Running individual test: MONO_ENV_OPTIONS="--debug" make run-tests-corefx-System.Collections.Tests
  159. #
  160. run-tests-corefx: prepare update-tests-corefx
  161. @rm -f .failures; \
  162. counter=0; \
  163. tests_count=$(words $(dir $(wildcard corefx/tests/extracted/*/))); \
  164. for testdir in corefx/tests/extracted/*; do \
  165. counter=$$((counter+1)); \
  166. testname=$$(basename $$testdir); \
  167. if [ -n "$$USE_TIMEOUT" ]; then timeoutcmd="../scripts/ci/run-step.sh --label=$$testname --timeout=10m --fatal"; fi; \
  168. $$timeoutcmd $(MAKE) run-tests-corefx-$$testname XUNIT_MONO_ENV_OPTIONS="$(XUNIT_MONO_ENV_OPTIONS)" XUNIT_ARGS="$(XUNIT_ARGS)" TEST_COUNTER="($$counter / $$tests_count) " || echo $$testname >> .failures; \
  169. done; \
  170. $(MAKE) xunit-summary; \
  171. if [ -e ".failures" ]; then \
  172. echo ""; \
  173. echo "Failures in test suites:"; \
  174. cat .failures; \
  175. echo ""; \
  176. exit 1; \
  177. fi
  178. run-tests-corefx-%: prepare update-tests-corefx
  179. @echo ""
  180. @echo "***************** $* $${TEST_COUNTER}*********************"
  181. @cp corefx/restore/corefx-restore.deps.json corefx/tests/extracted/$*/$*.deps.json
  182. @cp corefx/restore/corefx-restore.runtimeconfig.dev.json corefx/tests/extracted/$*/$*.runtimeconfig.dev.json
  183. @cp corefx/restore/corefx-restore.dll corefx/tests/extracted/$*/corefx-restore.dll
  184. @sed -i -e 's/5.0.0\"/$(NETCOREAPP_VERSION)\"/g' corefx/tests/extracted/$*/*.runtimeconfig.json
  185. cd corefx/tests/extracted/$* && \
  186. MONO_ENV_OPTIONS="--debug $(XUNIT_MONO_ENV_OPTIONS)" COMPlus_DebugWriteToStdErr=1 $(CURDIR)/./dotnet exec \
  187. --runtimeconfig $*.runtimeconfig.json --additional-deps $*.deps.json \
  188. --fx-version "$(NETCOREAPP_VERSION)" xunit.console.dll $*.dll \
  189. -html ../../TestResult-$*.html -xml ../../TestResult-$*-netcore-xunit.xml \
  190. $(XUNIT_INNER_ARGS) @../../../../CoreFX.issues.rsp \
  191. $(XUNIT_ARGS)
  192. # build a test assembly in COREFX_ROOT (path to a fully built corefx repo) and copy it to corefx/tests/extracted
  193. # e.g. `make build-test-corefx-System.Runtime COREFX_ROOT=/prj/corefx-master`
  194. build-test-corefx-%:
  195. cd $(COREFX_ROOT)/src/$*/tests && $(DOTNET) msbuild /p:OutputPath=tmp
  196. cp $(COREFX_ROOT)/src/$*/tests/tmp/$*.Tests.{dll,pdb} $(CURDIR)/corefx/tests/extracted/$*.Tests/
  197. rm -rf $(COREFX_ROOT)/src/$*/tests/tmp
  198. xunit-summary:
  199. ./xunit-summary.py "corefx/tests"
  200. update-tests-coreclr: coreclr/.stamp-tests
  201. coreclr/.stamp-tests:
  202. rm -rf coreclr/tests
  203. curl -L "$(CORECLR_TESTS)" --output coreclr/tests.zip
  204. tar -xvf coreclr/tests.zip -C coreclr/
  205. mkdir coreclr/tests
  206. tar -xvf coreclr/Tests_OSX_x64_checked_outerloop/Tests_OSX_x64_checked_outerloop.tar.gz -C coreclr/tests
  207. touch $@
  208. .PHONY: corerun
  209. corerun:
  210. $(MAKE) -C corerun
  211. cp corerun/corerun $(SHAREDRUNTIME)
  212. run-tests-coreclr: prepare update-tests-coreclr corerun
  213. rm -rf coreclr/output.log
  214. @counter=0; \
  215. failures=0; \
  216. test_files=$$(find coreclr/tests -type f -name "*.sh"); \
  217. for testdir in $$test_files; do \
  218. counter=$$((counter+1)); \
  219. echo "Running $$testdir"; \
  220. if sh $$testdir -coreroot=$(realpath $(SHAREDRUNTIME)) >>coreclr/output.log 2>&1 ; then \
  221. echo "FAILED"; \
  222. failures=$$((failures+1)); \
  223. fi; \
  224. done; \
  225. echo "Tests Count: $$counter"; \
  226. echo "Failed: $$failures"
  227. endif
  228. run-tests-mono: prepare
  229. failures=0; \
  230. counter=0; \
  231. test_prj_dir=''; \
  232. test_prj_name=''; \
  233. test_projects=$$(find tests -type f -name "*.csproj"); \
  234. for test_prj in $$test_projects; do \
  235. counter=$$((counter+1)); \
  236. echo "Running $$test_prj_dir"; \
  237. test_prj_dir=$$(dirname $$test_prj); \
  238. test_prj_name=$$(basename $$test_prj); \
  239. test_prj_name=$${test_prj_name%.*}; \
  240. $(DOTNET) build -c Release $$test_prj; \
  241. MONO_ENV_OPTIONS="--debug $(MONO_ENV_OPTIONS)" COMPlus_DebugWriteToStdErr=1 ./dotnet --fx-version "$(NETCOREAPP_VERSION)" $$test_prj_dir/bin/netcoreapp3.0/$$test_prj_name.dll; \
  242. if [ $$? -ne 0 ]; then \
  243. failures=$$((failures+1)); \
  244. fi; \
  245. done; \
  246. echo "======================"; \
  247. echo "Tests Count: $$counter"; \
  248. echo "Failed: $$failures"
  249. run-tests-coreclr-%: prepare update-tests-coreclr
  250. @echo ""
  251. @echo "***************** $* *********************"
  252. @test_sh=$$(find . -type f -name "$*.sh" | head -n 1); \
  253. if [ ! -z "$$test_sh" ]; then \
  254. MONO_ENV_OPTIONS="--debug" COMPlus_DebugWriteToStdErr=1 sh $$test_sh -coreroot="$(realpath $(SHAREDRUNTIME))"; \
  255. else \
  256. echo "Test file $*.sh not found"; \
  257. fi
  258. # dump asm for all methods in BCL using LLVM AOT, e.g.:
  259. # make dump-asm-bcl DUMPASM_OUT=dumps/before-my-jit-fix
  260. dump-asm-bcl: patch-local-dotnet
  261. @if test -z "$(DUMPASM_OUT)"; then echo "DUMPASM_OUT is not set"; exit 1; fi
  262. mkdir -p $(DUMPASM_OUT)
  263. for assembly in ../.dotnet/shared/Microsoft.NETCore.App/$(BOOTSTRAP_RUNTIME)/*.dll; do \
  264. printf "\n[AOT] $$(basename $$assembly):\n\n"; \
  265. $(MAKE) dump-asm-lib DUMPASM_LIB=$$assembly ; \
  266. done; \
  267. cd ../.dotnet/shared/Microsoft.NETCore.App/$(BOOTSTRAP_RUNTIME) && rm *.dll$(PLATFORM_AOT_SUFFIX)
  268. # dump asm for a specific assembly using LLVM AOT, e.g.:
  269. # make dump-asm-lib DUMPASM_OUT=dumps/before-my-jit-fix DUMPASM_LIB=/path/to/System.Private.CoreLib.dll
  270. dump-asm-lib: patch-local-dotnet
  271. @if test -z "$(DUMPASM_LIB)"; then echo "DUMPASM_LIB is not set"; exit 1; fi
  272. @if test -z "$(DUMPASM_OUT)"; then echo "DUMPASM_OUT is not set"; exit 1; fi
  273. mkdir -p $(DUMPASM_OUT)
  274. PATH="../llvm/usr/bin/:$(PATH)" \
  275. MONO_ENV_OPTIONS="--aot=llvm,mcpu=native" \
  276. $(DOTNET) $(DUMPASM_LIB)
  277. $(OBJDUMP) "$(DUMPASM_LIB)$(PLATFORM_AOT_SUFFIX)" > "$(DUMPASM_OUT)/$(notdir $(DUMPASM_LIB))$(PLATFORM_AOT_SUFFIX).dasm"
  278. # Generate asm diffs, a typical workflow may look like this:
  279. #
  280. # make dump-asm-bcl DUMPASM_OUT=dumps/before-my-jit-fix
  281. # (apply some runtime changes)
  282. # make runtime
  283. # make dump-asm-bcl DUMPASM_OUT=dumps/after-my-jit-fix
  284. # make jitdiff BEFORE=dumps/before-my-jit-fix AFTER=dumps/after-my-jit-fix
  285. #
  286. jitdiff:
  287. @if test -z "$(BEFORE)"; then echo "BEFORE is not set"; exit 1; fi
  288. @if test -z "$(AFTER)"; then echo "AFTER is not set"; exit 1; fi
  289. cd tools/jitdiff && $(DOTNET) run -c Release -- "$(BEFORE)" "$(AFTER)"
  290. distdir:
  291. distclean: