relx.mk 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. # Copyright (c) 2013-2016, Loïc Hoguin <essen@ninenines.eu>
  2. # This file is part of erlang.mk and subject to the terms of the ISC License.
  3. ifeq ($(filter relx,$(BUILD_DEPS) $(DEPS) $(REL_DEPS)),relx)
  4. .PHONY: relx-rel relx-relup distclean-relx-rel run
  5. # Configuration.
  6. RELX_CONFIG ?= $(CURDIR)/relx.config
  7. RELX_CONFIG_SCRIPT ?= $(CURDIR)/relx.config.script
  8. RELX_OUTPUT_DIR ?= _rel
  9. RELX_REL_EXT ?=
  10. RELX_TAR ?= 1
  11. ifdef SFX
  12. RELX_TAR = 1
  13. endif
  14. # Core targets.
  15. ifeq ($(IS_DEP),)
  16. ifneq ($(wildcard $(RELX_CONFIG))$(wildcard $(RELX_CONFIG_SCRIPT)),)
  17. rel:: relx-rel
  18. relup:: relx-relup
  19. endif
  20. endif
  21. distclean:: distclean-relx-rel
  22. # Plugin-specific targets.
  23. define relx_get_config.erl
  24. (fun() ->
  25. Config0 =
  26. case file:consult("$(call core_native_path,$(RELX_CONFIG))") of
  27. {ok, Terms} ->
  28. Terms;
  29. {error, _} ->
  30. []
  31. end,
  32. case filelib:is_file("$(call core_native_path,$(RELX_CONFIG_SCRIPT))") of
  33. true ->
  34. Bindings = erl_eval:add_binding('CONFIG', Config0, erl_eval:new_bindings()),
  35. {ok, Config1} = file:script("$(call core_native_path,$(RELX_CONFIG_SCRIPT))", Bindings),
  36. Config1;
  37. false ->
  38. Config0
  39. end
  40. end)()
  41. endef
  42. define relx_release.erl
  43. Config = $(call relx_get_config.erl),
  44. {release, {Name, Vsn0}, _} = lists:keyfind(release, 1, Config),
  45. Vsn = case Vsn0 of
  46. {cmd, Cmd} -> os:cmd(Cmd);
  47. semver -> "";
  48. {semver, _} -> "";
  49. {git, short} -> string:trim(os:cmd("git rev-parse --short HEAD"), both, "\n");
  50. {git, long} -> string:trim(os:cmd("git rev-parse HEAD"), both, "\n");
  51. VsnStr -> Vsn0
  52. end,
  53. {ok, _} = relx:build_release(#{name => Name, vsn => Vsn}, Config),
  54. halt(0).
  55. endef
  56. define relx_tar.erl
  57. Config = $(call relx_get_config.erl),
  58. {release, {Name, Vsn0}, _} = lists:keyfind(release, 1, Config),
  59. Vsn = case Vsn0 of
  60. {cmd, Cmd} -> os:cmd(Cmd);
  61. semver -> "";
  62. {semver, _} -> "";
  63. {git, short} -> string:trim(os:cmd("git rev-parse --short HEAD"), both, "\n");
  64. {git, long} -> string:trim(os:cmd("git rev-parse HEAD"), both, "\n");
  65. VsnStr -> Vsn0
  66. end,
  67. {ok, _} = relx:build_tar(#{name => Name, vsn => Vsn}, Config),
  68. halt(0).
  69. endef
  70. define relx_relup.erl
  71. Config = $(call relx_get_config.erl),
  72. {release, {Name, Vsn0}, _} = lists:keyfind(release, 1, Config),
  73. Vsn = case Vsn0 of
  74. {cmd, Cmd} -> os:cmd(Cmd);
  75. semver -> "";
  76. {semver, _} -> "";
  77. {git, short} -> string:trim(os:cmd("git rev-parse --short HEAD"), both, "\n");
  78. {git, long} -> string:trim(os:cmd("git rev-parse HEAD"), both, "\n");
  79. VsnStr -> Vsn0
  80. end,
  81. {ok, _} = relx:build_relup(Name, Vsn, undefined, Config ++ [{output_dir, "$(RELX_OUTPUT_DIR)"}]),
  82. halt(0).
  83. endef
  84. relx-rel: rel-deps app
  85. $(call erlang,$(call relx_release.erl),-pa ebin/)
  86. $(verbose) $(MAKE) relx-post-rel
  87. ifeq ($(RELX_TAR),1)
  88. $(call erlang,$(call relx_tar.erl),-pa ebin/)
  89. endif
  90. relx-relup: rel-deps app
  91. $(call erlang,$(call relx_release.erl),-pa ebin/)
  92. $(MAKE) relx-post-rel
  93. $(call erlang,$(call relx_relup.erl),-pa ebin/)
  94. ifeq ($(RELX_TAR),1)
  95. $(call erlang,$(call relx_tar.erl),-pa ebin/)
  96. endif
  97. distclean-relx-rel:
  98. $(gen_verbose) rm -rf $(RELX_OUTPUT_DIR)
  99. # Default hooks.
  100. relx-post-rel::
  101. $(verbose) :
  102. # Run target.
  103. ifeq ($(wildcard $(RELX_CONFIG))$(wildcard $(RELX_CONFIG_SCRIPT)),)
  104. run::
  105. else
  106. define get_relx_release.erl
  107. Config = $(call relx_get_config.erl),
  108. {release, {Name, Vsn0}, _} = lists:keyfind(release, 1, Config),
  109. Vsn = case Vsn0 of
  110. {cmd, Cmd} -> os:cmd(Cmd);
  111. semver -> "";
  112. {semver, _} -> "";
  113. {git, short} -> string:trim(os:cmd("git rev-parse --short HEAD"), both, "\n");
  114. {git, long} -> string:trim(os:cmd("git rev-parse HEAD"), both, "\n");
  115. VsnStr -> Vsn0
  116. end,
  117. Extended = case lists:keyfind(extended_start_script, 1, Config) of
  118. {_, true} -> "1";
  119. _ -> ""
  120. end,
  121. io:format("~s ~s ~s", [Name, Vsn, Extended]),
  122. halt(0).
  123. endef
  124. RELX_REL := $(shell $(call erlang,$(get_relx_release.erl)))
  125. RELX_REL_NAME := $(word 1,$(RELX_REL))
  126. RELX_REL_VSN := $(word 2,$(RELX_REL))
  127. RELX_REL_CMD := $(if $(word 3,$(RELX_REL)),console)
  128. ifeq ($(PLATFORM),msys2)
  129. RELX_REL_EXT := .cmd
  130. endif
  131. run:: all
  132. $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_REL_NAME)/bin/$(RELX_REL_NAME)$(RELX_REL_EXT) $(RELX_REL_CMD)
  133. ifdef RELOAD
  134. rel::
  135. $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_REL_NAME)/bin/$(RELX_REL_NAME)$(RELX_REL_EXT) ping
  136. $(verbose) $(RELX_OUTPUT_DIR)/$(RELX_REL_NAME)/bin/$(RELX_REL_NAME)$(RELX_REL_EXT) \
  137. eval "io:format(\"~p~n\", [c:lm()])."
  138. endif
  139. help::
  140. $(verbose) printf "%s\n" "" \
  141. "Relx targets:" \
  142. " run Compile the project, build the release and run it"
  143. endif
  144. endif