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-* | ||||
| 
 | ||||
| deps:: hex | ||||
| 	$(verbose) mix make_deps | ||||
| 
 | ||||
| app:: $(ESCRIPTS) | ||||
| 	@: | ||||
|  | @ -40,6 +39,10 @@ app:: $(ESCRIPTS) | |||
| rabbitmqctl_srcs := mix.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 | ||||
| 	$(gen_verbose) mix make_all | ||||
| 
 | ||||
|  |  | |||
|  | @ -85,29 +85,20 @@ defmodule RabbitMQCtl.MixfileBase do | |||
|   # | ||||
|   # Type "mix help deps" for more examples and options | ||||
|   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() | ||||
| 
 | ||||
|     [ | ||||
|       # { | ||||
|       #   :rabbit, | ||||
|       #   path: Path.join(deps_dir, "rabbit"), | ||||
|       #   compile: make, | ||||
|       #   override: true | ||||
|       # }, | ||||
|       # We use `true` as the command to "build" rabbit_common and | ||||
|       # amqp_client because Erlang.mk already built them. | ||||
|       { | ||||
|         :rabbit_common, | ||||
|         path: Path.join(deps_dir, "rabbit_common"), | ||||
|         compile: make, | ||||
|         compile: "true", | ||||
|         override: true | ||||
|       }, | ||||
|       { | ||||
|         :amqp_client, | ||||
|         only: :test, | ||||
|         path: Path.join(deps_dir, "amqp_client"), | ||||
|         compile: make, | ||||
|         compile: "true", | ||||
|         override: true | ||||
|       }, | ||||
|       {:amqp, "~> 0.1.5", only: :test}, | ||||
|  | @ -123,34 +114,16 @@ defmodule RabbitMQCtl.MixfileBase do | |||
|         "deps.get", | ||||
|         "deps.compile", | ||||
|       ], | ||||
|       make_all: [ | ||||
|       make_app: [ | ||||
|         "compile", | ||||
|         "escript.build", | ||||
|       ] | ||||
|       ], | ||||
|       make_all: [ | ||||
|         "deps.get", | ||||
|         "deps.compile", | ||||
|         "compile", | ||||
|         "escript.build", | ||||
|       ], | ||||
|     ] | ||||
|   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 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue