package.mk 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. ifeq ($(_THEOS_PACKAGE_RULES_LOADED),)
  2. _THEOS_PACKAGE_RULES_LOADED := 1
  3. ## Packaging Core Rules
  4. .PHONY: package internal-package-check before-package internal-package after-package
  5. package:: internal-package-check stage before-package internal-package after-package
  6. before-package:: $(THEOS_PACKAGE_DIR)
  7. internal-package::
  8. ifeq ($(_THEOS_FINAL_PACKAGE),$(_THEOS_TRUE))
  9. find $(THEOS_STAGING_DIR) -name \*.png -exec pincrush -i {} \;
  10. find $(THEOS_STAGING_DIR) \( -name \*.plist -or -name \*.strings \) -exec plutil -convert binary1 {} \;
  11. endif
  12. internal-package-check::
  13. @:
  14. # __THEOS_LAST_PACKAGE_FILENAME is to be set by a rule variable in the package format makefile.
  15. after-package::
  16. @echo "$(__THEOS_LAST_PACKAGE_FILENAME)" > "$(_THEOS_LOCAL_DATA_DIR)/last_package"
  17. THEOS_PACKAGE_NAME :=
  18. THEOS_PACKAGE_ARCH :=
  19. THEOS_PACKAGE_BASE_VERSION :=
  20. # THEOS_PACKAGE_VERSION is set in common.mk (to give its warning.)
  21. -include $(THEOS_MAKE_PATH)/package/$(_THEOS_PACKAGE_FORMAT).mk
  22. $(eval $(call __mod,package/$(_THEOS_PACKAGE_FORMAT).mk))
  23. ifeq ($(_THEOS_PACKAGE_FORMAT_LOADED),)
  24. $(error I simply cannot figure out how to create $(_THEOS_PACKAGE_FORMAT)-format packages.)
  25. endif
  26. export THEOS_PACKAGE_NAME THEOS_PACKAGE_ARCH THEOS_PACKAGE_BASE_VERSION
  27. # These are here to be used by the package makefile included above.
  28. # We want them after the package makefile so that we can use variables set within it.
  29. # eval PACKAGE_VERSION *now* (to clear out references to VERSION.*: they have no bearing on
  30. # the 'base' version we calculate.)
  31. VERSION.INC_BUILD_NUMBER := X
  32. VERSION.EXTRAVERSION := X
  33. __USERVER_FOR_BUILDNUM := $(PACKAGE_VERSION)
  34. __BASEVER_FOR_BUILDNUM = $(or $(__USERVER_FOR_BUILDNUM),$(THEOS_PACKAGE_BASE_VERSION))
  35. # We simplify the version vars so that they are evaluated only when completely necessary.
  36. # This is because they can include things like incrementing build numbers.
  37. # I am committing a willful departure from the THEOS_ naming convention, because I believe
  38. # that offering these via an easy-to-use interface makes more sense than hiding them behind
  39. # a really stupidly long name.
  40. # VERSION.* are meant to be used in user PACKAGE_VERSIONs.
  41. VERSION.EXTRAVERSION = $(if $(PACKAGE_BUILDNAME),+$(PACKAGE_BUILDNAME))
  42. ifeq ($(_THEOS_FINAL_PACKAGE),$(_THEOS_TRUE))
  43. VERSION.EXTRAVERSION = $(if $(PACKAGE_BUILDNAME),+$(PACKAGE_BUILDNAME))
  44. _THEOS_PACKAGE_DEFAULT_VERSION_FORMAT = $(THEOS_PACKAGE_BASE_VERSION)$(VERSION.EXTRAVERSION)
  45. else
  46. VERSION.INC_BUILD_NUMBER = $(shell THEOS_PROJECT_DIR="$(THEOS_PROJECT_DIR)" "$(THEOS_BIN_PATH)/package_version.sh" -N "$(THEOS_PACKAGE_NAME)" -V "$(__BASEVER_FOR_BUILDNUM)")
  47. _THEOS_PACKAGE_DEFAULT_VERSION_FORMAT = $(THEOS_PACKAGE_BASE_VERSION)-$(VERSION.INC_BUILD_NUMBER)$(VERSION.EXTRAVERSION)
  48. endif
  49. # Copy the actual value of PACKAGE_VERSION to __PACKAGE_VERSION and replace PACKAGE_VERSION with
  50. # a mere reference (to a simplified copy.)
  51. # We're doing this to clean up the user's PACKAGE_VERSION and make it safe for reuse.
  52. # (otherwise, they might trigger build number increases without meaning to.)
  53. # Defer the simplification until __PACKAGE_VERSION is used - do not do it before the eval
  54. # However, we want to do the schema calculation and value stuff before the eval, so that
  55. # __PACKAGE_VERSION becomes an exact copy of the PACKAGE_VERSION variable we chose.
  56. $(eval __PACKAGE_VERSION = $$(call __simplify,__PACKAGE_VERSION,$(value $(call __schema_var_name_last,,PACKAGE_VERSION))))
  57. override PACKAGE_VERSION = $(__PACKAGE_VERSION)
  58. _THEOS_INTERNAL_PACKAGE_VERSION = $(call __simplify,_THEOS_INTERNAL_PACKAGE_VERSION,$(or $(__PACKAGE_VERSION),$(_THEOS_PACKAGE_DEFAULT_VERSION_FORMAT),1))
  59. ## Installation Core Rules
  60. install:: before-install internal-install after-install
  61. internal-install-check::
  62. @if [ -z "$(_THEOS_PACKAGE_LAST_FILENAME)" ]; then \
  63. $(PRINT_FORMAT_ERROR) "$(MAKE) install and show require that you build a package before you try to install it." >&2; \
  64. exit 1; \
  65. fi
  66. @if [ ! -f "$(_THEOS_PACKAGE_LAST_FILENAME)" ]; then \
  67. $(PRINT_FORMAT_ERROR) "Could not find \"$(_THEOS_PACKAGE_LAST_FILENAME)\" to install. Aborting." >&2; \
  68. exit 1; \
  69. fi
  70. export TARGET_INSTALL_REMOTE
  71. _THEOS_INSTALL_TYPE := local
  72. ifeq ($(TARGET_INSTALL_REMOTE),$(_THEOS_TRUE))
  73. _THEOS_INSTALL_TYPE := remote
  74. ifeq ($(THEOS_DEVICE_IP),)
  75. internal-install::
  76. @$(PRINT_FORMAT_ERROR) "$(MAKE) install requires that you set THEOS_DEVICE_IP in your environment." >&2
  77. @$(PRINT_FORMAT) "It is also recommended that you have public-key authentication set up for root over SSH, or you will be entering your password a lot." >&2
  78. @exit 1
  79. endif # THEOS_DEVICE_IP == ""
  80. THEOS_DEVICE_USER ?= root
  81. export THEOS_DEVICE_IP THEOS_DEVICE_PORT THEOS_DEVICE_USER
  82. endif # TARGET_INSTALL_REMOTE == true
  83. _THEOS_SUDO_COMMAND ?= $(THEOS_SUDO_COMMAND)
  84. ifeq ($(THEOS_DEVICE_USER),root)
  85. _THEOS_SUDO_COMMAND =
  86. endif
  87. after-install:: internal-after-install
  88. before-install::
  89. ifeq ($(PREINSTALL_TARGET_PROCESSES),)
  90. @:
  91. else
  92. $(ECHO_PRE_UNLOADING)install.exec "killall $(PREINSTALL_TARGET_PROCESSES) 2>/dev/null || true"$(ECHO_END)
  93. endif
  94. internal-install::
  95. @:
  96. internal-after-install::
  97. ifeq ($(INSTALL_TARGET_PROCESSES),)
  98. @:
  99. else
  100. $(ECHO_UNLOADING)install.exec "killall $(INSTALL_TARGET_PROCESSES) 2>/dev/null || true"$(ECHO_END)
  101. endif
  102. -include $(THEOS_MAKE_PATH)/install/$(_THEOS_PACKAGE_FORMAT)_$(_THEOS_INSTALL_TYPE).mk
  103. $(eval $(call __mod,install/$(_THEOS_PACKAGE_FORMAT)_$(_THEOS_INSTALL_TYPE).mk))
  104. endif # _THEOS_PACKAGE_RULES_LOADED
  105. show:: internal-install-check
  106. ifeq ($(_THEOS_PLATFORM_SHOW_IN_FILE_MANAGER),)
  107. @$(PRINT_FORMAT_ERROR) "It is not known how to open the file manager on this platform." >&2; exit 1
  108. else
  109. $(_THEOS_PLATFORM_SHOW_IN_FILE_MANAGER) "$(shell cat "$(_THEOS_LOCAL_DATA_DIR)/last_package")"
  110. endif