Makefile, mix.exs: Reduce build time
First, run mix(1) once from the Makefile. We use an mix alias to call all actual mix commands in a single run. Now `make app` takes care of calling the equivalent of `deps.get`, `deps.compile`, `compile` and `escript.build`. It doesn't match the expected Erlang.mk behavior but it saves us from starting mix(1) multiple times. Second, only build Erlang dependencies (rabbit_common and amqp_client) once from the Makefile (through Erlang.mk dependency mechanism). In `mix.exs`, their compile command is set to `true` because they are already up-to-date. This saves two no-op builds of those dependencies. On my laptop, this reduces the no-op build from 10 seconds to 5 seconds.
This commit is contained in:
		
							parent
							
								
									5905f1c40a
								
							
						
					
					
						commit
						407a315192
					
				|  | @ -32,7 +32,6 @@ $(HOME)/.mix/archives/hex-*: | ||||||
| hex: $(HOME)/.mix/archives/hex-* | hex: $(HOME)/.mix/archives/hex-* | ||||||
| 
 | 
 | ||||||
| deps:: hex | deps:: hex | ||||||
| 	$(verbose) mix make_deps |  | ||||||
| 
 | 
 | ||||||
| app:: $(ESCRIPTS) | app:: $(ESCRIPTS) | ||||||
| 	@: | 	@: | ||||||
|  | @ -40,6 +39,10 @@ app:: $(ESCRIPTS) | ||||||
| rabbitmqctl_srcs := mix.exs \
 | rabbitmqctl_srcs := mix.exs \
 | ||||||
| 		    $(shell find config lib -name "*.ex" -o -name "*.exs") | 		    $(shell find config lib -name "*.ex" -o -name "*.exs") | ||||||
| 
 | 
 | ||||||
|  | # Elixir dependencies are fetched and compiled as part of the alias
 | ||||||
|  | # `mix make_all`. We do not fetch and build them in `make deps` because
 | ||||||
|  | # mix(1) startup time is quite high. Thus we prefer to run it once, even
 | ||||||
|  | # though it kind of breaks the Erlang.mk model.
 | ||||||
| escript/rabbitmqctl: $(rabbitmqctl_srcs) deps | escript/rabbitmqctl: $(rabbitmqctl_srcs) deps | ||||||
| 	$(gen_verbose) mix make_all | 	$(gen_verbose) mix make_all | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -85,29 +85,20 @@ defmodule RabbitMQCtl.MixfileBase do | ||||||
|   # |   # | ||||||
|   # Type "mix help deps" for more examples and options |   # Type "mix help deps" for more examples and options | ||||||
|   defp deps(deps_dir) do |   defp deps(deps_dir) do | ||||||
|     # RabbitMQ components (rabbit_common and amqp_client) require GNU |  | ||||||
|     # Make. This ensures that GNU Make is available before we attempt |  | ||||||
|     # to use it. |  | ||||||
|     make = find_gnu_make() |  | ||||||
| 
 |  | ||||||
|     [ |     [ | ||||||
|       # { |       # We use `true` as the command to "build" rabbit_common and | ||||||
|       #   :rabbit, |       # amqp_client because Erlang.mk already built them. | ||||||
|       #   path: Path.join(deps_dir, "rabbit"), |  | ||||||
|       #   compile: make, |  | ||||||
|       #   override: true |  | ||||||
|       # }, |  | ||||||
|       { |       { | ||||||
|         :rabbit_common, |         :rabbit_common, | ||||||
|         path: Path.join(deps_dir, "rabbit_common"), |         path: Path.join(deps_dir, "rabbit_common"), | ||||||
|         compile: make, |         compile: "true", | ||||||
|         override: true |         override: true | ||||||
|       }, |       }, | ||||||
|       { |       { | ||||||
|         :amqp_client, |         :amqp_client, | ||||||
|         only: :test, |         only: :test, | ||||||
|         path: Path.join(deps_dir, "amqp_client"), |         path: Path.join(deps_dir, "amqp_client"), | ||||||
|         compile: make, |         compile: "true", | ||||||
|         override: true |         override: true | ||||||
|       }, |       }, | ||||||
|       {:amqp, "~> 0.1.5", only: :test}, |       {:amqp, "~> 0.1.5", only: :test}, | ||||||
|  | @ -123,34 +114,16 @@ defmodule RabbitMQCtl.MixfileBase do | ||||||
|         "deps.get", |         "deps.get", | ||||||
|         "deps.compile", |         "deps.compile", | ||||||
|       ], |       ], | ||||||
|       make_all: [ |       make_app: [ | ||||||
|         "compile", |         "compile", | ||||||
|         "escript.build", |         "escript.build", | ||||||
|       ] |       ], | ||||||
|  |       make_all: [ | ||||||
|  |         "deps.get", | ||||||
|  |         "deps.compile", | ||||||
|  |         "compile", | ||||||
|  |         "escript.build", | ||||||
|  |       ], | ||||||
|     ] |     ] | ||||||
|   end |   end | ||||||
| 
 |  | ||||||
|   defp find_gnu_make do |  | ||||||
|     possible_makes = [ |  | ||||||
|       System.get_env("MAKE"), |  | ||||||
|       "gmake", |  | ||||||
|       "make", |  | ||||||
|     ] |  | ||||||
|     test_gnu_make(possible_makes) |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
|   defp test_gnu_make([nil | rest]) do |  | ||||||
|     test_gnu_make(rest) |  | ||||||
|   end |  | ||||||
|   defp test_gnu_make([make | rest]) do |  | ||||||
|     {output, _} = System.cmd(make, ["--version"], stderr_to_stdout: true) |  | ||||||
|     case String.contains?(output, "GNU Make") do |  | ||||||
|       true  -> make |  | ||||||
|       false -> test_gnu_make(rest) |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
|   defp test_gnu_make([]) do |  | ||||||
|     nil |  | ||||||
|   end |  | ||||||
| 
 |  | ||||||
| end | end | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue