common.mk 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. all::
  2. ifeq ($(notdir $(firstword $(SUDO_COMMAND))),make)
  3. $(error Do not use 'sudo make')
  4. endif
  5. ifeq ($(SHELL),/bin/sh)
  6. export SHELL=/bin/bash
  7. endif
  8. THEOS_PROJECT_DIR ?= $(shell pwd)
  9. _THEOS_LOCAL_DATA_DIR := $(THEOS_PROJECT_DIR)/.theos
  10. _THEOS_BUILD_SESSION_FILE = $(_THEOS_LOCAL_DATA_DIR)/build_session
  11. ### Functions
  12. # Function for getting a clean absolute path from cd.
  13. __clean_pwd = $(shell (unset CDPATH; cd "$(1)"; pwd))
  14. # Truthiness
  15. _THEOS_TRUE := 1
  16. _THEOS_FALSE :=
  17. __theos_bool = $(if $(filter Y y YES yes TRUE true 1,$(1)),$(_THEOS_TRUE),$(_THEOS_FALSE))
  18. # Existence
  19. __exists = $(if $(wildcard $(1)),$(_THEOS_TRUE),$(_THEOS_FALSE))
  20. __executable = $(if $(shell PATH="$(THEOS_BIN_PATH):$$PATH" type "$(1)" > /dev/null 2>&1 && echo 1),$(_THEOS_TRUE),$(_THEOS_FALSE))
  21. # Static redefinition
  22. __simplify = $(2)$(eval $(1):=$(2))
  23. ###
  24. __THEOS_COMMON_MK_VERSION := 1k
  25. ifeq ($(_THEOS_PROJECT_MAKEFILE_NAME),)
  26. _THEOS_STATIC_MAKEFILE_LIST := $(filter-out $(lastword $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
  27. export _THEOS_PROJECT_MAKEFILE_NAME := $(notdir $(lastword $(_THEOS_STATIC_MAKEFILE_LIST)))
  28. endif
  29. ifeq ($(_THEOS_INTERNAL_TRUE_PATH),)
  30. _THEOS_RELATIVE_MAKE_PATH := $(dir $(lastword $(MAKEFILE_LIST)))
  31. _THEOS_INTERNAL_TRUE_PATH := $(call __clean_pwd,$(_THEOS_RELATIVE_MAKE_PATH)/..)
  32. ifneq ($(words $(_THEOS_INTERNAL_TRUE_PATH)),1) # It's a hack, but it works.
  33. $(shell unlink /tmp/theos &> /dev/null; ln -Ffs "$(_THEOS_INTERNAL_TRUE_PATH)" /tmp/theos)
  34. _THEOS_INTERNAL_TRUE_PATH := /tmp/theos
  35. endif
  36. override THEOS := $(_THEOS_INTERNAL_TRUE_PATH)
  37. export _THEOS_INTERNAL_TRUE_PATH
  38. endif
  39. THEOS_MAKE_PATH := $(THEOS)/makefiles
  40. THEOS_BIN_PATH := $(THEOS)/bin
  41. THEOS_LIBRARY_PATH := $(THEOS)/lib
  42. THEOS_VENDOR_LIBRARY_PATH := $(THEOS)/vendor/lib
  43. THEOS_INCLUDE_PATH := $(THEOS)/include
  44. THEOS_VENDOR_INCLUDE_PATH := $(THEOS)/vendor/include
  45. THEOS_FALLBACK_INCLUDE_PATH := $(THEOS)/include/_fallback
  46. THEOS_MODULE_PATH := $(THEOS)/mod
  47. export THEOS THEOS_BIN_PATH THEOS_MAKE_PATH THEOS_LIBRARY_PATH THEOS_VENDOR_LIBRARY_PATH THEOS_INCLUDE_PATH THEOS_VENDOR_INCLUDE_PATH THEOS_FALLBACK_INCLUDE_PATH
  48. export THEOS_PROJECT_DIR
  49. export PATH := $(THEOS_BIN_PATH):$(PATH)
  50. -include ~/.theosrc
  51. _THEOS_FINAL_PACKAGE := $(_THEOS_FALSE)
  52. ifeq ($(call __theos_bool,$(or $(FOR_RELEASE),$(FINALPACKAGE))),$(_THEOS_TRUE))
  53. _THEOS_FINAL_PACKAGE := $(_THEOS_TRUE)
  54. endif
  55. ifeq ($(THEOS_SCHEMA),)
  56. _THEOS_SCHEMA := $(shell echo "$(strip $(schema) $(SCHEMA))" | tr 'a-z' 'A-Z')
  57. _THEOS_ON_SCHEMA := DEFAULT $(filter-out -%,$(_THEOS_SCHEMA))
  58. ifeq ($(or $(debug),$(DEBUG))$(_THEOS_FINAL_PACKAGE),$(_THEOS_FALSE))
  59. DEBUG := 1
  60. endif
  61. ifeq ($(call __theos_bool,$(or $(debug),$(DEBUG))),$(_THEOS_TRUE))
  62. _THEOS_ON_SCHEMA += DEBUG
  63. endif
  64. _THEOS_OFF_SCHEMA := $(patsubst -%,%,$(filter -%,$(_THEOS_SCHEMA)))
  65. override THEOS_SCHEMA := $(strip $(filter-out $(_THEOS_OFF_SCHEMA),$(_THEOS_ON_SCHEMA)))
  66. override _THEOS_CLEANED_SCHEMA_SET := $(shell echo "$(filter-out DEFAULT,$(THEOS_SCHEMA))" | tr -Cd ' A-Z' | tr ' A-Z' '_a-z')
  67. export THEOS_SCHEMA _THEOS_CLEANED_SCHEMA_SET
  68. endif
  69. ###
  70. # __schema_defined_var_names bears explanation:
  71. # For each schema'd variable gathered from __schema_all_var_names, we generate a list of
  72. # "origin:name" pairs, and then filter out all pairs where the origin is "undefined".
  73. # We then substitute " " for ":" and take the last word, so we end up with only the entries from
  74. # __schema_all_var_names that are defined.
  75. __schema_all_var_names = $(foreach sch,$(THEOS_SCHEMA),$(subst DEFAULT.,,$(sch).)$(1)$(2))
  76. __schema_defined_var_names = $(foreach tuple,$(filter-out undefined:%,$(foreach schvar,$(call __schema_all_var_names,$(1),$(2)),$(origin $(schvar)):$(schvar))),$(lastword $(subst :, ,$(tuple))))
  77. __schema_var_all = $(strip $(foreach sch,$(call __schema_all_var_names,$(1),$(2)),$($(sch))))
  78. __schema_var_name_last = $(strip $(lastword $(call __schema_defined_var_names,$(1),$(2))))
  79. __schema_var_last = $(strip $($(lastword $(call __schema_defined_var_names,$(1),$(2)))))
  80. ifeq ($(_THEOS_HAS_STAGING_LAYOUT),)
  81. _THEOS_HAS_STAGING_LAYOUT := $(call __exists,$(THEOS_PROJECT_DIR)/layout)
  82. endif
  83. _THEOS_LOAD_MODULES := $(sort $(call __schema_var_all,,MODULES) $(THEOS_AUTOLOAD_MODULES))
  84. __mod = -include $$(foreach mod,$$(_THEOS_LOAD_MODULES),$$(THEOS_MODULE_PATH)/$$(mod)/$(1))
  85. include $(THEOS_MAKE_PATH)/legacy.mk
  86. ifneq ($(_THEOS_PLATFORM_CALCULATED),1)
  87. uname_s := $(shell uname -s)
  88. uname_p := $(shell uname -p)
  89. uname_o := $(shell uname -o 2>/dev/null)
  90. ifeq ($(uname_s)-$(uname_p),Darwin-arm64)
  91. uname_p = arm
  92. endif
  93. export _THEOS_PLATFORM_ARCH = $(uname_s)-$(uname_p)
  94. export _THEOS_PLATFORM = $(uname_s)
  95. export _THEOS_OS = $(uname_o)
  96. ifeq ($(_THEOS_OS),)
  97. export _THEOS_OS = $(_THEOS_PLATFORM)
  98. endif
  99. export _THEOS_PLATFORM_CALCULATED := 1
  100. endif
  101. -include $(THEOS_MAKE_PATH)/platform/$(_THEOS_PLATFORM_ARCH).mk
  102. -include $(THEOS_MAKE_PATH)/platform/$(_THEOS_PLATFORM).mk
  103. -include $(THEOS_MAKE_PATH)/platform/$(_THEOS_OS).mk
  104. $(eval $(call __mod,platform/$(_THEOS_PLATFORM_ARCH).mk))
  105. $(eval $(call __mod,platform/$(_THEOS_PLATFORM).mk))
  106. $(eval $(call __mod,platform/$(_THEOS_OS).mk))
  107. ifneq ($(_THEOS_TARGET_CALCULATED),1)
  108. __TARGET_MAKEFILE := $(shell $(THEOS_BIN_PATH)/target.pl "$(target)" "$(call __schema_var_last,,TARGET)" "$(_THEOS_PLATFORM_DEFAULT_TARGET)")
  109. -include $(__TARGET_MAKEFILE)
  110. $(shell rm -f $(__TARGET_MAKEFILE) > /dev/null 2>&1)
  111. export _THEOS_TARGET := $(__THEOS_TARGET_ARG_0)
  112. ifeq ($(_THEOS_TARGET),)
  113. $(error You did not specify a target, and the "$(THEOS_PLATFORM_NAME)" platform does not define a default target)
  114. endif
  115. _THEOS_TARGET_CALCULATED := 1
  116. endif
  117. -include $(THEOS_MAKE_PATH)/targets/$(_THEOS_PLATFORM_ARCH)/$(_THEOS_TARGET).mk
  118. -include $(THEOS_MAKE_PATH)/targets/$(_THEOS_PLATFORM)/$(_THEOS_TARGET).mk
  119. -include $(THEOS_MAKE_PATH)/targets/$(_THEOS_OS)/$(_THEOS_TARGET).mk
  120. -include $(THEOS_MAKE_PATH)/targets/$(_THEOS_TARGET).mk
  121. $(eval $(call __mod,targets/$(_THEOS_PLATFORM_ARCH)/$(_THEOS_TARGET).mk))
  122. $(eval $(call __mod,targets/$(_THEOS_PLATFORM)/$(_THEOS_TARGET).mk))
  123. $(eval $(call __mod,targets/$(_THEOS_OS)/$(_THEOS_TARGET).mk))
  124. $(eval $(call __mod,targets/$(_THEOS_TARGET).mk))
  125. ifneq ($(_THEOS_TARGET_LOADED),1)
  126. $(error The "$(_THEOS_TARGET)" target is not supported on the "$(THEOS_PLATFORM_NAME)" platform)
  127. endif
  128. _THEOS_TARGET_NAME_DEFINE := $(shell echo "$(THEOS_TARGET_NAME)" | tr 'a-z' 'A-Z')
  129. export TARGET_CC TARGET_CXX TARGET_LD TARGET_STRIP TARGET_CODESIGN_ALLOCATE TARGET_CODESIGN TARGET_CODESIGN_FLAGS
  130. THEOS_TARGET_INCLUDE_PATH := $(THEOS_INCLUDE_PATH)/$(THEOS_TARGET_NAME)
  131. THEOS_TARGET_LIBRARY_PATH := $(THEOS_LIBRARY_PATH)/$(THEOS_TARGET_NAME)
  132. _THEOS_TARGET_HAS_INCLUDE_PATH := $(call __exists,$(THEOS_TARGET_INCLUDE_PATH))
  133. _THEOS_TARGET_HAS_LIBRARY_PATH := $(call __exists,$(THEOS_TARGET_LIBRARY_PATH))
  134. # Package Format requires Target default and falls back to `none'.
  135. _THEOS_PACKAGE_FORMAT := $(or $(call __schema_var_last,,PACKAGE_FORMAT),$(_THEOS_TARGET_DEFAULT_PACKAGE_FORMAT),none)
  136. _THEOS_PACKAGE_LAST_FILENAME = $(call __simplify,_THEOS_PACKAGE_LAST_FILENAME,$(shell cat "$(_THEOS_LOCAL_DATA_DIR)/last_package" 2>/dev/null))
  137. # ObjC/++ stuff is not here, it's in instance/rules.mk and only added if there are OBJC/OBJCC objects.
  138. _THEOS_INTERNAL_LDFLAGS = $(if $(_THEOS_TARGET_HAS_LIBRARY_PATH),-L$(THEOS_TARGET_LIBRARY_PATH) )-L$(THEOS_LIBRARY_PATH) -L$(THEOS_VENDOR_LIBRARY_PATH)
  139. DEBUGFLAG ?= -ggdb
  140. DEBUG.CFLAGS = -DDEBUG $(DEBUGFLAG) -O0
  141. DEBUG.SWIFTFLAGS = -DDEBUG -Onone
  142. DEBUG.LDFLAGS = $(DEBUGFLAG) -O0
  143. _THEOS_SHOULD_STRIP_DEFAULT := $(_THEOS_TRUE)
  144. ifeq ($(findstring DEBUG,$(THEOS_SCHEMA)),)
  145. _THEOS_SHOULD_STRIP_DEFAULT := $(_THEOS_FALSE)
  146. PACKAGE_BUILDNAME ?= debug
  147. endif
  148. SHOULD_STRIP := $(call __theos_bool,$(or $(strip),$(STRIP),$(_THEOS_SHOULD_STRIP_DEFAULT)))
  149. ifeq ($(SHOULD_STRIP),$(_THEOS_TRUE))
  150. OPTFLAG ?= -Os
  151. SWIFT_OPTFLAG ?= -O
  152. else
  153. TARGET_STRIP = :
  154. OPTFLAG ?= -O0
  155. endif
  156. CFLAGS += -I$(THEOS_VENDOR_INCLUDE_PATH) -I$(THEOS_FALLBACK_INCLUDE_PATH)
  157. _THEOS_INTERNAL_CFLAGS = -DTARGET_$(_THEOS_TARGET_NAME_DEFINE)=1 $(OPTFLAG) -Wall
  158. _THEOS_INTERNAL_IFLAGS = $(if $(_THEOS_TARGET_HAS_INCLUDE_PATH),-I$(THEOS_TARGET_INCLUDE_PATH) )-I$(THEOS_INCLUDE_PATH) -include $(THEOS)/Prefix.pch
  159. _THEOS_INTERNAL_SWIFTFLAGS = -DTARGET_$(_THEOS_TARGET_NAME_DEFINE)=1 $(SWIFT_OPTFLAG) $(if $(_THEOS_TARGET_HAS_INCLUDE_PATH),-I$(THEOS_TARGET_INCLUDE_PATH) )-I$(THEOS_INCLUDE_PATH) -import-objc-header $(THEOS)/Prefix.pch -module-name $(THEOS_CURRENT_INSTANCE)
  160. ifneq ($(GO_EASY_ON_ME),1)
  161. _THEOS_INTERNAL_LOGOSFLAGS += -c warnings=error
  162. _THEOS_INTERNAL_CFLAGS += -Werror
  163. endif
  164. ifeq ($(call __theos_bool,$(or $(FORCE_COLOR),$(_THEOS_FALSE))),$(_THEOS_TRUE))
  165. _THEOS_INTERNAL_CFLAGS += -fcolor-diagnostics
  166. _THEOS_INTERNAL_LDFLAGS += -fcolor-diagnostics
  167. endif
  168. THEOS_BUILD_DIR ?= .
  169. ifneq ($(_THEOS_CLEANED_SCHEMA_SET),)
  170. _THEOS_OBJ_DIR_EXTENSION = /$(_THEOS_CLEANED_SCHEMA_SET)
  171. endif
  172. ifneq ($(THEOS_TARGET_NAME),$(_THEOS_PLATFORM_DEFAULT_TARGET))
  173. THEOS_OBJ_DIR_NAME ?= obj/$(THEOS_TARGET_NAME)$(_THEOS_OBJ_DIR_EXTENSION)
  174. else
  175. THEOS_OBJ_DIR_NAME ?= obj$(_THEOS_OBJ_DIR_EXTENSION)
  176. endif
  177. ifeq ($(THEOS_CURRENT_ARCH),)
  178. THEOS_OBJ_DIR = $(_THEOS_LOCAL_DATA_DIR)/$(THEOS_OBJ_DIR_NAME)
  179. else
  180. THEOS_OBJ_DIR = $(_THEOS_LOCAL_DATA_DIR)/$(THEOS_OBJ_DIR_NAME)/$(THEOS_CURRENT_ARCH)
  181. endif
  182. THEOS_STAGING_DIR_NAME ?= _
  183. THEOS_STAGING_DIR = $(_THEOS_LOCAL_DATA_DIR)/$(THEOS_STAGING_DIR_NAME)
  184. _SPACE :=
  185. _SPACE +=
  186. _THEOS_ESCAPED_STAGING_DIR = $(subst $(_SPACE),\ ,$(THEOS_STAGING_DIR))
  187. THEOS_PACKAGE_DIR_NAME ?= debs
  188. THEOS_PACKAGE_DIR = $(THEOS_BUILD_DIR)/$(THEOS_PACKAGE_DIR_NAME)
  189. # $(warning ...) expands to the empty string, so the contents of THEOS_STAGING_DIR are not damaged in this copy.
  190. FW_PACKAGE_STAGING_DIR = $(THEOS_STAGING_DIR)$(warning FW_PACKAGE_STAGING_DIR is deprecated; please use THEOS_STAGING_DIR)
  191. THEOS_SUBPROJECT_PRODUCT = subproject.o
  192. include $(THEOS_MAKE_PATH)/messages.mk
  193. ifeq ($(_THEOS_VERBOSE),$(_THEOS_FALSE))
  194. _THEOS_NO_PRINT_DIRECTORY_FLAG := --no-print-directory
  195. else
  196. _THEOS_NO_PRINT_DIRECTORY_FLAG :=
  197. endif
  198. unexport THEOS_CURRENT_INSTANCE _THEOS_CURRENT_TYPE
  199. THEOS_RSYNC_EXCLUDES ?= _MTN .git .svn .DS_Store ._*
  200. _THEOS_RSYNC_EXCLUDE_COMMANDLINE := $(foreach exclude,$(THEOS_RSYNC_EXCLUDES),--exclude "$(exclude)")
  201. FAKEROOT := $(THEOS_BIN_PATH)/fakeroot.sh -p "$(_THEOS_LOCAL_DATA_DIR)/fakeroot"
  202. export FAKEROOT
  203. _THEOS_MAKE_PARALLEL_BUILDING ?= yes
  204. ifeq ($(THEOS_CURRENT_INSTANCE),)
  205. include $(THEOS_MAKE_PATH)/stage.mk
  206. include $(THEOS_MAKE_PATH)/package.mk
  207. endif
  208. THEOS_PACKAGE_VERSION = $(call __simplify,THEOS_PACKAGE_VERSION,$(THEOS_PACKAGE_BASE_VERSION)$(warning THEOS_PACKAGE_VERSION is deprecated. Please migrate to THEOS_PACKAGE_BASE_VERSION.))
  209. $(eval $(call __mod,common.mk))