diff --git a/build_info/libkrw-dev.control b/build_info/libkrw-dev.control
index a5279f87da..56ca58ae13 100644
--- a/build_info/libkrw-dev.control
+++ b/build_info/libkrw-dev.control
@@ -1,10 +1,10 @@
Package: libkrw-dev
-Author: Siguza
+Author: Cryptiiiic
Maintainer: @DEB_MAINTAINER@
Architecture: @DEB_ARCH@
Version: @DEB_LIBKRW_V@
Depends: libkrw0 (= @DEB_LIBKRW_V@)
Section: Development
Priority: optional
-Homepage: https://github.com/Siguza/libkrw
+Homepage: https://github.com/Cryptiiiic/libkrw
Description: A kernel R/W API for jailbreaks (Development Files)
diff --git a/build_info/libkrw0-tfp0.control b/build_info/libkrw0-tfp0.control
index 180fa295ba..30971cc7ce 100644
--- a/build_info/libkrw0-tfp0.control
+++ b/build_info/libkrw0-tfp0.control
@@ -1,5 +1,5 @@
Package: libkrw0-tfp0
-Author: Siguza
+Author: Cryptiiiic
Maintainer: @DEB_MAINTAINER@
Architecture: @DEB_ARCH@
Version: @DEB_LIBKRW_V@
@@ -7,5 +7,5 @@ Provides: libkrw0-plugin
Enhances: libkrw0
Section: Libraries
Priority: standard
-Homepage: https://github.com/Siguza/libkrw
+Homepage: https://github.com/Cryptiiiic/libkrw
Description: Plugin for libkrw that interfaces with tfp0/hgsp4 (Shared Library)
diff --git a/build_info/libkrw0.control b/build_info/libkrw0.control
index 252dc6bf1b..c4f3330930 100644
--- a/build_info/libkrw0.control
+++ b/build_info/libkrw0.control
@@ -1,5 +1,5 @@
Package: libkrw0
-Author: Siguza
+Author: Cryptiiiic
Maintainer: @DEB_MAINTAINER@
Architecture: @DEB_ARCH@
Version: @DEB_LIBKRW_V@
@@ -7,5 +7,5 @@ Provides: libkrw (= @DEB_LIBKRW_V@)
Depends: libkrw0-plugin
Section: Libraries
Priority: standard
-Homepage: https://github.com/Siguza/libkrw
+Homepage: https://github.com/Cryptiiiic/libkrw
Description: A kernel R/W API for jailbreaks (Shared Library)
diff --git a/build_info/libx8a4-1.control b/build_info/libx8a4-1.control
new file mode 100644
index 0000000000..918e02b497
--- /dev/null
+++ b/build_info/libx8a4-1.control
@@ -0,0 +1,11 @@
+Package: libx8a4-1
+Author: Cryptiiiic
+Maintainer: @DEB_MAINTAINER@
+Architecture: @DEB_ARCH@
+Version: @DEB_X8A4_V@
+Provides: libx8a4-1 (= @DEB_X8A4_V@)
+Depends: libkrw0
+Section: Libraries
+Priority: standard
+Homepage: https://github.com/Cryptiiiic/x8A4
+Description: An all-in-one tool for firmware nonces, seeds, and downgrade support (Shared Library)
diff --git a/build_info/libx8a4-dev.control b/build_info/libx8a4-dev.control
new file mode 100644
index 0000000000..225fab4324
--- /dev/null
+++ b/build_info/libx8a4-dev.control
@@ -0,0 +1,10 @@
+Package: libx8a4-dev
+Author: Cryptiiiic
+Maintainer: @DEB_MAINTAINER@
+Architecture: @DEB_ARCH@
+Version: @DEB_X8A4_V@
+Depends: libx8a4-1 (= @DEB_X8A4_V@)
+Section: Development
+Priority: optional
+Homepage: https://github.com/Cryptiiiic/x8A4
+Description: An all-in-one tool for firmware nonces, seeds, and downgrade support (Development Files)
diff --git a/build_info/x8a4.control b/build_info/x8a4.control
new file mode 100644
index 0000000000..ad87a9dace
--- /dev/null
+++ b/build_info/x8a4.control
@@ -0,0 +1,12 @@
+Package: x8a4
+Name: x8A4
+Author: Cryptiiiic
+Maintainer: @DEB_MAINTAINER@
+Architecture: @DEB_ARCH@
+Version: @DEB_X8A4_V@
+Depends: libx8a4-1 (= @DEB_X8A4_V@)
+Enhances: dimentio
+Section: Utilities
+Priority: optional
+Homepage: https://github.com/Cryptiiiic/x8A4
+Description: An all-in-one tool for firmware nonces, seeds, and downgrade support
diff --git a/build_misc/entitlements/x8A4.xml b/build_misc/entitlements/x8A4.xml
new file mode 100644
index 0000000000..fe7224dce5
--- /dev/null
+++ b/build_misc/entitlements/x8A4.xml
@@ -0,0 +1,21 @@
+
+
+
+
+ get-task-allow
+
+ task_for_pid-allow
+
+ platform-application
+
+ com.apple.private.kernel.get-kext-info
+
+ com.apple.private.security.no-container
+
+ com.apple.security.iokit-user-client-class
+
+ AppleMobileApNonceUserClient
+ IOSurfaceRootUserClient
+
+
+
diff --git a/build_patch/choma/choma.patch b/build_patch/choma/choma.patch
new file mode 100644
index 0000000000..58457fd03c
--- /dev/null
+++ b/build_patch/choma/choma.patch
@@ -0,0 +1,121 @@
+diff --git a/src/arm64.c b/src/arm64.c
+index 2b07da0..99420f5 100644
+--- a/src/arm64.c
++++ b/src/arm64.c
+@@ -442,6 +442,90 @@ int arm64_dec_add_imm(uint32_t inst, arm64_register *destinationRegOut, arm64_re
+ return 0;
+ }
+
++int arm64_gen_sub_imm(arm64_register destinationReg, arm64_register sourceReg, optional_uint64_t optImm, optional_bool optS, uint32_t *bytesOut, uint32_t *maskOut) {
++ if (ARM64_REG_IS_ANY_VECTOR(destinationReg)) return -1;
++ if (ARM64_REG_IS_ANY_VECTOR(sourceReg)) return -1;
++
++ if (!ARM64_REG_IS_ANY(destinationReg) && !ARM64_REG_IS_ANY(sourceReg)) {
++ // if both regs are set and have a mismatching width, abort
++ if (ARM64_REG_IS_W(destinationReg) != ARM64_REG_IS_W(sourceReg)) return -1;
++ }
++
++ uint32_t inst = 0x51000000;
++ uint32_t mask = 0x7f800000;
++ if(OPT_BOOL_IS_SET(optS)) {
++ bool s = OPT_BOOL_GET_VAL(optS);
++ if(s) {
++ inst = 0x71000000;
++ mask |= (1 << 29);
++ inst |= (1 << 29);
++ }
++ }
++
++ // if one is set and 32 bit, include 32 bit in mask and set it in inst
++ if (!ARM64_REG_IS_ANY(destinationReg)) {
++ mask |= (1 << 31);
++ inst |= ((uint32_t)(ARM64_REG_IS_X(destinationReg)) << 31);
++ }
++ else if (!ARM64_REG_IS_ANY(sourceReg)) {
++ mask |= (1 << 31);
++ inst |= ((uint32_t)(ARM64_REG_IS_X(sourceReg)) << 31);
++ }
++
++ if (!ARM64_REG_IS_ANY(destinationReg)) {
++ mask |= 0x1F;
++ inst |= (uint32_t)(ARM64_REG_GET_NUM(destinationReg));
++ }
++ if (!ARM64_REG_IS_ANY(sourceReg)) {
++ mask |= (0x1F << 5);
++ inst |= ((uint32_t)(ARM64_REG_GET_NUM(destinationReg)) << 5);
++ }
++
++ if (OPT_UINT64_IS_SET(optImm)) {
++ uint64_t imm = OPT_UINT64_GET_VAL(optImm);
++ if (imm & ~0xFFF) return -1;
++ mask |= (0xFFF << 10);
++ inst |= (imm << 10);
++ }
++
++ if (bytesOut) *bytesOut = inst;
++ if (maskOut) *maskOut = mask;
++ return 0;
++}
++
++int arm64_dec_sub_imm(uint32_t inst, arm64_register *destinationRegOut, arm64_register *sourceRegOut, uint16_t *immOut, bool *sOut) {
++ if ((inst & 0x7f800000) != 0x51000000) {
++ if ((inst & 0x7f800000) != 0x71000000) {
++ return -1;
++ }
++ }
++ bool is64 = (inst & 0x80000000);
++ bool isS = (inst & 0x20000000);
++ bool shift = (inst & 0x400000);
++
++ if (destinationRegOut) {
++ *destinationRegOut = ARM64_REG(is64 ? ARM64_REG_TYPE_X : ARM64_REG_TYPE_W, inst & 0x1F);
++ }
++ if (sourceRegOut) {
++ *sourceRegOut = ARM64_REG(is64 ? ARM64_REG_TYPE_X : ARM64_REG_TYPE_W, (inst >> 5) & 0x1F);
++ }
++
++ if (immOut) {
++ uint16_t imm = ((inst >> 10) & 0xFFF);
++ if (shift) {
++ imm = (imm << 12);
++ }
++ *immOut = imm;
++ }
++
++ if (sOut) {
++ *sOut = isS;
++ }
++
++ return 0;
++}
++
++
+ static int _arm64_gen_str_ldr_imm(uint32_t inst, uint32_t mask, char type, arm64_ldr_str_type instType, arm64_register sourceDestinationReg, arm64_register addrReg, optional_uint64_t optImm, uint32_t *bytesOut, uint32_t *maskOut)
+ {
+ if (ARM64_REG_IS_ANY_VECTOR(addrReg)) return -1;
+diff --git a/src/arm64.h b/src/arm64.h
+index 6cc1329..5ad903b 100644
+--- a/src/arm64.h
++++ b/src/arm64.h
+@@ -85,6 +85,8 @@ int arm64_gen_mov_reg(arm64_register destinationReg, arm64_register sourceReg, u
+ int arm64_dec_mov_reg(uint32_t inst, arm64_register *destinationRegOut, arm64_register *sourceRegOut);
+ int arm64_gen_add_imm(arm64_register destinationReg, arm64_register sourceReg, optional_uint64_t optImm, uint32_t *bytesOut, uint32_t *maskOut);
+ int arm64_dec_add_imm(uint32_t inst, arm64_register *destinationRegOut, arm64_register *sourceRegOut, uint16_t *immOut);
++int arm64_gen_sub_imm(arm64_register destinationReg, arm64_register sourceReg, optional_uint64_t optImm, optional_bool optS, uint32_t *bytesOut, uint32_t *maskOut);
++int arm64_dec_sub_imm(uint32_t inst, arm64_register *destinationRegOut, arm64_register *sourceRegOut, uint16_t *immOut, bool *sOut);
+ int arm64_gen_ldr_imm(char type, arm64_ldr_str_type instType, arm64_register destinationReg, arm64_register addrReg, optional_uint64_t optImm, uint32_t *bytesOut, uint32_t *maskOut);
+ int arm64_dec_ldr_imm(uint32_t inst, arm64_register *destinationReg, arm64_register *addrReg, uint64_t *immOut, char *typeOut, arm64_ldr_str_type *instTypeOut);
+ int arm64_gen_ldrs_imm(char type, arm64_ldr_str_type instType, arm64_register destinationReg, arm64_register addrReg, optional_uint64_t optImm, uint32_t *bytesOut, uint32_t *maskOut);
+
+diff --git a/src/MachOByteOrder.h b/src/MachOByteOrder.h
+index 47f6f7d..56e28ea 100644
+--- a/src/MachOByteOrder.h
++++ b/src/MachOByteOrder.h
+@@ -3,6 +3,7 @@
+
+ #include
+ #include
++#include
+
+ // 8-bit integers needed for CodeDirectory
+ #define BIG_TO_HOST(n) _Generic((n), \
diff --git a/build_patch/libkrw/tfp0.patch b/build_patch/libkrw/tfp0.patch
deleted file mode 100644
index 23d074cd0f..0000000000
--- a/build_patch/libkrw/tfp0.patch
+++ /dev/null
@@ -1,25 +0,0 @@
---- a/src/libkrw.c 2024-04-20 14:46:12.796173476 -0700
-+++ b/src/libkrw.c 2024-04-20 18:01:14.500961452 -0700
-@@ -160,3 +160,8 @@
- if (krw_handlers.physwrite == NULL) return ENOTSUP;
- return krw_handlers.physwrite(from, to, len, granule);
- }
-+
-+__attribute__((visibility("hidden")))
-+int libkrw_initialization(krw_handlers_t handlers) {
-+ return EPROTONOSUPPORT;
-+}
-
---- a/src/libkrw_tfp0.c 2021-11-01 15:47:05.000000000 -0700
-+++ b/src/libkrw_tfp0.c 2024-04-20 17:59:39.170186064 -0700
-@@ -204,8 +204,8 @@
- return EDEVERR;
- }
-
--__attribute__((visibility("hidden")))
--int libkrw_initialization(krw_handlers_t handlers) {
-+__attribute__((used))
-+int krw_initializer(krw_handlers_t handlers) {
- // Make sure structure version is not lower than what we compiled with
- if (handlers->version < LIBKRW_HANDLERS_VERSION) {
- return EPROTONOSUPPORT;
diff --git a/build_patch/xpf/xpf.patch b/build_patch/xpf/xpf.patch
new file mode 100644
index 0000000000..4facd28e7c
--- /dev/null
+++ b/build_patch/xpf/xpf.patch
@@ -0,0 +1,35 @@
+diff --git a/.gitignore b/.gitignore
+index 5793cf9..3e81e77 100644
+--- a/.gitignore
++++ b/.gitignore
+@@ -4,3 +4,5 @@ xpf_test_ios
+ libxpf.dylib
+ libxpf_macos.dylib
+ /kernels
++
++.idea
+\ No newline at end of file
+diff --git a/src/xpf.c b/src/xpf.c
+index c072aaf..f5ca33f 100644
+--- a/src/xpf.c
++++ b/src/xpf.c
+@@ -551,6 +551,7 @@ void xpf_stop(void)
+ if (gXPF.kernelPrelinkTextSection) pfsec_free(gXPF.kernelPrelinkTextSection);
+ if (gXPF.kernelBootdataInit) pfsec_free(gXPF.kernelBootdataInit);
+ if (gXPF.kernelPLKTextSection) pfsec_free(gXPF.kernelPLKTextSection);
++ if (gXPF.kernelPLKDataConstSection) pfsec_free(gXPF.kernelPLKDataConstSection);
+ if (gXPF.kernelInfoPlistSection) pfsec_free(gXPF.kernelInfoPlistSection);
+ if (gXPF.kernelContainer) fat_free(gXPF.kernelContainer);
+
+diff --git a/src/xpf.h b/src/xpf.h
+index fddae9c..30130e0 100644
+--- a/src/xpf.h
++++ b/src/xpf.h
+@@ -64,6 +64,7 @@ typedef struct s_XPF {
+ PFSection *kernelOSLogSection;
+ PFSection *kernelPrelinkTextSection;
+ PFSection *kernelPLKTextSection;
++ PFSection *kernelPLKDataConstSection;
+ PFSection *kernelBootdataInit;
+ PFSection *kernelAMFITextSection;
+ PFSection *kernelAMFIStringSection;
diff --git a/makefiles/libkrw.mk b/makefiles/libkrw.mk
index 79accea119..1e991acfac 100644
--- a/makefiles/libkrw.mk
+++ b/makefiles/libkrw.mk
@@ -6,17 +6,20 @@ ifeq (,$(findstring darwin,$(MEMO_TARGET)))
ifeq ($(shell [ "$(MEMO_CFVER)" -ge 1700 ] && echo 1),1)
STRAPPROJECTS += libkrw
-LIBKRW_VERSION := 1.1.1
-DEB_LIBKRW_V ?= $(LIBKRW_VERSION)-2
+LIBKRW_VERSION := 1.1.2
+LIBROOT_COMMIT := 102348f5e9360ad1f509ae4958bd3ca686347ee8
+DEB_LIBKRW_V ?= $(LIBKRW_VERSION)
LIBKRW_SOVERSION := 0
libkrw-setup: setup
- $(call GITHUB_ARCHIVE,Siguza,libkrw,$(LIBKRW_VERSION),$(LIBKRW_VERSION))
+ $(call GITHUB_ARCHIVE,Cryptiiiic,libkrw,$(LIBKRW_VERSION),v$(LIBKRW_VERSION))
$(call EXTRACT_TAR,libkrw-$(LIBKRW_VERSION).tar.gz,libkrw-$(LIBKRW_VERSION),libkrw)
- $(call DO_PATCH,libkrw,libkrw,-p1)
+ $(call GITHUB_ARCHIVE,opa334,libroot,$(LIBROOT_COMMIT),$(LIBROOT_COMMIT),libroot)
+ $(call EXTRACT_TAR,libroot-$(LIBROOT_COMMIT).tar.gz,libroot-$(LIBROOT_COMMIT),libroot)
+ cp -a $(BUILD_WORK)/libroot $(BUILD_WORK)/libkrw/external
+ rm -rf $(BUILD_WORK)/libroot
mkdir -p $(BUILD_STAGE)/libkrw/$(MEMO_PREFIX)$(MEMO_SUB_PREFIX)/{include,lib/libkrw}
- sed -i 's|/usr/lib|$(MEMO_PREFIX)$(MEMO_SUB_PREFIX)/lib|g' $(BUILD_WORK)/libkrw/src/libkrw.c
ifneq ($(wildcard $(BUILD_WORK)/libkrw/.build_complete),)
libkrw:
@@ -25,15 +28,33 @@ else
libkrw: libkrw-setup
mkdir -p $(BUILD_WORK)/libkrw/src/.lib/
+ # libroot.o
+ if [ ! -z "$(findstring rootless,$(MEMO_TARGET))" ]; then \
+ $(CC) $(CFLAGS) \
+ -I$(BUILD_WORK)/libkrw/external/libroot/src \
+ -c -o $(BUILD_WORK)/libkrw/src/.lib/libroot.o \
+ -DIPHONEOS_ARM64 \
+ $(BUILD_WORK)/libkrw/external/libroot/src/dyn.c; \
+ else \
+ $(CC) $(CFLAGS) \
+ -I$(BUILD_WORK)/libkrw/external/libroot/src \
+ -c -o $(BUILD_WORK)/libkrw/src/.lib/libroot.o \
+ -DTARGET=libkrw \
+ $(BUILD_WORK)/libkrw/external/libroot/src/dyn.c; \
+ fi
# libkrw.o
$(CC) $(CFLAGS) \
-I$(BUILD_WORK)/libkrw/include \
+ -I$(BUILD_WORK)/libkrw/external/libroot/src \
+ -DTARGET="\"libkrw\"" \
-c -o $(BUILD_WORK)/libkrw/src/.lib/libkrw.o \
$(BUILD_WORK)/libkrw/src/libkrw.c
# libkrw_tfp0.o
$(CC) $(CFLAGS) \
-I$(BUILD_WORK)/libkrw/include \
+ -I$(BUILD_WORK)/libkrw/external/libroot/src \
+ -DTARGET="\"libkrw\"" \
-c -o $(BUILD_WORK)/libkrw/src/.lib/libkrw_tfp0.o \
$(BUILD_WORK)/libkrw/src/libkrw_tfp0.c
@@ -42,7 +63,7 @@ libkrw: libkrw-setup
-I$(BUILD_WORK)/libkrw/include \
-install_name "$(MEMO_PREFIX)$(MEMO_SUB_PREFIX)/lib/libkrw.$(LIBKRW_SOVERSION).dylib" \
-o $(BUILD_STAGE)/libkrw/$(MEMO_PREFIX)$(MEMO_SUB_PREFIX)/lib/libkrw.$(LIBKRW_SOVERSION).dylib \
- $(BUILD_WORK)/libkrw/src/.lib/libkrw.o \
+ $(BUILD_WORK)/libkrw/src/.lib/{libroot,libkrw}.o \
$(LDFLAGS)
# libkrw-tfp0.dylib
diff --git a/makefiles/x8A4.mk b/makefiles/x8A4.mk
new file mode 100644
index 0000000000..6894badfb8
--- /dev/null
+++ b/makefiles/x8A4.mk
@@ -0,0 +1,96 @@
+ifneq ($(PROCURSUS),1)
+$(error Use the main Makefile)
+endif
+
+ifeq (,$(findstring darwin,$(MEMO_TARGET)))
+ifeq ($(shell [ "$(MEMO_CFVER)" -ge 1700 ] && echo 1),1)
+
+SUBPROJECTS += x8A4
+X8A4_VERSION := 1.0.2
+CHOMA_COMMIT := 2fcc1fc51f6eb778756ccdee3c809bf83a767996
+XPF_COMMIT := 19798b65bd7eb3014261a550e666335aff439156
+DEB_X8A4_V ?= $(X8A4_VERSION)
+
+LIBX8A4_SOVERSION := 1
+
+x8A4-setup: setup
+ $(call GITHUB_ARCHIVE,Cryptiiiic,x8A4,$(X8A4_VERSION),v$(X8A4_VERSION))
+ $(call EXTRACT_TAR,x8A4-$(X8A4_VERSION).tar.gz,x8A4-$(X8A4_VERSION),x8A4)
+ rm -rf $(BUILD_WORK)/x8A4/Lib/{ChOma,XPF} $(BUILD_WORK)/x8A4/Lib/lib{choma,XPF}.a
+ $(call GITHUB_ARCHIVE,opa334,ChOma,$(CHOMA_COMMIT),$(CHOMA_COMMIT),ChOma)
+ $(call GITHUB_ARCHIVE,opa334,XPF,$(XPF_COMMIT),$(XPF_COMMIT),XPF)
+ $(call EXTRACT_TAR,ChOma-$(CHOMA_COMMIT).tar.gz,ChOma-$(CHOMA_COMMIT),x8A4/Lib/ChOma)
+ $(call EXTRACT_TAR,XPF-$(XPF_COMMIT).tar.gz,XPF-$(XPF_COMMIT),x8A4/Lib/XPF)
+ $(call DO_PATCH,choma,x8A4/Lib/ChOma,-p1)
+ $(call DO_PATCH,xpf,x8A4/Lib/XPF,-p1)
+ rm -rf $(BUILD_WORK)/x8A4/Lib/XPF/external/ios/include/choma/* $(BUILD_WORK)/x8A4/Lib/XPF/external/ios/lib/libchoma.*
+ rm -rf $(BUILD_WORK)/x8A4/Include/XPF/* $(BUILD_WORK)/x8A4/Include/choma/* $(BUILD_WORK)/x8A4/Lib/XPF/external/ios/lib/libchoma.*
+ cp -a $(BUILD_WORK)/x8A4/Lib/ChOma/src/*.h $(BUILD_WORK)/x8A4/Lib/XPF/external/ios/include/choma/
+ cp -a $(BUILD_WORK)/x8A4/Lib/ChOma/src/*.h $(BUILD_WORK)/x8A4/Include/choma/
+ cp -a $(BUILD_WORK)/x8A4/Lib/XPF/src/*.h $(BUILD_WORK)/x8A4/Include/XPF
+ mkdir -p $(BUILD_STAGE)/x8A4/$(MEMO_PREFIX)$(MEMO_SUB_PREFIX)/{include,lib,bin}
+
+
+ifneq ($(wildcard $(BUILD_WORK)/x8A4/.build_complete),)
+x8A4:
+ @echo "Using previously built x8A4."
+else
+x8A4: x8A4-setup
+ # libchoma.a
+ cd $(BUILD_WORK)/x8A4/Lib/ChOma && \
+ rm -rf $(BUILD_WORK)/x8A4/Lib/libchoma.a src/*.o; \
+ for file in src/*.c; do \
+ $(CC) -Isrc $(CFLAGS) -c -o $$file.o $$file; \
+ done; \
+ ar r $(BUILD_WORK)/x8A4/Lib/libchoma.a src/*o; \
+ # libxpf.a
+ cd $(BUILD_WORK)/x8A4/Lib/XPF && \
+ rm -rf $(BUILD_WORK)/x8A4/Lib/libxpf.a src/*.o; \
+ for file in src/*.c; do \
+ $(CC) -Iexternal/ios/include $(CFLAGS) -c -o $$file.o $$file; \
+ done; \
+ ar r $(BUILD_WORK)/x8A4/Lib/libxpf.a src/*o; \
+ # x8A4
+ cd $(BUILD_WORK)/x8A4 && cmake . \
+ $(DEFAULT_CMAKE_FLAGS) \
+ -DRELEASE=1
+ +$(MAKE) -C $(BUILD_WORK)/x8A4
+ cp -a $(BUILD_WORK)/x8A4/libx8A4.dylib $(BUILD_WORK)/x8A4/libx8A4.$(LIBX8A4_SOVERSION).dylib $(BUILD_STAGE)/x8A4/$(MEMO_PREFIX)$(MEMO_SUB_PREFIX)/lib/
+ cp -a $(BUILD_WORK)/x8A4/x8A4_CLI $(BUILD_STAGE)/x8A4/$(MEMO_PREFIX)$(MEMO_SUB_PREFIX)/bin/x8A4
+ cp -a $(BUILD_WORK)/x8A4/Include/x8A4 $(BUILD_STAGE)/x8A4/$(MEMO_PREFIX)$(MEMO_SUB_PREFIX)/include
+ $(call AFTER_BUILD,copy)
+endif
+
+x8A4-package: x8A4-stage
+ # x8A4.mk Package Structure
+ rm -rf $(BUILD_DIST)/libx8A4{-$(LIBX8A4_SOVERSION),-dev} $(BUILD_DIST)/x8A4
+ mkdir -p $(BUILD_DIST)/libx8A4-$(LIBX8A4_SOVERSION)/$(MEMO_PREFIX)$(MEMO_SUB_PREFIX)/lib \
+ $(BUILD_DIST)/libx8A4-$(LIBX8A4_SOVERSION)/$(MEMO_PREFIX)$(MEMO_SUB_PREFIX)/lib \
+ $(BUILD_DIST)/libx8A4-dev/$(MEMO_PREFIX)$(MEMO_SUB_PREFIX)/{lib,include} \
+ $(BUILD_DIST)/x8A4/$(MEMO_PREFIX)$(MEMO_SUB_PREFIX)/bin
+
+ # x8A4.mk Prep libx8A4
+ cp -a $(BUILD_STAGE)/x8A4/$(MEMO_PREFIX)$(MEMO_SUB_PREFIX)/lib/libx8A4.$(LIBX8A4_SOVERSION).dylib $(BUILD_DIST)/libx8A4-$(LIBX8A4_SOVERSION)/$(MEMO_PREFIX)$(MEMO_SUB_PREFIX)/lib
+
+ # x8A4.mk Prep libkrw-dev
+ cp -a $(BUILD_STAGE)/x8A4/$(MEMO_PREFIX)$(MEMO_SUB_PREFIX)/lib/libx8A4.dylib $(BUILD_DIST)/libx8A4-dev/$(MEMO_PREFIX)$(MEMO_SUB_PREFIX)/lib
+ cp -a $(BUILD_STAGE)/x8A4/$(MEMO_PREFIX)$(MEMO_SUB_PREFIX)/include/x8A4 $(BUILD_DIST)/libx8A4-dev/$(MEMO_PREFIX)$(MEMO_SUB_PREFIX)/include
+
+ # x8A4.mk Prep x8A4
+ cp -a $(BUILD_STAGE)/x8A4/$(MEMO_PREFIX)$(MEMO_SUB_PREFIX)/bin/x8A4 $(BUILD_DIST)/x8A4/$(MEMO_PREFIX)$(MEMO_SUB_PREFIX)/bin
+
+ # x8A4.mk Sign
+ $(call SIGN,libx8A4-$(LIBX8A4_SOVERSION),general.xml)
+ $(call SIGN,x8A4,x8A4.xml)
+
+ # x8A4.mk Make .debs
+ $(call PACK,libx8a4-$(LIBX8A4_SOVERSION),DEB_X8A4_V)
+ $(call PACK,libx8a4-dev,DEB_X8A4_V)
+ $(call PACK,x8a4,DEB_X8A4_V)
+
+ # x8A4.mk Build cleanup
+ rm -rf $(BUILD_DIST)/libx8A4{-$(LIBX8A4_SOVERSION),-dev} $(BUILD_DIST)/x8A4
+
+.PHONY: x8A4 x8A4-package
+endif
+endif