diff --git a/.github/build.config b/.github/build.config deleted file mode 100644 index 282544a..0000000 --- a/.github/build.config +++ /dev/null @@ -1,24 +0,0 @@ -# -# Build config for pmt workflows -# -# 2.4.0 config -# - -# Version -export BUILD_VERSION="2.4.0" - -# Relese tag -export BUILD_RELTAG="240" - -# Target architures -export BUILD_ARCH="arm64-v8a, armeabi-v7a" - -# NDK environ for getting clang version -export NDK="/home/workdir/android-ndk" -export TC="${NDK}/toolchains/llvm/prebuilt/linux-x86_64" -export TARGET_TEMPLATE="aarch64-linux-android" -export API_TEMPLATE="21" -export NDK_CLANG="${TC}/bin/${TARGET_TEMPLATE}${API}-clang" - -# get version -export CLANG_VERSION=$(${NDK_CLANG} --version | head -n 1) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..cf292d2 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,136 @@ +name: Build and release + +on: + push: + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Detect starting type + id: check-start-type + run: | + COMM_MSG=$(git log -1 --pretty=%B) + if [ "${GITHUB_EVENT_NAME}" == "push" ]; then + if [[ "${COMM_MSG}" == *"initial"* ]]; then + echo "build_and_release=true" >> $GITHUB_ENV + else + echo "build_and_release=false" >> $GITHUB_ENV + fi + elif [ "${GITHUB_EVENT_NAME}" == "workflow_dispatch" ]; then + echo "build_and_release=true" >> $GITHUB_ENV + fi + + - name: Cleanup + id: cleanup + if: env.build_and_release == 'true' + uses: rokibhasansagar/slimhub_actions@main + + - name: Setup GitHub CLI + id: setup-gh + if: env.build_and_release == 'true' + run: | + type -p curl >/dev/null || (sudo apt update && sudo apt install curl -y) + curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg \ + && sudo chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg \ + && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null \ + && sudo apt update \ + && sudo apt install gh -y + + - name: Update and setup packages + id: setup-packages + if: env.build_and_release == 'true' + run: | + sudo apt update \ + && sudo apt upgrade -y \ + && sudo apt install make xz-utils aria2 gawk -y + + - name: Save spefic version variables + id: save-vars + if: env.build_and_release == 'true' + run: | + . build/workflow/build.config + echo "PMT_VERSION=${PMT_VERSION}" >> $GITHUB_ENV + echo "PMT_VERSION_CODE=${PMT_VERSION_CODE}" >> $GITHUB_ENV + echo "NDK_VERSION=${NDK_VERSION}" >> $GITHUB_ENV + echo "NDK_LINK=${NDK_LINK}" >> $GITHUB_ENV + echo "NDK_IS=${NDK_IS}" >> $GITHUB_ENV + cd /home + sudo git clone https://github.com/ShawkTeam/pmt -b ${PMT_VERSION} + sudo chmod 777 pmt + echo "PMT_SRCDIR=/home/pmt" >> $GITHUB_ENV + echo "NDK_DIR=/home/ndk/android-ndk" >> $GITHUB_ENV + echo "NDK_IN_DIR=/home/ndk" >> $GITHUB_ENV + sudo mkdir -p "/home/ndk" && cd "/home/ndk" && sudo chmod 777 "/home/ndk" + + - name: Download and extract NDK + id: setup-ndk + if: env.build_and_release == 'true' + run: | + echo "Downloading NDK ${{ env.NDK_VERSION }}..." + aria2c "${{ env.NDK_LINK }}" + echo "Extracting..." + unzip -q *.zip && rm *.zip + mv * "${{ env.NDK_IS }}" + sudo chmod -R 777 * + working-directory: ${{ env.NDK_IN_DIR }} + + - name: Build pmt + id: build-pmt + if: env.build_and_release == 'true' + run: | + make gen-ndk-makefiles + export NDK_PROJECT_PATH=${PWD} + export NDK_ROOT_DIR=${{ env.NDK_DIR }} + echo "NDK_ROOT_DIR=${NDK_ROOT_DIR}" >> $GITHUB_ENV + bash build/bash/gen-header + cd ${{ env.NDK_DIR }} + ./ndk-build + working-directory: ${{ env.PMT_SRCDIR }} + + - name: Last small transactions + id: small-transactions + if: env.build_and_release == 'true' + run: | + export CC_64="${PWD}/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android21-clang" + export CC_32="${PWD}/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi21-clang" + export AR="${PWD}/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ar" + export CC_VERSION=$(${CC_64} --version | head -n 1) + echo "CC_VERSION=${CC_VERSION}" >> $GITHUB_ENV + . ${{ env.PMT_SRCDIR }}/build/workflow/build.config + . ${{ env.PMT_SRCDIR }}/build/workflow/relnotes > /home/pmt/release_body.txt + cd ${{ env.PMT_SRCDIR }} + zip -rq pmt-objs-local.zip obj/local/arm64-v8a obj/local/armeabi-v7a + xz libs/arm64-v8a/pmt + mv libs/arm64-v8a/pmt.xz ${PWD}/pmt-arm64-v8a.xz + xz libs/armeabi-v7a/pmt + mv libs/armeabi-v7a/pmt.xz ${PWD}/pmt-armeabi-v7a.xz + make CC="${CC_64}" AR="${AR}" + make deb FOR_THIS=64 + mv out/debpackage/*.deb . + make clean + make CC="${CC_32}" AR="${AR}" + make deb FOR_THIS=32 + mv out/debpackage/*.deb . + make clean + working-directory: ${{ env.NDK_DIR }} + + - name: Upload to release + id: upload-to-rels + if: env.build_and_release == 'true' + uses: softprops/action-gh-release@v2 + with: + files: | + /home/pmt/pmt*.xz + /home/pmt/pmt*.deb + /home/pmt/pmt-objs-local.zip + name: Partition Manager ${{ env.PMT_VERSION }} Release + tag_name: ${{ env.PMT_VERSION }} + body_path: /home/pmt/release_body.txt + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/ADD-LANGUAGES.md b/ADD-LANGUAGES.md deleted file mode 100644 index ff23f6f..0000000 --- a/ADD-LANGUAGES.md +++ /dev/null @@ -1,136 +0,0 @@ -### Add a new language to pmt (guide) - -On this page, I will tell you how to add languages to pmt. This is not a difficult thing :) - -##### Send ready stuff - - Send ready translations via pull requests. After making the necessary checks, if there is no problem, I will accept it. - - Proper commit messages are required. - - If there is an error, I will mention it in the pull request comments. - - Once you accept it, I (YZBruh) will implement the rest of the necessary things. - - It may take 5 days for me to notice :P - -##### Little important notes - - You don't have to be a professional to do this thing. - - There will be only one place you need to pay attention to, I will explain it. - - There is no need to know C. - - You can edit existing translations. - - You may need ready pmt to understand some things. - - If you are on an x86 PC, you can compile and use it, but the functions will never work. - -##### Understanding general logic - All the texts (strings) in pmt are like variables in bash. I mean: - - ``` - Bash - export missing_operand="missing operand." - - APPLYING: - ~ $ echo -n "$missing_operand\n" # for more detail I used the -n argument - missing operand - ~ $ - - - C / C++ - const char* _Nonnull missing_operand = "missing operand."; - const std::string missing_operand = "missing operand."; - - APPLYING (C / C++): - printf("%s\n", missing_operand); // Move to new line with '\n' character - std::cout << missing_operand << std::endl; // Move to new line with std::endl - ``` - - For example, let's take the output directly in pmt without any arguments and process the variables and structures behind the work. - - ``` - Shell - ~ $ pmt - pmt: missing operand - Try `pmt --help' for more information. - ~ $ - - Code pieces (C) - struct pmt_langdb_general en = { - // other translations - .missing_operand = "missing operand"; - .try_h = "Try"; - .for_more = "for more information"; - // other translations - } - - // pmt code functions [ logging ] - LOGE("%s\n%s `%s --help' %s.\n, missing_operand, try_h, argv[0], for_more); // LOGE is error logger (pmt). argv[0] = execution name - ``` - -In short, there are variables for texts. And I made these dynamic by using [struct](https://chatgpt.com/share/a798b57c-7e29-4b17-8887-f230414e57bd) method in C. You just need to add translation :) - -##### Translating main program texts (relevant part) - - - Let's open our jni/languages.c source file. - - Now, let's create the translation with the ready-made struct structure (see jni/include/pmt-stringkeys.h for the structure). - ``` - // main - struct pmt_langdb_general = { // LANGUAGE_PREFIX must be the corresponding abbreviation of the language in English. For example, it's like en in English. - // translations - } - - // example - struct pmt_langdb_general en = { - // translation - } - ``` - - We need to add some information about the language. - ``` - struct pmt_langdb_general = { - .lang_by_s = // Names of those who made the translation. It's up to you. Do you use & between more than one person? - .language = // Language name. For example English - .lang_prefix = // Language prefix. For example en - // other translations - } - - // example - struct pmt_langdb_general en = { - .lang_by_s = "YZBruh"; - .language = "English"; - .lang_prefix = "en"; - // other translations - } - - // CRITIC WARNING: Do not add ';' to the end of the last translation text. But others always - ``` - - Now do the others :) - - Now let me explain the documentation... - -##### Document texts translation (relevant part) - - - Let's open our jni/languages.c source file. - - Now, let's create the translation with the ready-made struct structure (see jni/include/pmt-stringkeys.h for the structure). - ``` - struct pmt_langdb_docs _docs = { - // translations - } - - // example - struct pmt_langdb_docs en_docs = { - // translations - } - ``` - - Make translations by taking examples from existing ones. And definitely do it regularly by getting help message from pmt :D - -##### General things to do in translation - - - Open jni/languages.c - - Go down a bit... -``` -char* pmt_langdb_langs[] = { - "en", - "tr" -}; -// Add the language you are translating into these existing language prefixes. I will fix the errors here (if there is an error) - -int pmt_langdb_total = ; // add one to the existing one and write (replacing with existing) -int pmt_langdb_ctrl = ; // add one to the existing one and write (replacing with existing) -``` - -##### Notes - - Apologies for the crappy current language control structure :( - - You can ask your questions: diff --git a/CHANGELOG.md b/CHANGELOG.md old mode 100644 new mode 100755 index cf32083..da371b8 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,19 @@ -### Version 2.4.0 (code 240) changelog - - Logging type has been changed. - - More understandable syntax. - - And one or two more things but I don't remember :P +### Version 2.5.0 Changelog -| END OF VERSION 2.4.0 CHANGELOG | -|------------------------------------| + - Fixed serious problems with version 2.4.0. + - Stabilization was held. + - The size calculation problem that was during flashtime was corrected. + - Change in the syntax in flash and formatting processes was made. + - Problems in file system selection are corrected in formatting process. + - Deprecation system created for deprecated/changed options. + - License display option deprecated. + - The language configuration file will now be stored and read entirely in /sdcard. + - Enabled C language extention warnings (-pedantic). + - Unnecessary codes were cleared and a more neat code was written. + - It was passed to make as old in the compilation system + - For NDK compilation with iterine make system Android.mk and Application.mk creation support added. + - More advanced make build system than before. + +``` +END OF 2.5.0 UPDATE CHANGELOG +``` \ No newline at end of file diff --git a/LANGUAGES.md b/LANGUAGES.md deleted file mode 100644 index 2b27a0f..0000000 --- a/LANGUAGES.md +++ /dev/null @@ -1,4 +0,0 @@ -### Supported languages - - - Türkçe (Turkish) (TR) - - English (EN) diff --git a/Makefile b/Makefile new file mode 100755 index 0000000..af3eb70 --- /dev/null +++ b/Makefile @@ -0,0 +1,26 @@ +# By YZBruh + +# Copyright 2024 Partition Manager +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +THIS_IS = main +NDK_PROG ?= false +FORCE_GEN ?= false + +# include needed variables +include Makefile.inc +include $(TOOLS)/gen-makefiles.mk +include $(TOOLS)/clean-makefiles.mk + +include $(BUILD)/main.mk \ No newline at end of file diff --git a/Makefile.inc b/Makefile.inc new file mode 100755 index 0000000..3ff9c58 --- /dev/null +++ b/Makefile.inc @@ -0,0 +1,161 @@ +# By YZBruh + +# Copyright 2024 Partition Manager +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# speficy +VERSION := 2.5.0 +VERSION_CODE := 250 +TARGET := pmt + +# device arch info +ARCH := $(shell uname -m) + +# current directory +CUR_DIR = $(shell pwd) +OUT_DIRNAME ?= out +SOURCE_DIRNAME ?= jni + +# others needed important variables +ifeq ($(THIS_IS),src) + BUILD := ../build + SOURCE_DIR := $(CUR_DIR) + OUT_DIR := ../$(OUT_DIRNAME) + DEBUTILS_DIR := $(BUILD)/deb + INCLUDE_DIR := ../include +else ifeq ($(THIS_IS),debutils) + BUILD := .. + SOURCE_DIR := ../../$(SOURCE_DIRNAME) + OUT_DIR := ../../$(OUT_DIRNAME) + DEBUTILS_DIR := $(BUILD)/deb +else ifeq ($(THIS_IS),out) + BUILD := ../build + SOURCE_DIR := ../$(SOURCE_DIRNAME) + OUT_DIR := $(CUR_DIR) + DEBUTILS_DIR := $(BÜILD)/deb +else ifeq ($(THIS_IS),main) + BUILD := $(CUR_DIR)/build + SOURCE_DIR := $(CUR_DIR)/$(SOURCE_DIRNAME) + OUT_DIR := $(CUR_DIR)/$(OUT_DIRNAME) + DEBUTILS_DIR := $(BUILD)/deb +endif + +BINARY_DIR := $(OUT_DIR)/binary +PACKAGE_DIR := $(OUT_DIR)/package +STATICLIB_DIR := $(OUT_DIR)/static_libs +DEB_DIR := $(OUT_DIR)/debpackage +TOOLS := $(BUILD)/tools +UTILS := $(BUILD)/util +BASH_DIR := $(BUILD)/bash +OTHERS := $(BUILD)/others +TERMUX_USR := /data/data/com.termux/files/usr +TERMUX_BIN := $(TERMUX_USR)/bin +LINUX_BIN := /usr/bin +DEBTERMUX_USR := $(DEBUTILS_DIR)/template$(TERMUX_USR) + +ifneq ($(wildcard $(LINUX_BIN)),) + BIN := $(LINUX_BIN) +else + BIN := $(TERMUX_BIN) +endif + +include $(UTILS)/utils.mk + +ifneq ($(shell basename $(SOURCE_DIR)),$(SOURCE_DIRNAME)) + $(error The index name specified with the current source directory name is not the same! Something's wrong) +endif + +ifneq ($(shell basename $(OUT_DIR)),$(OUT_DIRNAME)) + $(error The index name specified with the current output directory name is not the same! Something's wrong) +endif + +# sources +SRCS := $(wildcard $(SOURCE_DIR)/*.c) +OBJS = $(SRCS:.c=.o) + +# the presence of all source files that are on this list will be checked +SRCS_REQ := \ + $(SOURCE_DIR)/debugging.c \ + $(SOURCE_DIR)/docs.c \ + $(SOURCE_DIR)/get_stat.c \ + $(SOURCE_DIR)/lang_tools.c \ + $(SOURCE_DIR)/languages.c \ + $(SOURCE_DIR)/partitiontool.c \ + $(SOURCE_DIR)/pmt.c \ + $(SOURCE_DIR)/root.c \ + $(SOURCE_DIR)/tools.c \ + $(SOURCE_DIR)/versioner.c + +ifeq ($(THIS_IS),src) + HEADERS_REQ := \ + $(INCLUDE_DIR)/pmt/deprecates.h \ + $(INCLUDE_DIR)/pmt/docs.h \ + $(INCLUDE_DIR)/pmt/pmt.h \ + $(INCLUDE_DIR)/pmt/stringkeys.h \ + $(INCLUDE_DIR)/pmt/versioning.h +endif + +# objects to be used wgen static library files is created +STATICLIB_OBJS := \ + $(SOURCE_DIR)/root.o \ + $(SOURCE_DIR)/debugging.o \ + $(SOURCE_DIR)/listpart.o \ + $(SOURCE_DIR)/partitiontool.o + +# objects to be used when executable file is created +OBJS_EXEC := \ + $(SOURCE_DIR)/$(TARGET).o \ + $(SOURCE_DIR)/docs.o \ + $(SOURCE_DIR)/versioner.o \ + $(SOURCE_DIR)/get_stat.o \ + $(SOURCE_DIR)/tools.o \ + $(SOURCE_DIR)/lang_tools.o \ + $(SOURCE_DIR)/languages.o + +# other directories in the out directory +IN_OUT_DIR := \ + $(BINARY_DIR) \ + $(PACKAGE_DIR) \ + $(STATICLIB_DIR) + +# list of file/directory to be checked when the deb pack is created +DEB_CHECKS := \ + $(DEBUTILS_DIR) \ + $(DEBUTILS_DIR)/DEBIAN \ + $(DEBUTILS_DIR)/DEBIAN/control_32 \ + $(DEBUTILS_DIR)/DEBIAN/control_64 \ + $(DEBUTILS_DIR)/mandoc \ + $(DEBUTILS_DIR)/mandoc/$(TARGET).8.gz \ + $(DEBUTILS_DIR)/data \ + $(DEBUTILS_DIR)/data/data \ + $(DEBUTILS_DIR)/data/data/com.termux \ + $(DEBUTILS_DIR)/data/data/com.termux/files \ + $(DEBUTILS_DIR)/data/data/com.termux/files/usr \ + $(DEBUTILS_DIR)/data/data/com.termux/files/usr/bin \ + $(DEBUTILS_DIR)/data/data/com.termux/files/usr/share \ + $(DEBUTILS_DIR)/data/data/com.termux/files/usr/share/man \ + $(DEBUTILS_DIR)/data/data/com.termux/files/usr/share/man/man8 + +# for running make with silent mode +hide := @ +MAKE_HIDE := $(hide)$(MAKE) +SILENT := -s + +# color definations +RESET := \033[0m +RED := \033[0;31m +GREEN := \033[0;32m +YELLOW := \033[0;33m + +# end \ No newline at end of file diff --git a/README.md b/README.md index d22c72a..86ac6d1 100755 --- a/README.md +++ b/README.md @@ -7,8 +7,8 @@ It offers a lot of options. I will place these below. But first let me talk abou ``` Usage: pmt backup PARTITION [OUTPUT] [OPTIONS]... - or: pmt flash FILE PARTITION [OPTIONS]... - or: pmt format FILE_SYSTEM[ext/2/3/4] PARTITION [OPTIONS]... + or: pmt flash PARTITION FILE [OPTIONS]... + or: pmt format PARTITION FILE_SYSTEM[ext/2/3/4] [OPTIONS]... Options: -l, --logical It is meant to determine whether the target partition is logical. @@ -19,7 +19,6 @@ Options: -S, --set-lang Set current language. -v, --version See version. --help See this help message. - -L, --license See license. Examples: pmt backup boot_a -c /dev/block/platform/bootdevice/by-name @@ -27,33 +26,40 @@ Examples: pmt format ext4 system_a --logical pmt -c /dev/block/platform/bootdevice/by-name --list -Report bugs to +Report bugs to ``` #### Some notes -- pmt supports multiple languages. [See languages.](https://github.com/ShawkTeam/pmt/blob/2.4.0/LANGUAGES.md) -- [Add language.](https://github.com/ShawkTeam/pmt/blob/2.4.0/ADD-LANGUAGES.md) +- pmt supports multiple languages. [See languages.](https://github.com/ShawkTeam/pmt/blob/2.5.0/LANGUAGES.md) +- [Add language.](https://github.com/ShawkTeam/pmt/blob/2.5.0/ADD-LANGUAGES.md) - Feel free to ask any questions you want. - Packages are available in publications. - If the logical partition flag is not used, a classic partition is tried to be processing by default. -- [Click to see special version changes.](https://github.com/ShawkTeam/pmt/blob/2.4.0/CHANGELOG.md) +- [Click to see special version changes.](https://github.com/ShawkTeam/pmt/blob/2.5.0/CHANGELOG.md) - We are always open to your suggestions and support (developing)! ### How is it built? -Android NDK is required to build. - - [Download](https://developer.android.com/ndk/downloads) and extract the NDK package. +Make or Android NDK is required to build. + +##### Build with NDK + - [Download Android NDK](https://developer.android.com/ndk/downloads) and extract the NDK package. - Clone this repository. And get access to it. ``` -git clone https://github.com/ShawkTeam/pmt -b 2.4.0 +git clone https://github.com/ShawkTeam/pmt -b 2.5.0 cd pmt ``` - Set the NDK working directory variable. ``` -export NDK_PROJECT_PATH=$(pwd) +make gen-ndk-makefiles +export NDK_PROJECT_PATH="${PWD}" ``` - - Go to the NDK directory and start the construction + - Go to the NDK directory and start the build ``` +# Required by pmt's Android.mk +export NDK_ROOT_DIR="${PWD}" + +# Start build ./ndk-build ``` - The output files will be inside the `pmt` folder. Binaries are available in two architectures within the `libs` folder. `arm64-v8a` (64-bit) and `armeabi-v7a` (32-bit). @@ -62,7 +68,7 @@ export NDK_PROJECT_PATH=$(pwd) | ________________|________________ | | | | - jni/ debutils/ obj/ libs/ + src/ build/ obj/ libs/ | __________|__________ | | @@ -70,24 +76,24 @@ export NDK_PROJECT_PATH=$(pwd) | | pmt pmt ``` - - For the make installable debian package make-deb.sh use the script. It can be created within two architectures. Use the script flags correctly: arm64-v8a, armeabi-v7a. If you want to process with root, add sudo as the second argument. If you don't want, use no-sudo or leave it blank + +##### Build with Makefiles ``` ---Usage-- +make -./make-deb.sh [arm64-v8a, armeabi-v7a] [sudo, no-sudo, ] +# Use termux :D ``` - + - For the make installable debian package: + ``` -chmod 777 utils.sh +make deb -# for making 64-bit package -./utils.sh make-deb arm64-v8a - -# for making 32-bit package -./utils.sh make-deb armeabi-v7a +# Examples +make deb FOR_THIS=64 +make deb FOR_THIS=32 ``` ### Notes If you want to change something, take a look at the configuration. You can change him. -it is located in the `jni/config` folder. His name is `env.mk`. I gave the information in the file. You can ask more. +it is located in the `build/config` folder. His name is `env.mk`. I gave the information in the file. You can ask more. diff --git a/build/bash/additional-vars b/build/bash/additional-vars new file mode 100755 index 0000000..0c188f3 --- /dev/null +++ b/build/bash/additional-vars @@ -0,0 +1,6 @@ +NDK_PROG=false +FORCE_GEN=false +THIS_IS=main +UPDATE_MAKEFILES=false +SOURCE_DIRNAME=src +OUT_DIRNAME=out diff --git a/build/bash/check-makefiles b/build/bash/check-makefiles new file mode 100755 index 0000000..677ff71 --- /dev/null +++ b/build/bash/check-makefiles @@ -0,0 +1,36 @@ +# By YZBruh + +# Copyright 2024 Partition Manager +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +[ ! "${THIS_IS}" = "main" ] && abort "The caller is not the main makefile. Something's wrong." + +try_with="Try with force mode (FORCE_GEN=true)." + +if [ "${NDK_PROG}" = "true" ]; then + mfiles=("${SOURCE_DIR}/Android.mk" "${SOURCE_DIR}/Application.mk") +else + mfiles=("${OUT_DIR}/Makefile" "${SOURCE_DIR}/Makefile") +fi + +for mfile in ${mfiles[0]} ${mfiles[1]}; do + + [ -f "${mfile}" ] && \ + if [ "${FORCE_GEN}" = "true" ]; then + rm -f "${mfile}" + else + abort "$(output=$(dirname ${mfile}) && basename "${output}")/$(basename ${mfile}) exits." + fi + +done diff --git a/build/bash/clean-makefiles b/build/bash/clean-makefiles new file mode 100755 index 0000000..21cdd2e --- /dev/null +++ b/build/bash/clean-makefiles @@ -0,0 +1,42 @@ +# By YZBruh + +# Copyright 2024 Partition Manager +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +. build/bash/vars +. build/bash/functions + +[ ! "${THIS_IS}" = "main" ] && abort "The caller is not the main makefile. Something's wrong." + +if [ "${NDK_PROG}" = "true" ]; then + + [ "${UPDATE_MAKEFILES}" = "true" ] || print " - Removing Android.mk..." + rm -f ${SOURCE_DIR}/Android.mk + + [ "${UPDATE_MAKEFILES}" = "true" ] || print " - Removing Application.mk..." + rm -f ${SOURCE_DIR}/Application.mk + +else + + [ "${UPDATE_MAKEFILES}" = "true" ] || print " - Info: Main makefile won't be deleted." + + [ "${UPDATE_MAKEFILES}" = "true" ] || print " - Removing output directory makefile..." + rm -f ${OUT_DIR}/Makefile + + [ "${UPDATE_MAKEFILES}" = "true" ] || print " - Removing source directory makefile" + rm -f ${SOURCE_DIR}/Makefile + +fi + +[ "${UPDATE_MAKEFILES}" = "true" ] || print " - Success." \ No newline at end of file diff --git a/build/bash/functions b/build/bash/functions new file mode 100755 index 0000000..d6a898b --- /dev/null +++ b/build/bash/functions @@ -0,0 +1,37 @@ +# By YZBruh + +# Copyright 2024 Partition Manager +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +function abort() +{ + [ -n "$1" ] && echo -e " - ${RED}${BOLD}Error:${BOLD_RESET}${RESET} $1" + exit 1 +} + +function read_file() +{ + cat "$1" >> "$2" || abort "failed to read/write $1/$2" +} + +function gen() +{ + [ "${FORCE_GEN}" = "true" -a "${UPDATE_MAKEFILES}" = "true" ] && rm -f "$1" + touch "$1" || abort "failed to generate: $1" +} + +function print() +{ + echo -e "$1" +} diff --git a/build/bash/gen-header b/build/bash/gen-header new file mode 100755 index 0000000..4aa9e61 --- /dev/null +++ b/build/bash/gen-header @@ -0,0 +1,29 @@ +# By YZBruh + +# Copyright 2024 Partition Manager +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +[ -z ${NDK_ROOT_DIR} ] && \ +echo "Please set NDK_ROOT_DIR variable!" && \ +exit 1 + +[ -z ${NDK_PROJECT_PATH} ] && \ +echo "Please set NDK_PROJECT_PATH variable!" && \ +exit 1 + +CC_IS="${NDK_ROOT_DIR}/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android21-clang" +CC_VERS=$(${CC_IS} --version | head -n 1) + +mkdir -p ${NDK_PROJECT_PATH}/include/pmt/generated +echo -e "#define __NDK_CC_VERSION__ \"${CC_VERS}\"" > ${NDK_PROJECT_PATH}/include/pmt/generated/clang-version.h diff --git a/build/bash/gen-makefiles b/build/bash/gen-makefiles new file mode 100755 index 0000000..199fad3 --- /dev/null +++ b/build/bash/gen-makefiles @@ -0,0 +1,64 @@ +# By YZBruh + +# Copyright 2024 Partition Manager +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +. build/bash/vars +. build/bash/functions + +[ ! "${UPDATE_MAKEFILES}" = "true" ] && . build/bash/check-makefiles +[ ! "${THIS_IS}" = "main" ] && abort "The caller is not the main makefile. Something's wrong." + +if [ "${UPDATE_MAKEFILES}" = "true" ]; then + GENR="Re-generating" +else + GENR="Generating" +fi + +if [ "${NDK_PROG}" = "true" ]; then + + gen "${SOURCE_DIR}/Android.mk" + gen "${SOURCE_DIR}/Application.mk" + +else + + gen "${CUR_DIR}/Makefile" + gen "${OUT_DIR}/Makefile" + gen "${SOURCE_DIR}/Makefile" + +fi + +if [ "${NDK_PROG}" = "true" ]; then + + print " - ${GENR} Android.mk..." + read_file "${OTHERS}/makefile.androidmk" "${SOURCE_DIR}/Android.mk" + + print " - ${GENR} Application.mk" + read_file "${OTHERS}/makefile.applicationmk" "${SOURCE_DIR}/Application.mk" + +else + + print " - Re-generating main makefile..." + rm -f "${CUR_DIR}/Makefile" + read_file "${OTHERS}/makefile.main" "${CUR_DIR}/Makefile" + + print " - ${GENR} output directory makefile..." + read_file "${OTHERS}/makefile.outdir" "${OUT_DIR}/Makefile" + + print " - ${GENR} source directory makefile..." + read_file "${OTHERS}/makefile.sourcedir" "${SOURCE_DIR}/Makefile" + +fi + +print " - Success." \ No newline at end of file diff --git a/build/bash/vars b/build/bash/vars new file mode 100755 index 0000000..2add984 --- /dev/null +++ b/build/bash/vars @@ -0,0 +1,33 @@ +# By YZBruh + +# Copyright 2024 Partition Manager +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +. build/bash/additional-vars + +CUR_DIR=$(pwd) +SOURCE_DIR=${CUR_DIR}/${SOURCE_DIRNAME} +OUT_DIR=${CUR_DIR}/${OUT_DIRNAME} +BUILD=${CUR_DIR}/build +BASH_DIR=$(pwd) +OTHERS=${BUILD}/others +TOOLS=${BUILD}/tools + +# font types, colors etc +BOLD="\e[1m" +BOLD_RESET="\e[0m" +RESET="\033[0m" +RED="\033[0;31m" +GREEN="\033[0;32m" +YELLOW="\033[0;33m" \ No newline at end of file diff --git a/build/config/INS_STAT.mk b/build/config/INS_STAT.mk new file mode 100755 index 0000000..8a28605 --- /dev/null +++ b/build/config/INS_STAT.mk @@ -0,0 +1 @@ +INSTALL_SUCCESS := true diff --git a/build/config/Makefile b/build/config/Makefile new file mode 100755 index 0000000..2ab5cf4 --- /dev/null +++ b/build/config/Makefile @@ -0,0 +1,52 @@ +# By YZBruh + +# Copyright 2024 Partition Manager +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +include env.mk + +######################################### +# # +# Apply Configuration # +# # +# Warning: please do not edit # +# # +######################################### + +CC = clang +CFLAGS ?= "-O3 -I../include -std=c11 -pedantic -Wall -Wextra -Werror -Wno-nullability-extension -Wno-gnu-zero-variadic-macro-arguments $(PMT_EXTRA_CFLAGS)" + +# set compiler setting (clang-gcc and ar) +ifneq ($(PMT_CC),) + CC ?= $(PMT_CC) +else + CC ?= clang +endif + +ifneq ($(PMT_AR),) + AR ?= $(PMT_AR) +else + AR ?= ar +endif + +# compiler flags settings +ifneq ($(PMT_ENABLE_DEBUG),) + CFLAGS += -gdwarf-5 -fsanitize=address +endif + +# write current env configuration to oldenv.mk +all: + @echo "CC := $(CC)" > oldenv.mk; \ + echo "AR := $(AR)" >> oldenv.mk; \ + echo "CFLAGS := $(CFLAGS)" >> oldenv.mk diff --git a/build/config/UNINS_STAT.mk b/build/config/UNINS_STAT.mk new file mode 100755 index 0000000..bd83d04 --- /dev/null +++ b/build/config/UNINS_STAT.mk @@ -0,0 +1 @@ +UNINSTALLED_SUCCESS := diff --git a/jni/config/env.mk b/build/config/env.mk similarity index 75% rename from jni/config/env.mk rename to build/config/env.mk index 67d5052..17eb4f6 100755 --- a/jni/config/env.mk +++ b/build/config/env.mk @@ -22,10 +22,17 @@ # # ######################################### +# speficy c compiler (cc) +PMT_CC ?= + +# speficy ar +PMT_AR ?= + # addionital compiler flags -EXTRA_COMPILER_FLAGS ?= +PMT_EXTRA_CFLAGS ?= -# debugging mode (binary) -ENABLE_DEBUGGING ?= false +# debugging mode (binary). it's enabling address sanitizer and source level debug information with dwarf version 5 +PMT_ENABLE_DEBUG ?= -# end of environment configuration +######################################### +######################################### \ No newline at end of file diff --git a/debutils/DEBIAN/control_32 b/build/deb/DEBIAN/control_32 similarity index 93% rename from debutils/DEBIAN/control_32 rename to build/deb/DEBIAN/control_32 index 896afa9..5f80b95 100755 --- a/debutils/DEBIAN/control_32 +++ b/build/deb/DEBIAN/control_32 @@ -1,6 +1,6 @@ Source: pmt Package: pmt -Version: 2.4.0 +Version: 2.5.0 Architecture: arm Description: pmt is for reading, writing and formatting partitions of android devices Section: misc diff --git a/debutils/DEBIAN/control_64 b/build/deb/DEBIAN/control_64 similarity index 94% rename from debutils/DEBIAN/control_64 rename to build/deb/DEBIAN/control_64 index d742c49..e17c516 100755 --- a/debutils/DEBIAN/control_64 +++ b/build/deb/DEBIAN/control_64 @@ -1,6 +1,6 @@ Source: pmt Package: pmt -Version: 2.4.0 +Version: 2.5.0 Architecture: aarch64 Description: pmt is for reading, writing and formatting partitions of android devices Section: misc diff --git a/debutils/data/data/com.termux/files/usr/bin/dummy b/build/deb/data/data/com.termux/files/usr/bin/dummy similarity index 100% rename from debutils/data/data/com.termux/files/usr/bin/dummy rename to build/deb/data/data/com.termux/files/usr/bin/dummy diff --git a/debutils/data/data/com.termux/files/usr/share/man/man8/dummy b/build/deb/data/data/com.termux/files/usr/share/man/man8/dummy similarity index 100% rename from debutils/data/data/com.termux/files/usr/share/man/man8/dummy rename to build/deb/data/data/com.termux/files/usr/share/man/man8/dummy diff --git a/build/deb/deb.mk b/build/deb/deb.mk new file mode 100755 index 0000000..73406c3 --- /dev/null +++ b/build/deb/deb.mk @@ -0,0 +1,99 @@ +# By YZBruh + +# Copyright 2024 Partition Manager +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +##### +# sub-make for making deb package +##### + +THIS_IS := debutils + +# include needed variables +include ../../Makefile.inc + +TEMP_DIR := $(DEBUTILS_DIR)/template + +ifeq ($(FOR_THIS),64) + DEB_ARCH_NAME := arm64-v8a +else ifeq ($(FOR_THIS),32) + DEB_ARCH_NAME := armeabi-v7a +endif + +# controls the presence of file/directory. usage: $(call check_local,,) +define check_local + # the first argument is taken and controlled by the file/directory with -e option + if [ ! -e $1 ]; then \ + if [ $2 = 1 ]; then \ + printf " - Package not builded! Please build package and try again.\n"; \ + else \ + printf " ==> Not found: $1\n"; \ + fi; \ + if [ -d "$(TEMP_DIR)" ]; then \ + rm -rf $(TEMP_DIR); \ + fi; \ + exit 1; \ + fi; +endef + +# make deb package +all: + $(hide)printf " --------- Making deb package ---------\n" + # remove template directory + $(call erase,$(TEMP_DIR)) + $(hide)printf " - Checking files and directories (only neededs)...\n" + # check some files and directories with parsing DEB_CHECKS variable + $(foreach deb_chfile, \ + $(DEB_CHECKS), \ + $(call check_local,$(deb_chfile)) \ + ) + # check build status + $(call check_local, \ + $(BINARY_DIR)/pmt, \ + 1 \ + ) + # make template and output directories + $(call mdir,$(TEMP_DIR),"y") + $(call mdir,$(DEB_DIR),"y") + $(hide)printf " - Copying files...\n" + # prepare + $(hide)cp -r $(DEBUTILS_DIR)/data $(TEMP_DIR) || exit 1 + $(hide)rm -f $(DEBTERMUX_USR)/share/man/man1/dummy + $(hide)rm -f $(DEBTERMUX_USR)/bin/dummy + $(call mdir,$(TEMP_DIR)/DEBIAN) + $(hide)abort() { \ + if [ -d $(TEMP_DIR) ]; then \ + rm -rf $(TEMP_DIR); \ + fi; \ + if [ -d $(DEB_DIR) ]; then \ + rm -rf $(DEB_DIR); \ + fi; \ + exit 1; \ + }; \ + if [ ! "$(FOR_THIS)" = "64" ] && [ ! "$(FOR_THIS)" = "32" ]; then \ + printf " - İnvalid arch number: $(FOR_THIS)\n" && abort; \ + fi; \ + printf " - Selected arm-$(FOR_THIS) package control file.\n"; \ + cp $(DEBUTILS_DIR)/DEBIAN/control_$(FOR_THIS) $(TEMP_DIR)/DEBIAN/control || abort; \ + cp $(DEBUTILS_DIR)/mandoc/$(TARGET).8.gz $(DEBTERMUX_USR)/share/man/man8 || abort; \ + cp $(BINARY_DIR)/$(TARGET) $(DEBTERMUX_USR)/bin || abort; \ + printf " - Starting dpkg-deb...\n"; \ + sleep 2; \ + chmod -R 755 *; \ + dpkg-deb -b $(TEMP_DIR) $(DEB_DIR)/$(TARGET)-$(DEB_ARCH_NAME).deb || abort; \ + # cleanup template directory + rm -rf $(TEMP_DIR); \ + printf " - Done!\n" + +# end \ No newline at end of file diff --git a/build/deb/mandoc/pmt.8.gz b/build/deb/mandoc/pmt.8.gz new file mode 100755 index 0000000..1a9adc8 Binary files /dev/null and b/build/deb/mandoc/pmt.8.gz differ diff --git a/build/main.mk b/build/main.mk new file mode 100755 index 0000000..4ca8200 --- /dev/null +++ b/build/main.mk @@ -0,0 +1,135 @@ +# By YZBruh + +# Copyright 2024 Partition Manager +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +UPDATE_MAKEFILES = false + +all: + $(hide)# To save configuration, the makefile in the config directory + $(MAKE_HIDE) $(SILENT) -C $(BUILD)/config || exit 1 + $(hide)# start the main build process + $(MAKE_HIDE) $(SILENT) -C $(SOURCE_DIRNAME) INC_OLDENV=true || exit 1 + +# cleaner functions +.PHONY: clean +clean: + $(hide)printf "Cleaning directories...\n"; \ + # cleanup out/binary + $(hide)if [ -d $(BINARY_DIR) ]; then \ + printf "==> $(OUT_DIRNAME)/`basename $(BINARY_DIR)`\n"; \ + rm -rf "$(BINARY_DIR)"; \ + fi; \ + # cleanup out/package + $(hide)if [ -d $(PACKAGE_DIR) ]; then \ + printf "==> $(OUT_DIRNAME)/`basename $(PACKAGE_DIR)`\n"; \ + rm -rf "$(PACKAGE_DIR)"; \ + fi; \ + # cleanup out/static_libs + $(hide)if [ -d $(STATICLIB_DIR) ]; then \ + printf "==> $(OUT_DIRNAME)/`basename $(STATICLIB_DIR)`\n"; \ + rm -rf "$(STATICLIB_DIR)"; \ + fi; \ + # cleanup out/debpackage + $(hide)if [ -d $(DEB_DIR) ]; then \ + printf "==> $(OUT_DIRNAME)/`basename $(DEB_DIR)`\n"; \ + rm -rf "$(DEB_DIR)"; \ + fi; \ + sleep 2; \ + # clean the objects by calling the receipt in the source directory + $(MAKE_HIDE) $(SILENT) -C $(SOURCE_DIRNAME) clean INC_OLDENV=false || exit 1 + $(hide)sleep 1 + $(hide)printf "Success.\n" + +# helper function +.PHONY: help +help: + $(hide)printf " ------- Partition Manager help -------\n\n" + $(hide)printf " Commands:\n" + $(hide)printf " $(MAKE) ==> Build Partition Manager.\n" + $(hide)printf " $(MAKE) deb ==> Generate debian package for termux.\n" + $(hide)printf " $(MAKE) clean ==> Clear builded binary.\n" + $(hide)printf " $(MAKE) install ==> It installs $(TARGET) into termux.\n" + $(hide)printf " $(MAKE) uninstall ==> It uninstalls $(TARGET) into termux.\n" + $(hide)printf " $(MAKE) gen-makefiles ==> Generate makefiles for build.\n" + $(hide)printf " $(MAKE) gen-ndk-makefiles ==> Generate NDK makefiles for build.\n" + $(hide)printf " $(MAKE) clean-makefiles ==> Cleanup makefiles.\n" + $(hide)printf " $(MAKE) clean-ndk-makefiles ==> Cleanup NDK makefiles.\n" + $(hide)printf " $(MAKE) update-makefiles ==> Re-generate makefiles.\n" + $(hide)printf " $(MAKE) update-ndk-makefiles ==> Re-generate NDK makefiles.\n" + $(hide)printf " $(MAKE) help ==> Display this help message.\n\n" + +# deb maker +.PHONY: deb +deb: + $(MAKE_HIDE) $(SILENT) -C $(DEBUTILS_DIR) -f deb.mk FOR_THIS=$(FOR_THIS) || exit 1 + $(hide)printf "" + +# install pmt in to termux +.PHONY: install +install: + $(MAKE_HIDE) $(SILENT) -C $(OUT_DIRNAME) install || exit 1 + +# uninstall pmt in to termux +.PHONY: uninstall +uninstall: + $(MAKE_HIDE) $(SILENT) -C $(OUT_DIRNAME) uninstall || exit 1 + +# clean ndk makefiles +.PHONY: gen-ndk-makefiles +gen-ndk-makefiles: + $(eval NDK_PROG = true) + $(call save-gen-vars) + $(call gen-ndk-mfiles) + $(hide)printf "" + +.PHONY: gen-makefiles +gen-makefiles: + $(call save-gen-vars) + $(call gen-mfiles) + $(hide)printf "" + +.PHONY: update-ndk-makefiles +update-ndk-makefiles: + $(hide)printf " ------ Updating NDK makefiles ------ \n" + $(eval NDK_PROG = true) + $(eval UPDATE_MAKEFILES = true) + $(call save-gen-vars) + $(call clean-ndk-mfiles) + $(call gen-ndk-mfiles) + $(hide)printf "" + +.PHONY: update-makefiles +update-makefiles: + $(hide)printf " ------ Updating makefiles ------ \n" + $(eval UPDATE_MAKEFILES = true) + $(call save-gen-vars) + $(call clean-ndk-mfiles) + $(call gen-mfiles) + $(hide)printf "" + +.PHONY: clean-ndk-makefiles +clean-ndk-makefiles: + $(eval NDK_PROG = true) + $(call save-gen-vars) + $(call clean-ndk-mfiles) + $(hide)printf "" + +.PHONY: clean-makefiles +clean-makefiles: + $(call save-gen-vars) + $(call clean-mfiles) + $(hide)printf "" + +# end \ No newline at end of file diff --git a/jni/Android.mk b/build/others/makefile.androidmk similarity index 72% rename from jni/Android.mk rename to build/others/makefile.androidmk index fad569d..28fba58 100755 --- a/jni/Android.mk +++ b/build/others/makefile.androidmk @@ -1,4 +1,4 @@ -# By YZBruh | ShawkTeam +# By YZBruh # Copyright 2024 Partition Manager # @@ -14,23 +14,35 @@ # See the License for the specific language governing permissions and # limitations under the License. +######## +# 2.5.0 +######## + LOCAL_PATH := $(call my-dir) -include $(LOCAL_PATH)/config/env.mk +include $(LOCAL_PATH)/../build/config/env.mk -PMT_CFLAGS = -O3 -std=c11 -Wall $(EXTRA_COMPILER_FLAGS) +PMT_CFLAGS = \ + -O3 \ + -std=c11 \ + -pedantic \ + -Wall \ + -Wextra \ + -Werror \ + -Wno-nullability-extension \ + -Wno-gnu-zero-variadic-macro-arguments \ + -D__NDK_BUILD \ + $(EXTRA_COMPILER_FLAGS) -ifeq ($(ENABLE_DEBUGGING), true) - PMT_CFLAGS += -g -Wextra -else - $(warning Unknown debugging flag: $(ENABLE_DEBUGGING). Please see: src/config/env.mk. Using non-debugging flags) +ifneq ($(PMT_ENABLE_DEBUG),) + PMT_CFLAGS += -gdwarf-5 -fsanitize=address endif include $(CLEAR_VARS) LOCAL_MODULE := libpmt_root LOCAL_SRC_FILES := root.c -LOCAL_C_INCLUDES := $(LOCAL_PATH)/include +LOCAL_C_INCLUDES := $(LOCAL_PATH)/../include LOCAL_CFLAGS := $(PMT_CFLAGS) include $(BUILD_STATIC_LIBRARY) @@ -39,7 +51,7 @@ include $(CLEAR_VARS) LOCAL_MODULE := libpmt_debugging LOCAL_SRC_FILES := debugging.c -LOCAL_C_INCLUDES := $(LOCAL_PATH)/include +LOCAL_C_INCLUDES := $(LOCAL_PATH)/../include LOCAL_CFLAGS := $(PMT_CFLAGS) include $(BUILD_STATIC_LIBRARY) @@ -48,7 +60,7 @@ include $(CLEAR_VARS) LOCAL_MODULE := libpmt_partitiontool LOCAL_SRC_FILES := partitiontool.c -LOCAL_C_INCLUDES := $(LOCAL_PATH)/include +LOCAL_C_INCLUDES := $(LOCAL_PATH)/../include LOCAL_CFLAGS := $(PMT_CFLAGS) include $(BUILD_STATIC_LIBRARY) @@ -57,7 +69,7 @@ include $(CLEAR_VARS) LOCAL_MODULE := libpmt_list LOCAL_SRC_FILES := listpart.c -LOCAL_C_INCLUDES := $(LOCAL_PATH)/include +LOCAL_C_INCLUDES := $(LOCAL_PATH)/../include LOCAL_CFLAGS := $(PMT_CFLAGS) include $(BUILD_STATIC_LIBRARY) @@ -73,7 +85,7 @@ LOCAL_SRC_FILES := \ lang_tools.c \ languages.c \ docs.c -LOCAL_C_INCLUDES := $(LOCAL_PATH)/include +LOCAL_C_INCLUDES := $(LOCAL_PATH)/../include LOCAL_STATIC_LIBRARIES := \ libpmt_root \ libpmt_debugging \ diff --git a/jni/Application.mk b/build/others/makefile.applicationmk similarity index 94% rename from jni/Application.mk rename to build/others/makefile.applicationmk index a7a33f3..2d8ffa7 100755 --- a/jni/Application.mk +++ b/build/others/makefile.applicationmk @@ -1,4 +1,4 @@ -# By YZBruh | ShawkTeam +# By YZBruh # Copyright 2024 Partition Manager # @@ -14,6 +14,10 @@ # See the License for the specific language governing permissions and # limitations under the License. +######## +# 2.5.0 +######## + # architecture APP_ABI := \ arm64-v8a \ @@ -23,4 +27,4 @@ APP_PLATFORM := android-21 APP_OPTIM := release -# end +# end \ No newline at end of file diff --git a/build/others/makefile.main b/build/others/makefile.main new file mode 100755 index 0000000..af3eb70 --- /dev/null +++ b/build/others/makefile.main @@ -0,0 +1,26 @@ +# By YZBruh + +# Copyright 2024 Partition Manager +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +THIS_IS = main +NDK_PROG ?= false +FORCE_GEN ?= false + +# include needed variables +include Makefile.inc +include $(TOOLS)/gen-makefiles.mk +include $(TOOLS)/clean-makefiles.mk + +include $(BUILD)/main.mk \ No newline at end of file diff --git a/build/others/makefile.outdir b/build/others/makefile.outdir new file mode 100755 index 0000000..204bc08 --- /dev/null +++ b/build/others/makefile.outdir @@ -0,0 +1,126 @@ +# By YZBruh + +# Copyright 2024 Partition Manager +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +##### +# sub-make for installing-uninstalling +##### + +THIS_IS := out + +# include needed variables +include ../Makefile.inc +-include $(BUILD)/config/INS_STAT.mk +-include $(BUILD)/config/UNINS_STAT.mk + +# create an empty target +all: + $(hide)printf "" + +# installer +.PHONY: install +install: + # really termux? + $(hide)if [ -f $(TERMUX_BIN)/termux-open ]; then \ + printf " ------------ $(TARGET) installer ------------ \n"; \ + if [ -f $(TERMUX_BIN)/$(TARGET) ]; then \ + printf " - $(TARGET) already installed\n"; \ + exit; \ + fi; \ + if [ ! "$(INSTALL_SUCCESS)" = "true" ] && [ ! "$(INSTALL_SUCCESS)" = "" ]; then \ + printf " - $(YELLOW)$(BOLD)Warning:$(BOLD_RESET)$(RESET) a previously-stayed failed installation process found\n"; \ + fi; \ + if [ -f $(DEB_DIR)/*.deb ]; then \ + printf " - The created deb pack was found. It's setup...\n"; \ + cd $(DEB_DIR) || exit 1; \ + apt install ./*.deb || exit 1; \ + if [ ! "$?" = "0" ]; then \ + cd $(CUR_DIR); \ + printf " - Success.\n\n"; \ + echo "INSTALL_SUCCESS := true" > $(BUILD)/config/INS_STAT.mk; \ + echo "UNINSTALLED_SUCCESS := " > $(BUILD)/config/UNINS_STAT.mk; \ + cd ..; \ + exit 0; \ + else \ + cd $(CUR_DIR); \ + printf " - $(RED)$(BOLD)Error:$(BOLD_RESET)$(RESET) installing failed!\n"; \ + echo "INSTALL_SUCCESS := false" > $(BUILD)/config/INS_STAT.mk; \ + cd ..; \ + exit 1; \ + fi; \ + fi; \ + if [ ! -f $(BINARY_DIR)/$(TARGET) ]; then \ + printf " - $(RED)$(BOLD)Error:$(BOLD_RESET)$(RESET) Package not builded! Please build package and try again \n"; \ + echo "INSTALL_SUCCESS := false" > $(BUILD)/config/INS_STAT.mk; \ + exit 1; \ + fi; \ + printf " - Installing binary...\n"; \ + if [ "`cp $(BINARY_DIR)/$(TARGET) /data/data/com.termux/files/usr/bin/$(TARGET)`" = "" ]; then \ + printf " - Setting up permissions...\n"; \ + else \ + echo "INSTALL_SUCCESS := false" > $(BUILD)/config/INS_STAT.mk; \ + exit 1; \ + fi; \ + if [ "`chmod 777 $(TERMUX_BIN)/$(TARGET)`" = "" ]; then \ + printf " - Saving current status...\n"; \ + echo "INSTALL_SUCCESS := true" > $(BUILD)/config/INS_STAT.mk; \ + else \ + echo "INSTALL_SUCCESS := false" > $(BUILD)/config/INS_STAT.mk; \ + exit 1; \ + fi; \ + printf " - Success.\n\n"; \ + echo "INSTALL_SUCCESS := true" > $(BUILD)/config/INS_STAT.mk; \ + echo "UNINSTALLED_SUCCESS := " > $(BUILD)/config/UNINS_STAT.mk; \ + else \ + printf " - $(RED)$(BOLD)Error:$(BOLD_RESET)$(RESET) This function is only available on Termux.\n"; \ + exit 1; \ + fi + +# uninstaller +.PHONY: uninstall +uninstall: + # really termux? + $(hide)if [ -f $(TERMUX_BIN)/termux-open ]; then \ + printf " ----------- $(TARGET) uninstaller ----------- \n"; \ + if [ ! -f $(TERMUX_BIN)/$(TARGET) ]; then \ + printf " - $(TARGET) already uninstalled\n"; \ + exit; \ + fi; \ + if [ ! "$(UNINSTALL_SUCCESS)" = "true" ] && [ ! "$(UNINSTALL_SUCCESS)" = "" ]; then \ + printf " - $(YELLOW)$(BOLD)Warning:$(BOLD_RESET)$(RESET) a previously-stayed failed uninstallation process found\n"; \ + fi; \ + if [ -f $(TERMUX_USR)/share/man/man8/$(TARGET).8.gz ]; then \ + printf " - It was found to be established by $(TARGET)'s deb pack. It's removed with apt...\n"; \ + apt remove -y $(TARGET) || exit 1; \ + printf " - Success.\n\n"; \ + echo "UNINSTALLED_SUCCESS := true" > $(BUILD)/config/UNINS_STAT.mk; \ + echo "INSTALL_SUCCESS := " > $(BUILD)/config/INS_STAT.mk; \ + else \ + printf " - It was found that pmt was manually established (with this makefile or copying). Manually removed...\n"; \ + if [ "`rm $(TERMUX_BIN)/$(TARGET)`" = "" ]; then \ + printf " - Success.\n\n"; \ + echo "UNINSTALLED_SUCCESS := true" > $(BUILD)/config/UNINS_STAT.mk; \ + echo "INSTALL_SUCCESS := " > $(BUILD)/config/INS_STAT.mk; \ + else \ + echo "UNINSTALLED_SUCCESS := false" > $(BUILD)/config/UNINS_STAT.mk; \ + exit 1; \ + fi; \ + fi; \ + else \ + printf "$(RED)$(BOLD)Error:$(BOLD_RESET)$(RESET) This function is only available on Termux.\n"; \ + exit 1; \ + fi + +# end \ No newline at end of file diff --git a/build/others/makefile.sourcedir b/build/others/makefile.sourcedir new file mode 100755 index 0000000..5ff51f3 --- /dev/null +++ b/build/others/makefile.sourcedir @@ -0,0 +1,161 @@ +# By YZBruh + +# Copyright 2024 Partition Manager +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +##### +# sub-make for building package +##### + +THIS_IS = src + +include ../Makefile.inc + +ifeq ($(INC_OLDENV),true) + include $(BUILD)/config/oldenv.mk +endif + +# make objects. Usage $(call make_obj,) +define make_obj + $(eval OBJ := $(1:.c=.o)) + $(call m_stat,CC,`basename $(SOURCE_DIR)`/`basename $(OBJ)`,n) + $(CC) $(CFLAGS) -c "$1" || exit 1; + $(hide)printf "\n" +endef + +# make executable file with using static libraries and objects. Usage: $(call make_executable) +define make_executable + printf " - Making executable file...\n"; \ + printf " LD $(TARGET)"; \ + $(CC) $(CFLAGS) -L$(SOURCE_DIR) \ + $(foreach s_obj_b, \ + $(shell basename -a $(STATICLIB_OBJS)), \ + $(eval s_obj_t_b = $(s_obj_b:.o=)) \ + $(shell echo -lpmt_$(s_obj_t_b)) \ + ) \ + -o $(TARGET) $(OBJS_EXEC) || exit 1; +endef + +# make static library. Usage $(call make_staticlib,,) +define make_staticlib + echo -n " AR $1"; \ + $(AR) rcs "$1" "$2" || exit 1; \ + echo; +endef + +# controls the presence of source file. usage: $(call check_cfile,) +define check_cfile + # the first argument is taken and controlled by the file with -f option + printf " CHK src/`basename $1`\n"; \ + if [ ! -f $1 ]; then \ + printf " ==> Couldn't found required source file: src/`basename $1`\n"; \ + if [ -d "$(TEMP_DIR)" ]; then \ + rm -rf $(TEMP_DIR); \ + fi; \ + exit 1; \ + fi; +endef + +# controls the presence of header file. usage: $(call check_hfile,) +define check_hfile + # the first argument is taken and controlled by the file with -f option + printf " CHK include/pmt/`basename $1`\n"; \ + if [ ! -f $1 ]; then \ + printf " ==> Couldn't found required header file: include/pmt/`basename $1`\n"; \ + if [ -d "$(TEMP_DIR)" ]; then \ + rm -rf $(TEMP_DIR); \ + fi; \ + exit 1; \ + fi; +endef + +# all target for building +all: + $(hide)rm -f $(BUILD)/config/oldenv.mk + $(hide)printf " ---- Partition Manager Builder ---- \n\n" + $(hide)printf " - Version: $(VERSION)\n" + $(hide)printf " - Version code: $(VERSION_CODE)\n\n" + $(hide)printf " -------------------------------- \n\n" + $(hide)if [ -f $(SOURCE_DIR)/debugging.o ]; then \ + printf " - Please clean up before you build it.\n\n"; \ + printf " ----------------------------------- \n"; \ + exit 1; \ + fi + $(hide)printf " - Checking required source files...\n" + $(hide)sleep 1 + $(foreach src_cf, \ + $(SRCS_REQ), \ + $(call check_cfile,$(src_cf)) \ + ) + $(foreach src_hf, \ + $(HEADERS_REQ), \ + $(call check_hfile,$(src_hf)) \ + ) + $(hide)printf " - Building objects...\n" + $(hide)sleep 2 + $(foreach csrc, \ + $(SRCS), \ + $(call make_obj,$(csrc)) \ + ) + $(foreach reqdir,$(IN_OUT_DIR),$(call mdir,$(reqdir))) + $(hide)printf " - Making static libraries...\n" + $(foreach s_obj, \ + $(shell basename -a $(STATICLIB_OBJS)), \ + $(eval s_obj_t = $(s_obj:.o=.a)) \ + $(call make_staticlib,libpmt_$(s_obj_t),$(s_obj)) \ + ) + $(hide)sleep 1 + $(call make_executable) + $(hide)sleep 1 + $(hide)abort_build() { \ + if [ -d "$(PACKAGE_DIR)" ]; then \ + rm -rf "$(PACKAGE_DIR)"; \ + fi; \ + if [ -d "$(BINARY_DIR)" ]; then \ + rm -rf "$(BINARY_DIR)"; \ + fi; \ + if [ -d "$(STATICLIB_DIR)" ]; then \ + rm -rf "$(STATICLIB_DIR)"; \ + fi; \ + exit 1; \ + }; \ + mv $(TARGET) $(BINARY_DIR) || abort_build; \ + mv *.a $(STATICLIB_DIR) || abort_build; \ + printf "\n - Generating package...\n"; \ + cp $(BINARY_DIR)/$(TARGET) $(PACKAGE_DIR) || abort_build; \ + printf " XZ $(OUT_DIRNAME)/package/$(TARGET)-$(ARCH).xz" + xz $(PACKAGE_DIR)/$(TARGET) || abort_build; \ + sleep 1; \ + mv $(PACKAGE_DIR)/$(TARGET).xz $(PACKAGE_DIR)/$(TARGET)-$(ARCH).xz || abort_build; \ + printf "\n - Success"; \ + sleep 1; \ + printf "\n\n ----------------------------------- \n" + +.PHONY: clean +clean: + $(eval STATICLIBS = $(wildcard $(SOURCE_DIR)/*.a)) + $(eval OBJS = $(wildcard $(SOURCE_DIR)/*.o)) + $(info Cleaning files...) + $(foreach obj, \ + $(OBJS), \ + $(call m_stat_nn,$(SOURCE_DIRNAME)/$(shell basename $(obj))) \ + $(call erase,$(obj)) \ + ) + $(foreach lib, \ + $(STATICLIBS), \ + $(call m_stat_nn,$(SOURCE_DIRNAME)/$(shell basename $(lib))) \ + $(call erase,$(lib)) \ + ) + +# end \ No newline at end of file diff --git a/build/tools/clean-makefiles.mk b/build/tools/clean-makefiles.mk new file mode 100755 index 0000000..17b2217 --- /dev/null +++ b/build/tools/clean-makefiles.mk @@ -0,0 +1,31 @@ +# By YZBruh + +# Copyright 2024 Partition Manager +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +################## +# See "erase" funtion for build/util/utils.mk +################## + +include $(TOOLS)/save-gen-vars.mk + +define clean-ndk-mfiles + $(hide)[ "$(UPDATE_MAKEFILES)" = "true" ] || printf " ------ Cleaning NDK Makefiles ------ \n" + $(hide)cat $(BASH_DIR)/clean-makefiles | $(BIN)/bash +endef + +define clean-mfiles + $(hide)[ "$(UPDATE_MAKEFILES)" = "true" ] || printf " ------ Cleaning Makefiles ------ \n" + $(hide)cat $(BASH_DIR)/clean-makefiles | $(BIN)/bash +endef \ No newline at end of file diff --git a/build/tools/gen-makefiles.mk b/build/tools/gen-makefiles.mk new file mode 100755 index 0000000..47fe74c --- /dev/null +++ b/build/tools/gen-makefiles.mk @@ -0,0 +1,31 @@ +# By YZBruh + +# Copyright 2024 Partition Manager +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +################## +# See "save-gen-vars" funtion for build/tools/save-gen-vars.mk +################## + +include $(TOOLS)/save-gen-vars.mk + +define gen-ndk-mfiles + $(hide)[ "$(UPDATE_MAKEFILES)" = "true" ] || printf " ------ Generating NDK Makefiles ------ \n" + $(hide)cat $(BASH_DIR)/gen-makefiles | $(BIN)/bash +endef + +define gen-mfiles + $(hide)[ "$(UPDATE_MAKEFILES)" = "true" ] || printf " ------ Generating Makefiles ------ \n" + $(hide)cat $(BASH_DIR)/gen-makefiles | $(BIN)/bash +endef diff --git a/build/tools/save-gen-vars.mk b/build/tools/save-gen-vars.mk new file mode 100755 index 0000000..a825d14 --- /dev/null +++ b/build/tools/save-gen-vars.mk @@ -0,0 +1,26 @@ +# By YZBruh + +# Copyright 2024 Partition Manager +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +define save-gen-vars + $(hide)rm -f $(BASH_DIR)/additional-vars + $(call touch,$(BASH_DIR)/additional-vars) + $(hide)echo "NDK_PROG=$(NDK_PROG)" >> $(BASH_DIR)/additional-vars + $(hide)echo "FORCE_GEN=$(FORCE_GEN)" >> $(BASH_DIR)/additional-vars + $(hide)echo "THIS_IS=$(THIS_IS)" >> $(BASH_DIR)/additional-vars + $(hide)echo "UPDATE_MAKEFILES=$(UPDATE_MAKEFILES)" >> $(BASH_DIR)/additional-vars + $(hide)echo "SOURCE_DIRNAME=$(SOURCE_DIRNAME)" >> $(BASH_DIR)/additional-vars + $(hide)echo "OUT_DIRNAME=$(OUT_DIRNAME)" >> $(BASH_DIR)/additional-vars +endef diff --git a/build/tools/update-makefiles.mk b/build/tools/update-makefiles.mk new file mode 100755 index 0000000..f7d8f32 --- /dev/null +++ b/build/tools/update-makefiles.mk @@ -0,0 +1,24 @@ +# By YZBruh + +# Copyright 2024 Partition Manager +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +ifneq ($(THIS_IS),main) + $(error The caller is not the main makefile. Something's wrong) +endif + +UPDATE_MAKEFILES = true + +include $(TOOLS)/clean-makefiles.mk +include $(TOOLS)/gen-makefiles.mk diff --git a/build/util/utils.mk b/build/util/utils.mk new file mode 100755 index 0000000..bc198a3 --- /dev/null +++ b/build/util/utils.mk @@ -0,0 +1,58 @@ +# By YZBruh + +# Copyright 2024 Partition Manager +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# generate any text based empty file. Usage: $(call touch,) +define touch + $(hide)[ ! "$(FORCE_GEN)" = "true" ] || rm -f "$1" + $(hide)touch "$1" || exit 1 +endef + +# copy files. Usage: $(call copy,,) +define copy + cp "$1" "$2" || exit 1 +endef + +# copy dirs. Usage: $(call copydir,,) +define copydir + cp -r "$1" "$2" || exit 1 +endef + +# file/dir are deleted. usage: $(call erase,) +define erase + rm -rf "$1" +endef + +# make directories. usage: $(call mdir,,) +define mdir + [ -z $2 ] || printf " - Generating `basename $1` dir...\n"; \ + mkdir -p "$1" || exit 1; +endef + +# make status. usage: $(call m_stat,"",) +define m_stat + printf " $1 $2" +endef + +# make status (not newline and using make functions). usage: $(call m_stat_nn,"") +define m_stat_nn + $(info ==> $(1)) +endef + +# Get file content and if speficed write target, write speficed file. Usage: $(call cat,,) +define cat + [ -z "$2" ] && cat "$1" || exit 1 + [ -n "$2" ] && cat "$1" >> "$2" || exit 1 +endef diff --git a/build/workflow/build.config b/build/workflow/build.config new file mode 100755 index 0000000..0b405b8 --- /dev/null +++ b/build/workflow/build.config @@ -0,0 +1,5 @@ +export PMT_VERSION="2.5.0" +export PMT_VERSION_CODE=250 +export NDK_LINK="https://dl.google.com/android/repository/android-ndk-r27-linux.zip" +export NDK_VERSION="r27" +export NDK_IS="android-ndk" \ No newline at end of file diff --git a/build/workflow/relnotes b/build/workflow/relnotes new file mode 100755 index 0000000..ea7a1e1 --- /dev/null +++ b/build/workflow/relnotes @@ -0,0 +1,14 @@ +echo -e "Compiled with clang + +${CC_VERSION} + +VERSION: \`${PMT_VERSION}\` +VERSION CODE: \`${PMT_VERSION_CODE}\` +TARGET ARCHITECTURE: \`arm64-v8a\` (64-bit) and \`armeabi-v7a\` (32-bit) + +Notes: +Builded with Android NDK ${NDK_VERSION} +Packages are compressed with xz. +Builded debian packages for termux. +Report bugs and suggestions. +[Click](https://github.com/ShawkTeam/pmt/blob/${PMT_VERSION}/CHANGELOG.md) for viewing version ${PMT_VERSION} changelog." \ No newline at end of file diff --git a/debutils/mandoc/pmt.8.gz b/debutils/mandoc/pmt.8.gz deleted file mode 100755 index 4319a5a..0000000 Binary files a/debutils/mandoc/pmt.8.gz and /dev/null differ diff --git a/include/pmt/deprecates.h b/include/pmt/deprecates.h new file mode 100755 index 0000000..3d83949 --- /dev/null +++ b/include/pmt/deprecates.h @@ -0,0 +1,99 @@ +/* By YZBruh */ + +/** + * Copyright 2024 Partition Manager + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __PMT_DEPRECATED_H +#define __PMT_DEPRECATED_H + +#include + +__BEGIN_DECLS + +#define deprecated_opt 1 +#define changed_opt 2 +#define end_depr_pointer 0 +#define not_changed 0 +#define not_changed_long NULL + +/* versions */ +#define v150 "1.5.0" +#define v160 "1.6.0" +#define v170 "1.7.0" +#define v180 "1.8.0" +#define v190 "1.9.0" +#define v200 "2.0.0" +#define v210 "2.1.0" +#define v220 "2.2.0" +#define v230 "2.3.0" +#define v240 "2.4.0" +#define v250 "2.5.0" +#define vUNK NULL + +struct pmt_deprecates { + int depr_type; + int option; + int option_new; + const char* option_long; + const char* option_long_new; + const char* depr_version; +}; + +static void +__deprecated_opt_handle(int opt, const char* opt_long, const char* depr_msg) +{ + static char long_e_msg[250]; + + static struct pmt_deprecates depr_table[] = { + {deprecated_opt, 'b', not_changed, "backup", not_changed_long, v210}, + {deprecated_opt, 'F', not_changed, "flash", not_changed_long, v210}, + {deprecated_opt, 'r', not_changed, "format", not_changed_long, v210}, + {deprecated_opt, 'L', not_changed, "license", not_changed_long, v250}, + {changed_opt, 'D', 'p', "list", not_changed_long, v210}, + {end_depr_pointer, not_changed, not_changed, not_changed_long, not_changed_long, vUNK} + }; + + if (opt_long == NULL) + sprintf(long_e_msg, "%s", current->not_changed_opt); + else + sprintf(long_e_msg, "%s", opt_long); + + for (int optctrl = 0; depr_table[optctrl].depr_type != 0; optctrl++) + { + + if (depr_table[optctrl].depr_type == 1) + { + if (opt == depr_table[optctrl].option || strcmp(opt_long, depr_table[optctrl].option_long) == 0) + LOGD("%s [%s]: -%c (%s): %s\n", current->depr_opt_str, depr_table[optctrl].depr_version, (char)depr_table[optctrl].option, depr_table[optctrl].option_long, depr_msg); + + } + else if (depr_table[optctrl].depr_type == 2) + { + if (opt == depr_table[optctrl].option || strcmp(opt_long, depr_table[optctrl].option_long) == 0) + LOGD("%s [%s]: -%c (%s): %s\n", current->switched_opt_str, depr_table[optctrl].depr_version, (char)depr_table[optctrl].option, long_e_msg, depr_msg); + + } + + } +} + +#define DEPR_HANDLE(x, y, z) __deprecated_opt_handle(x, y, z) + +__END_DECLS + +#endif + +/* end of code */ diff --git a/jni/include/pmt-docs.h b/include/pmt/docs.h similarity index 91% rename from jni/include/pmt-docs.h rename to include/pmt/docs.h index 988b0f6..d085433 100755 --- a/jni/include/pmt-docs.h +++ b/include/pmt/docs.h @@ -16,11 +16,15 @@ * limitations under the License. */ +#ifndef __PMT_DOCS_H +#define __PMT_DOCS_H + __BEGIN_DECLS void help(void); -void licenses(void); __END_DECLS -/* end */ \ No newline at end of file +#endif + +/* end */ diff --git a/include/pmt/generated/clang-version.h b/include/pmt/generated/clang-version.h new file mode 100755 index 0000000..c60f885 --- /dev/null +++ b/include/pmt/generated/clang-version.h @@ -0,0 +1 @@ +#define __NDK_CC_VERSION__ "" diff --git a/jni/include/pmt.h b/include/pmt/pmt.h similarity index 76% rename from jni/include/pmt.h rename to include/pmt/pmt.h index 497ba82..ba038f9 100755 --- a/jni/include/pmt.h +++ b/include/pmt/pmt.h @@ -20,52 +20,40 @@ __BEGIN_DECLS -#if !defined(__PMT_H_) +#ifndef __PMT_H_ #define __PMT_H_ #define PMT_PACKAGE_NAME "Partition Manager" -#if defined(INC_MAIN_LIBS) -#include -#include -#include -#include -#include -#include -#include +#ifdef INC_MAIN_LIBS + #include + #include + #include + #include + #include + #include + #include #endif -#if defined(INC_GETOPT) -#include +#ifdef INC_GETOPT + #include #endif -#if defined(INC_DIRENT) -#include +#ifdef INC_DIRENT + #include #endif -#if defined(INC_STAT) -#include +#ifdef INC_STAT + #include #endif -#if defined(INC_DEBUGERS) -#include +#ifdef INC_DEBUGERS + #include #endif -#if defined(INC_PMT_LANGS) -#include -#endif - -#if defined(INC_DOCS_REQS) -#include -#endif - -#if defined(INC_VERSIONER_REQS) -#include -#endif - -#if defined(INC_TOOLS_REQS) -#include -#include +#ifdef INC_TOOLS_REQS + #include + #include #endif /* variable definations */ @@ -109,9 +97,10 @@ void check_dev_point(void); void check_root(void); int pmt(unsigned short progress_code); void version(void); -void setlang(const char* _Nonnull lang); +void setlang(const char* _Nonnull lang, int null_conf_stat); int search_sls(void); -char* _Nonnull loadlang(void); +int loadlang(void); +int get_stat(const char* _Nonnull filepath, const char* _Nonnull stype); void debug(LogLevel status, const char* _Nullable fmt, ...); /* logging macros */ diff --git a/jni/include/pmt-stringkeys.h b/include/pmt/stringkeys.h similarity index 85% rename from jni/include/pmt-stringkeys.h rename to include/pmt/stringkeys.h index 8e16429..e9d3de5 100755 --- a/jni/include/pmt-stringkeys.h +++ b/include/pmt/stringkeys.h @@ -16,7 +16,7 @@ * limitations under the License. */ -#if !defined(__PMT_STRINGKEYS_) +#ifndef __PMT_STRINGKEYS_ #define __PMT_STRINGKEYS_ __BEGIN_DECLS @@ -33,6 +33,7 @@ struct pmt_langdb_general { const char* _Nonnull not_open; const char* _Nonnull not_block; const char* _Nonnull not_read; + const char* _Nonnull not_readdir; const char* _Nonnull not_write; const char* _Nonnull not_gen; const char* _Nonnull no_root; @@ -50,6 +51,12 @@ struct pmt_langdb_general { const char* _Nonnull ffile_more_part; const char* _Nonnull cannot_get_bsz; const char* _Nonnull format_fail; + const char* _Nonnull depr_backup_opt; + const char* _Nonnull depr_flash_opt; + const char* _Nonnull depr_format_opt; + const char* _Nonnull depr_Vlicense_opt; + const char* _Nonnull depr_ch_list_opt; + const char* _Nonnull not_spec_opt; const char* _Nonnull logical_warn; const char* _Nonnull ab_warn; const char* _Nonnull out_not_spec; @@ -58,8 +65,8 @@ struct pmt_langdb_general { const char* _Nonnull flash_file_sz; const char* _Nonnull part_disk_sz_fail; const char* _Nonnull flash_file_sz_fail; + const char* _Nonnull unknown_opr; const char* _Nonnull list_of_dir; - const char* _Nonnull see_license; const char* _Nonnull success_backup; const char* _Nonnull success_flash; const char* _Nonnull warn; @@ -70,6 +77,9 @@ struct pmt_langdb_general { const char* _Nonnull for_more; const char* _Nonnull try_h; const char* _Nonnull usage_head; + const char* _Nonnull depr_opt_str; + const char* _Nonnull switched_opt_str; + const char* _Nonnull not_changed_opt; const char* _Nonnull compiler_str; const char* _Nonnull version_str; const char* _Nonnull bin_str; @@ -77,7 +87,7 @@ struct pmt_langdb_general { const char* _Nonnull by_str; }; -/* docs, licenses etc. */ +/* docs etc. */ struct pmt_langdb_docs { const char* _Nonnull docs_strs_l1; const char* _Nonnull docs_strs_l2; @@ -93,13 +103,17 @@ struct pmt_langdb_docs { const char* _Nonnull docs_strs_l12; const char* _Nonnull docs_strs_l13; const char* _Nonnull docs_strs_l14; - const char* _Nonnull docs_strs_l15; const char* _Nonnull or_str; const char* _Nonnull usage_docstr; }; +/* for checks etc */ +struct pmt_langdb_langs { + const char* _Nullable lang_pr; +}; + __END_DECLS #endif /* __PMT_STRINGKEYS_ */ -/* end of code */ \ No newline at end of file +/* end of code */ diff --git a/jni/include/pmt-versioning.h b/include/pmt/versioning.h similarity index 71% rename from jni/include/pmt-versioning.h rename to include/pmt/versioning.h index c9e7814..eb67692 100755 --- a/jni/include/pmt-versioning.h +++ b/include/pmt/versioning.h @@ -16,27 +16,23 @@ * limitations under the License. */ +#ifndef __PMT_VERSIONING_H +#define __PMT_VERSIONING_H + __BEGIN_DECLS -#include - -#if __NDK_MINOR__ == 1 -#define __NDK_MINOR_STATUS__ "b" -#else -#define __NDK_MINOR_STATUS__ "" -#endif - -#if __NDK_BETA__ == 1 || __NDK_BETA__ == 2 -#define __NDK_BETA_STATUS__ "beta" -#else -#define __NDK_BETA_STATUS__ "" +#ifdef __NDK_BUILD + #include + #include #endif /* versioning */ #define PMT_MAJOR 2 -#define PMT_MINOR 4 +#define PMT_MINOR 5 #define PMT_PATCHLEVEL 0 __END_DECLS -/* end */ \ No newline at end of file +#endif + +/* end */ diff --git a/jni/Makefile b/jni/Makefile new file mode 100755 index 0000000..167476c --- /dev/null +++ b/jni/Makefile @@ -0,0 +1,161 @@ +# By YZBruh + +# Copyright 2024 Partition Manager +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +##### +# sub-make for building package +##### + +THIS_IS = src + +include ../Makefile.inc + +ifeq ($(INC_OLDENV),true) + include $(BUILD)/config/oldenv.mk +endif + +# make objects. Usage $(call make_obj,) +define make_obj + $(eval OBJ := $(1:.c=.o)) + $(call m_stat,CC,`basename $(SOURCE_DIR)`/`basename $(OBJ)`,n) + $(CC) $(CFLAGS) -c "$1" || exit 1; + $(hide)printf "\n" +endef + +# make executable file with using static libraries and objects. Usage: $(call make_executable) +define make_executable + printf " - Making executable file...\n"; \ + printf " LD $(TARGET)"; \ + $(CC) $(CFLAGS) -L$(SOURCE_DIR) \ + $(foreach s_obj_b, \ + $(shell basename -a $(STATICLIB_OBJS)), \ + $(eval s_obj_t_b = $(s_obj_b:.o=)) \ + $(shell echo -lpmt_$(s_obj_t_b)) \ + ) \ + -o $(TARGET) $(OBJS_EXEC) || exit 1; +endef + +# make static library. Usage $(call make_staticlib,,) +define make_staticlib + echo -n " AR $1"; \ + $(AR) rcs "$1" "$2" || exit 1; \ + echo; +endef + +# controls the presence of source file. usage: $(call check_cfile,) +define check_cfile + # the first argument is taken and controlled by the file with -f option + printf " CHK $(SOURCE_DIRNAME)/`basename $1`\n"; \ + if [ ! -f $1 ]; then \ + printf " ==> Couldn't found required source file: $(SOURCE_DIRNAME)/`basename $1`\n"; \ + if [ -d "$(TEMP_DIR)" ]; then \ + rm -rf $(TEMP_DIR); \ + fi; \ + exit 1; \ + fi; +endef + +# controls the presence of header file. usage: $(call check_hfile,) +define check_hfile + # the first argument is taken and controlled by the file with -f option + printf " CHK include/pmt/`basename $1`\n"; \ + if [ ! -f $1 ]; then \ + printf " ==> Couldn't found required header file: include/pmt/`basename $1`\n"; \ + if [ -d "$(TEMP_DIR)" ]; then \ + rm -rf $(TEMP_DIR); \ + fi; \ + exit 1; \ + fi; +endef + +# all target for building +all: + $(hide)rm -f $(BUILD)/config/oldenv.mk + $(hide)printf " ---- Partition Manager Builder ---- \n\n" + $(hide)printf " - Version: $(VERSION)\n" + $(hide)printf " - Version code: $(VERSION_CODE)\n\n" + $(hide)printf " -------------------------------- \n\n" + $(hide)if [ -f $(SOURCE_DIR)/debugging.o ]; then \ + printf " - Please clean up before you build it.\n\n"; \ + printf " ----------------------------------- \n"; \ + exit 1; \ + fi + $(hide)printf " - Checking required source files...\n" + $(hide)sleep 1 + $(foreach src_cf, \ + $(SRCS_REQ), \ + $(call check_cfile,$(src_cf)) \ + ) + $(foreach src_hf, \ + $(HEADERS_REQ), \ + $(call check_hfile,$(src_hf)) \ + ) + $(hide)printf " - Building objects...\n" + $(hide)sleep 2 + $(foreach csrc, \ + $(SRCS), \ + $(call make_obj,$(csrc)) \ + ) + $(foreach reqdir,$(IN_OUT_DIR),$(call mdir,$(reqdir))) + $(hide)printf " - Making static libraries...\n" + $(foreach s_obj, \ + $(shell basename -a $(STATICLIB_OBJS)), \ + $(eval s_obj_t = $(s_obj:.o=.a)) \ + $(call make_staticlib,libpmt_$(s_obj_t),$(s_obj)) \ + ) + $(hide)sleep 1 + $(call make_executable) + $(hide)sleep 1 + $(hide)abort_build() { \ + if [ -d "$(PACKAGE_DIR)" ]; then \ + rm -rf "$(PACKAGE_DIR)"; \ + fi; \ + if [ -d "$(BINARY_DIR)" ]; then \ + rm -rf "$(BINARY_DIR)"; \ + fi; \ + if [ -d "$(STATICLIB_DIR)" ]; then \ + rm -rf "$(STATICLIB_DIR)"; \ + fi; \ + exit 1; \ + }; \ + mv $(TARGET) $(BINARY_DIR) || abort_build; \ + mv *.a $(STATICLIB_DIR) || abort_build; \ + printf "\n - Generating package...\n"; \ + cp $(BINARY_DIR)/$(TARGET) $(PACKAGE_DIR) || abort_build; \ + printf " XZ $(OUT_DIRNAME)/package/$(TARGET)-$(ARCH).xz" + xz $(PACKAGE_DIR)/$(TARGET) || abort_build; \ + sleep 1; \ + mv $(PACKAGE_DIR)/$(TARGET).xz $(PACKAGE_DIR)/$(TARGET)-$(ARCH).xz || abort_build; \ + printf "\n - Success"; \ + sleep 1; \ + printf "\n\n ----------------------------------- \n" + +.PHONY: clean +clean: + $(eval STATICLIBS = $(wildcard $(SOURCE_DIR)/*.a)) + $(eval OBJS = $(wildcard $(SOURCE_DIR)/*.o)) + $(info Cleaning files...) + $(foreach obj, \ + $(OBJS), \ + $(call m_stat_nn,$(SOURCE_DIRNAME)/$(shell basename $(obj))) \ + $(call erase,$(obj)) \ + ) + $(foreach lib, \ + $(STATICLIBS), \ + $(call m_stat_nn,$(SOURCE_DIRNAME)/$(shell basename $(lib))) \ + $(call erase,$(lib)) \ + ) + +# end \ No newline at end of file diff --git a/jni/debugging.c b/jni/debugging.c index 939b7db..a04e434 100755 --- a/jni/debugging.c +++ b/jni/debugging.c @@ -1,4 +1,4 @@ -/* By YZBruh | ShawkTeam */ +/* By YZBruh */ /** * Copyright 2024 Partition Manager @@ -16,20 +16,14 @@ * limitations under the License. */ -#if defined(__cplusplus) +#ifdef __cplusplus extern "C" { #endif #define INC_MAIN_LIBS -#include - -extern char* bin_name; -extern bool pmt_silent; - -extern struct pmt_langdb_general* current; -extern struct pmt_langdb_general en; -extern struct pmt_langdb_general tr; +#include +#include void debug(LogLevel status, const char* _Nullable fmt, ...) { @@ -72,7 +66,7 @@ void debug(LogLevel status, const char* _Nullable fmt, ...) va_end(args); } -#if defined(__cplusplus) +#ifdef __cplusplus } #endif diff --git a/jni/docs.c b/jni/docs.c index 938cc4c..aa4090e 100755 --- a/jni/docs.c +++ b/jni/docs.c @@ -1,4 +1,4 @@ -/* By YZBruh | ShawkTeam */ +/* By YZBruh */ /* * Copyright 2024 Partition Manager @@ -16,47 +16,30 @@ * limitations under the License. */ -#if defined(__cplusplus) +#ifdef __cplusplus extern "C" { #endif #define INC_MAIN_LIBS -#define INC_DOCS_REQS -#include +#include +#include +#include extern char* bin_name; -extern char* pmt_langdb_langs_docs[]; +extern char* curr_lang; struct pmt_langdb_docs* curr_docs = NULL; -extern struct pmt_langdb_docs en_docs; -extern struct pmt_langdb_docs tr_docs; static void prepare_langconf_docs(void) { - static char* langctrl_str; - langctrl_str = loadlang(); - - if (strcmp(langctrl_str, "en") == 0) + if (strcmp(curr_lang, "en") == 0) curr_docs = &en_docs; - else if (strcmp(langctrl_str, "tr") == 0) + else if (strcmp(curr_lang, "tr") == 0) curr_docs = &tr_docs; } -void licenses(void) -{ - printf("Copyright 2024 Partition Manager\n"); - printf("Licensed under the Apache License, Version 2.0 (the \"License\");\n"); - printf("you may not use this file except in compliance with the License.\n"); - printf("You may obtain a copy of the License at\n\n"); - printf(" http://www.apache.org/licenses/LICENSE-2.0\n\n"); - printf("Unless required by applicable law or agreed to in writing, software\n"); - printf("distributed under the License is distributed on an \"AS IS\" BASIS,\n"); - printf("WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n"); - printf("See the License for the specific language governing permissions and limitations under the License.\n"); -} - void help(void) { prepare_langconf_docs(); @@ -71,17 +54,16 @@ void help(void) printf(" -f, --force %s\n", curr_docs->docs_strs_l9); printf(" -S, --set-lang %s\n", curr_docs->docs_strs_l10); printf(" -v, --version %s\n", curr_docs->docs_strs_l11); - printf(" --help %s\n", curr_docs->docs_strs_l12); - printf(" -L, --license %s\n\n", curr_docs->docs_strs_l13); - printf("%s:\n", curr_docs->docs_strs_l14); + printf(" --help %s\n\n", curr_docs->docs_strs_l12); + printf("%s:\n", curr_docs->docs_strs_l13); printf(" %s backup boot_a -c /dev/block/platform/bootdevice/by-name\n", bin_name); printf(" %s flash /sdcard/twrp/boot.img boot_a -c /dev/block/platform/bootdevice/by-name\n", bin_name); printf(" %s format ext4 system_a --logical\n", bin_name); printf(" %s -c /dev/block/platform/bootdevice/by-name --list\n\n", bin_name); - printf("%s \n", curr_docs->docs_strs_l15); + printf("%s \n", curr_docs->docs_strs_l14); } -#if defined(__cplusplus) +#ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/jni/get_stat.c b/jni/get_stat.c index 83d9e63..3d23815 100755 --- a/jni/get_stat.c +++ b/jni/get_stat.c @@ -1,4 +1,4 @@ -/* By YZBruh | ShawkTeam */ +/* By YZBruh */ /** * Copyright 2024 Partition Manager @@ -16,14 +16,15 @@ * limitations under the License. */ -#if defined(__cplusplus) +#ifdef __cplusplus extern "C" { #endif #define INC_MAIN_LIBS #define INC_STAT -#include +#include +#include /** * The target file is controlled by the stat function. @@ -71,7 +72,7 @@ int get_stat(const char* _Nonnull filepath, const char* _Nonnull stype) return 2; } -#if defined(__cplusplus) +#ifdef __cplusplus } #endif diff --git a/jni/lang_tools.c b/jni/lang_tools.c index e495e1b..b58acc6 100755 --- a/jni/lang_tools.c +++ b/jni/lang_tools.c @@ -1,4 +1,4 @@ -/* By YZBruh | ShawkTeam */ +/* By YZBruh */ /** * Copyright 2024 Partition Manager @@ -16,7 +16,7 @@ * limitations under the License. */ -#if defined(__cplusplus) +#ifdef __cplusplus extern "C" { #endif @@ -24,45 +24,35 @@ extern "C" { #define INC_DEBUGERS #define INC_STAT -#include +#include +#include /* pmt's man doc file path on termux */ #define TERMUX_PMT_MANDOC "/data/data/com.termux/files/usr/share/man/man8/pmt.8.gz" -/* language configuration paths */ +#define PMTLANG_CONF "/sdcard/.pmtlang.conf" -/* for termux */ -#define TERMUX_PMTLANG_CONF "/data/data/com.termux/files/usr/etc/pmtlang.conf" +#define PMT_SW_POINT "/sdcard/.pmtlangsw" -/* for internal storage */ -#define INTRNL_PMTLANG_CONF "/sdcard/.pmtlang.conf" +extern struct pmt_langdb_langs lang[]; +struct pmt_langdb_general* current = NULL; -/* shortcuts to check that language is changed */ +char* curr_lang; +static FILE *langconf; -/* for termux */ -#define TERMUX_PMT_SW_POINT "/data/data/com.termux/files/usr/etc/pmtlangsw" - -/* for internal storage */ -#define INTRNL_PMT_SW_POINT "/sdcard/.pmtlangsw" - -extern bool pmt_inst_on_termux; -extern char* bin_name; -extern char* pmt_langdb_langs[]; -extern int pmt_langdb_total; -extern int pmt_langdb_ctrl; - -FILE *langconf; - -static int +static const char* langctrl(const char* _Nonnull lang_) { - if (strcmp(lang_, "en") == 0 || strcmp(lang_, "tr") == 0) - return 0; + for (int langct = 0; lang[langct].lang_pr != NULL; langct++) + { + if (strcmp(lang_, lang[langct].lang_pr) == 0) + return lang_; + } - return 1; + return NULL; } -char* loadlang(void) +int loadlang(void) { static char lang_fpr[10] = "en"; langconf = NULL; @@ -70,126 +60,88 @@ char* loadlang(void) if (get_stat(TERMUX_PMT_MANDOC, "file") == 0) pmt_inst_on_termux = true; - if (pmt_inst_on_termux) + + langconf = fopen(PMTLANG_CONF, "r+"); + + if (langconf == NULL) { - if (get_stat(TERMUX_PMTLANG_CONF, "file") == 0) + langconf = fopen(PMTLANG_CONF, "w+"); + + if (langconf == NULL || langconf != NULL) { - langconf = fopen(TERMUX_PMTLANG_CONF, "r+"); + setlang("en", 1); + current = &en; + curr_lang = "en"; - if (langconf == NULL) - { - langconf = fopen(TERMUX_PMTLANG_CONF, "w+"); + if (langconf != NULL) + fclose(langconf); - if (langconf == NULL) - { - setlang("en"); - return "en"; - } - fclose(langconf); - } - else - { - while (fgets(lang_fpr, sizeof(lang_fpr), langconf) != NULL) - { - if (strcmp(lang_fpr, "en") == 0) - { - fclose(langconf); - return "en"; - } - else if (strcmp(lang_fpr, "tr") == 0) - { - fclose(langconf); - return "tr"; - } - } - fclose(langconf); - } + return 0; } + } else { - if (get_stat(INTRNL_PMTLANG_CONF, "file") == 0) + while (fgets(lang_fpr, sizeof(lang_fpr), langconf) != NULL) { - langconf = fopen(INTRNL_PMTLANG_CONF, "r"); - - if (langconf == NULL) + if (strcmp(lang_fpr, "en") == 0) { - langconf = fopen(INTRNL_PMTLANG_CONF, "w+"); - - if (langconf == NULL) - { - setlang("en"); - return "en"; - } fclose(langconf); + current = &en; + curr_lang = "en"; + return 0; + } + else if (strcmp(lang_fpr, "tr") == 0) + { + fclose(langconf); + current = &tr; + curr_lang = "tr"; + return 0; } else { - while (fgets(lang_fpr, sizeof(lang_fpr), langconf) != NULL) - { - if (strcmp(lang_fpr, "en") == 0) - { - fclose(langconf); - return "en"; - } - else if (strcmp(lang_fpr, "tr") == 0) - { - fclose(langconf); - return "tr"; - } - } fclose(langconf); + setlang("en", 0); + loadlang(); + return 0; } } - else return "en"; + + if (fgets(lang_fpr, sizeof(lang_fpr), langconf) == NULL) + { + setlang("en", 1); + loadlang(); + return 0; + } } - return "en"; + return 1; } -void setlang(const char* _Nonnull lang) +void setlang(const char* _Nonnull lang, int null_conf_stat) { - static char* lcf_path; + if (langctrl(lang) == NULL) + LOGE("Unknown language: %s.\n", lang); - if (pmt_inst_on_termux) - lcf_path = TERMUX_PMTLANG_CONF; - else - lcf_path = INTRNL_PMTLANG_CONF; - - if (get_stat(lcf_path, "file") == 0) - remove(lcf_path); + if (get_stat(PMTLANG_CONF, "file") == 0) + remove(PMTLANG_CONF); langconf = NULL; - - if (pmt_inst_on_termux) - langconf = fopen(TERMUX_PMTLANG_CONF, "w"); - else - langconf = fopen(INTRNL_PMTLANG_CONF, "w"); + langconf = fopen(PMTLANG_CONF, "w"); if (langconf == NULL) LOGE("Failed!!! Cannot open/write config file.\n"); - if (langctrl(lang) == 0) - { - if (fprintf(langconf, "%s", lang) < 2) - LOGE("Failed!!! Couldn't write config!\n"); - else - fclose(langconf); - } + if (fprintf(langconf, "%s", lang) < 2) + LOGE("Failed!!! Couldn't write config!\n"); else - LOGE("Unknown language: %s.\n", lang); + fclose(langconf); static int status; - if (pmt_inst_on_termux) + if (null_conf_stat != 1) { - status = open(TERMUX_PMT_SW_POINT, O_WRONLY | O_CREAT | O_TRUNC, 0666); - if (status == 0) - close(status); - } - else - { - status = open(INTRNL_PMT_SW_POINT, O_WRONLY | O_CREAT | O_TRUNC, 0666); + status = open(PMT_SW_POINT, O_WRONLY | O_CREAT | O_TRUNC, 0666); if (status == 0) close(status); } @@ -197,23 +149,16 @@ void setlang(const char* _Nonnull lang) int search_sls(void) { - static char* sw_point_path; - - if (pmt_inst_on_termux) - sw_point_path = TERMUX_PMT_SW_POINT; - else - sw_point_path = INTRNL_PMT_SW_POINT; - - if (get(sw_point_path, "file") == 0) + if (get_stat(PMT_SW_POINT, "file") == 0) { - remove(sw_point_path); + remove(PMT_SW_POINT); return 0; } else return 1; } -#if defined(__cplusplus) +#ifdef __cplusplus } #endif diff --git a/jni/languages.c b/jni/languages.c index 1080122..f785f76 100755 --- a/jni/languages.c +++ b/jni/languages.c @@ -1,4 +1,4 @@ -/* By YZBruh | ShawkTeam */ +/* By YZBruh */ /** * Copyright 2024 Partition Manager @@ -16,13 +16,14 @@ * limitations under the License. */ -#if defined(__cplusplus) +#ifdef __cplusplus extern "C" { #endif #define INC_MAIN_LIBS -#include +#include +#include struct pmt_langdb_general en = { .lang_by_s = "YZBruh & r0manas", @@ -35,10 +36,11 @@ struct pmt_langdb_general en = { .not_open = "Couldn't open", .not_block = "The specified partition is not recognized as a block device.", .not_read = "Couldn't read", + .not_readdir = "Couldn't read directory", .not_write = "Couldn't write", .not_gen = "Couldn't generate", .no_root = "Root access could not be detected! Please run this with root permissions.", - .no_target = "No target specified (backup, flash, or format).", + .no_target = "No target specified (backup, flash, or format)", .expected_backup_arg = "Expected backup argument 2 (1 of them are not mandatory), retrieved", .expected_flash_arg = "Expected flash argument 2, retrieved", .expected_format_arg = "Expected format argument 2, retrieved", @@ -52,18 +54,24 @@ struct pmt_langdb_general en = { .ffile_more_part = "Flash file size exceeds partition capacity.", .cannot_get_bsz = "Failed to retrieve partition block size.", .format_fail = "Formatting failed! There is a possibility of data damage.", + .depr_backup_opt = "These options for the backup are unavailable.", + .depr_flash_opt = "These options for the flash are unavailable.", + .depr_format_opt = "These options for the format are unavailable.", + .depr_Vlicense_opt = "No memory for unnecessary options!", + .depr_ch_list_opt = "Use -p argument for listing partitions.", + .not_spec_opt = "Specify the necessary arguments, not option", .logical_warn = "This device uses logical partitions.", .ab_warn = "This device uses A/B partition style.", - .out_not_spec = "Output file name not specified. Using default name:", + .out_not_spec = "Output file name not specified. Using default name", .please_rerun = "Please rerun the command.", .part_disk_sz = "Partition disk size", .flash_file_sz = "Flash file size", .part_disk_sz_fail = "Failed to retrieve partition disk size.", .flash_file_sz_fail = "Failed to retrieve flash file size.", + .unknown_opr = "Unknown operand", .list_of_dir = "Directory listing", - .see_license = "View licenses using the -L argument.", - .success_backup = "Backup successful. Output:", - .success_flash = "Flash successful.", + .success_backup = "Backup successful. Output", + .success_flash = "Flash successful", .warn = "WARNING", .fatal = "FATAL ERROR", .switching_lang = "Switching language...", @@ -72,6 +80,9 @@ struct pmt_langdb_general en = { .for_more = "for more information", .try_h = "Try", .usage_head = "Usage", + .depr_opt_str = "DEPRECATED OPTION", + .switched_opt_str = "SWITCHED OPTION", + .not_changed_opt = "not changed", .compiler_str = "Compiler", .version_str = "version", .bin_str = "binary", @@ -90,6 +101,7 @@ struct pmt_langdb_general tr = { .not_open = "Açılamıyor", .not_block = "Belirtilen bölüm bir blok değil. Yani aslında bu bir bölüm bile değil (disk). Bu hatayı almak için şanslı olmak gerek..!", .not_read = "Veri okunamıyor", + .not_readdir = "Dizin verisi okunamıyor", .not_write = "Veri yazılamıyor", .not_gen = "Oluşturulamıyor", .no_root = "Root erişimi tespit edilemedi! Lütfen root erişimi ile çalıştırın.", @@ -97,7 +109,7 @@ struct pmt_langdb_general tr = { .expected_backup_arg = "Beklenen yedekleme argümanı 2 (bir tanesi zorunlu değil), alınan", .expected_flash_arg = "Beklenen flaş argümanı 2, alınan", .expected_format_arg = "Beklenen format argümanı 2, alınan", - .missing_operand = "işlem belirtilmedi", + .missing_operand = "İşlem belirtilmedi", .multiple_wiewers = "Birden fazla görüntüleme işlemi yapan fonksiyonlar bir arada kullanılamaz. Aynı anda sadece bir tanesi kullanılabilir.", .common_symbol_rule = "Bir seçeneğin argümanını verirken argüman önüne '-' sembolü getirilemez. Sembolü kaldırın ve tekrar deneyin.", .req_part_name = "Bölüm adı gereklidir.", @@ -107,7 +119,13 @@ struct pmt_langdb_general tr = { .ffile_more_part = "Flaşlanacak dosyanın boyutu mevcut bölüm boyutundan fazla.", .cannot_get_bsz = "Bölüm blok boyutu tespit edilemedi!", .format_fail = "Formatlama başarısız oldu. Bazı şeyler zarar görmüş olabilir!", + .depr_backup_opt = "Yedek için artık bu seçeneği kullanamazsınız.", + .depr_flash_opt = "Flaşlama için artık bu seçeneği kullanamazsınız.", + .depr_format_opt = "Formatlama için artıi bu seçeneği kullanamazsınız.", + .depr_Vlicense_opt = "Gereksiz seçeneklere bellek yok!", + .depr_ch_list_opt = "Listeleme için -p seçeneğini kullanabilirsiniz.", .logical_warn = "Uyarı: bu cihaz mantıksal (logical) bölümlere sahip.", + .not_spec_opt = "Seçenek değil, gerekli argümanları belirtin", .ab_warn = "Uyarı: bu cihazın bazı bölümleri A/B kullanıyor.", .out_not_spec = "Uyarı: çıktı dosya belirtilmedi. Çıktı dosya adı bölüm adına göre belirlenecek.", .please_rerun = "Lütfen yeniden çalıştırın", @@ -115,8 +133,8 @@ struct pmt_langdb_general tr = { .flash_file_sz = "Flaşlanacak dosyanın boyutu", .flash_file_sz_fail = "Uyarı: flaşlanacak dosyanın boyutu tespit edilemedi.", .part_disk_sz_fail = "Uyarı: bölüm boyutunun boyutu tespit edilemedi.", + .unknown_opr = "Bilinmeyen işlem", .list_of_dir = "Dizin içeriğinin listesi", - .see_license = "Lisansı -L seçeneği ile görüntüleyebilirsiniz.", .success_backup = "Başarılı. Çıktı", .success_flash = "Başarılı.", .warn = "UYARI", @@ -127,6 +145,9 @@ struct pmt_langdb_general tr = { .for_more = "komutunu kullanabilirsiniz", .try_h = "Daha fazla bilgi", .usage_head = "Kullanımı", + .depr_opt_str = "KALDIRILMIŞ SEÇENEK", + .switched_opt_str = "DEĞİŞTİRİLMİŞ SEÇENEK", + .not_changed_opt = "değiştirilmedi", .compiler_str = "Derleyici", .version_str = "versiyon", .bin_str = "yapı", @@ -136,8 +157,8 @@ struct pmt_langdb_general tr = { struct pmt_langdb_docs en_docs = { .docs_strs_l1 = "backup PARTITION [OUTPUT] [OPTIONS]...", - .docs_strs_l2 = "flash FILE PARTITION [OPTIONS]...", - .docs_strs_l3 = "format FILE_SYSTEM[ext/2/3/4] PARTITION [OPTIONS]...", + .docs_strs_l2 = "flash PARTITION FILE [OPTIONS]...", + .docs_strs_l3 = "format PARTITION FILE_SYSTEM[ext/2/3/4] [OPTIONS]...", .docs_strs_l4 = "Options", .docs_strs_l5 = "It is meant to determine whether the target partition is logical.", .docs_strs_l6 = "It is meant to specify a custom /dev context. Only classic partitions (default: /dev/block/by-name).", @@ -147,42 +168,38 @@ struct pmt_langdb_docs en_docs = { .docs_strs_l10 = "Set current language.", .docs_strs_l11 = "See version.", .docs_strs_l12 = "See this help message.", - .docs_strs_l13 = "See license.", - .docs_strs_l14 = "Examples", - .docs_strs_l15 = "Report bugs to", + .docs_strs_l13 = "Examples", + .docs_strs_l14 = "Report bugs to", .or_str = "or", .usage_docstr = "Usage" }; struct pmt_langdb_docs tr_docs = { .docs_strs_l1 = "backup BÖLÜM [ÇIKTI] [SEÇENEKLER]...", - .docs_strs_l2 = "flash DOSYA BÖLÜM [SEÇENEKLER]...", - .docs_strs_l3 = "format DOSYA_SİSTEMİ[ext/2/3/4] BÖLÜM [SEÇENEKLER]...", + .docs_strs_l2 = "flash BÖLÜM DOSYA [SEÇENEKLER]...", + .docs_strs_l3 = "format BÖLÜM DOSYA_SİSTEMİ[ext/2/3/4] [SEÇENEKLER]...", .docs_strs_l4 = "Seçenekler", - .docs_strs_l5 = "Bu seçeneği kullanarak mantıksal (logical) bir bölümle işlem yapılacağını belirtebilirsiniz.", - .docs_strs_l6 = "Bu seçeneği kullanarak özel /dev bağlamı belirtebilirsiniz. Sadece normal (mantıksal olmayan) bölümler içindir (Varsayılan: /dev/block/by-name).", + .docs_strs_l5 = "Mantıksal (logical) bölüm ile işlem yapın.", + .docs_strs_l6 = "Özel /dev bağlamı belirtin. Sadece normal bölümler içindir (Varsayılan: /dev/block/by-name).", .docs_strs_l7 = "Bölümler listelenir.", .docs_strs_l8 = "Bilgi ve uyarı mesajları susturulur.", .docs_strs_l9 = "Zorlama modu. Bazı şeyler göz ardı edilir.", .docs_strs_l10 = "Mevcut dili ayarlayın.", .docs_strs_l11 = "Sürümü görüntüleyin.", .docs_strs_l12 = "Bu yardım mesajını görüntüleyin.", - .docs_strs_l13 = "Lisansı gorüntüleyin.", - .docs_strs_l14 = "Örnekler", - .docs_strs_l15 = "Sorunları şu adrese bildirin:", + .docs_strs_l13 = "Örnekler", + .docs_strs_l14 = "Sorunları şu adrese bildirin:", .or_str = "yada", .usage_docstr = "Kullanımı" }; -char* pmt_langdb_langs[] = { - "en", - "tr" +struct pmt_langdb_langs lang[] = { + {"en"}, + {"tr"}, + {NULL} }; -int pmt_langdb_total = 2; -int pmt_langdb_ctrl = 1; - -#if defined(__cplusplus) +#ifdef __cplusplus } #endif diff --git a/jni/listpart.c b/jni/listpart.c index 41db35e..8dac0e5 100755 --- a/jni/listpart.c +++ b/jni/listpart.c @@ -1,4 +1,4 @@ -/* By YZBruh | ShawkTeam */ +/* By YZBruh */ /** * Copyright 2024 Partition Manager @@ -16,7 +16,7 @@ * limitations under the License. */ -#if defined(__cplusplus) +#ifdef __cplusplus extern "C" { #endif @@ -24,7 +24,8 @@ extern "C" { #define INC_DEBUGERS #define INC_DIRENT -#include +#include +#include /* current /dev context */ #define CUR_DEV_CNTX "/dev/block/by-name" @@ -32,25 +33,14 @@ extern "C" { /* for logical partitions */ #define LGC_DEV_CNTX "/dev/block/mapper" -extern bool pmt_use_cust_cxt; -extern bool pmt_ab; -extern bool pmt_logical; -extern bool pmt_silent; -extern bool pmt_force_mode; -extern char* cust_cxt; -extern char* bin_name; - -extern struct pmt_langdb_general* current; -extern struct pmt_langdb_general en; -extern struct pmt_langdb_general tr; - -DIR *dir; +static DIR *dir; static int list(const char* operation, const char* target_dir) { static bool list = false; - struct dirent *entry; + static int count; + struct dirent **nlist; dir = NULL; if (strcmp(operation, "access") == 0) @@ -64,25 +54,32 @@ list(const char* operation, const char* target_dir) if (dir != NULL) { - if (!list) - { - closedir(dir); - return 0; - } - else - { - LOGD("%s: `%s'\n", current->list_of_dir, target_dir); - while ((entry = readdir(dir)) != NULL) - { - LOGD("%s\n", entry->d_name); - } - closedir(dir); - return 0; - } + closedir(dir); + return 0; } else return -1; + if (list) + { + count = scandir(target_dir, &nlist, NULL, alphasort); + + if (count < 0) + LOGE("%s: `%s': %s\n", current->not_readdir, target_dir, strerror(errno)); + + for (int cont_count = 0; cont_count < count; cont_count++) + { + if (nlist[cont_count]->d_name[0] != '.') + LOGD("%s\n", nlist[cont_count]->d_name); + + free(nlist[cont_count]); + } + + free(nlist); + + return 0; + } + return 2; } @@ -131,7 +128,7 @@ int listpart(void) return 0; } -#if defined(__cplusplus) +#ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/jni/partitiontool.c b/jni/partitiontool.c index 2c1f69b..0df2d47 100755 --- a/jni/partitiontool.c +++ b/jni/partitiontool.c @@ -1,4 +1,4 @@ -/* By YZBruh | ShawkTeam */ +/* By YZBruh */ /** * Copyright 2024 Partition Manager @@ -16,24 +16,19 @@ * limitations under the License. */ -#if defined(__cplusplus) +#ifdef __cplusplus extern "C" { #endif #define INC_MAIN_LIBS -#include - -extern bool pmt_use_cust_cxt; -extern bool pmt_ab; -extern bool pmt_logical; -extern char* cust_cxt; +#include static int accf(const char* _Nonnull target) { return access(target, F_OK); } /* check parts */ -void check_dev_point() +void check_dev_point(void) { /* true = ab | false = a */ if (pmt_use_cust_cxt) @@ -74,7 +69,7 @@ void check_dev_point() } } -#if defined(__cplusplus) +#ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/jni/pmt.c b/jni/pmt.c old mode 100644 new mode 100755 index 5de1a69..9737c70 --- a/jni/pmt.c +++ b/jni/pmt.c @@ -17,7 +17,7 @@ */ /* force use C std (if default is C++) */ -#if defined(__cplusplus) +#ifdef __cplusplus extern "C" { #endif @@ -25,9 +25,11 @@ extern "C" { #define INC_DEBUGERS #define INC_STAT #define INC_GETOPT -#define INC_DOCS_REQS -#include +#include +#include +#include +#include /* add value to variables that are added globally and are not worth */ char* out = NULL; @@ -48,13 +50,6 @@ bool pmt_format = false; bool pmt_force_mode = false; bool pmt_inst_on_termux = false; -/* import language structs etc. */ -struct pmt_langdb_general* current = NULL; -extern struct pmt_langdb_general en; -extern struct pmt_langdb_general tr; -extern const char* pmt_langdb_langs[]; -extern int pmt_langdb_total; - /* variable for use in control of '-' expression */ static const char* opt_symbol = "-"; static char common_symbol_rule[350]; @@ -79,32 +74,37 @@ strdup(const char* s) * the beginning of the given word */ static void -check_optsym(const char* _Nonnull mystring) +check_optsym(const char* _Nullable symbol) { - if (strncmp(mystring, opt_symbol, 1) == 0) + if (symbol != NULL) { - if (!pmt_force_mode) + if (strncmp(symbol, opt_symbol, 1) == 0) LOGE("%s\n", common_symbol_rule); - else - exit(1); } } +static bool +ctrl_arg(const char* _Nullable argv_holder) +{ + if (strcmp(argv_holder, "--logical") != 0 && strcmp(argv_holder, "--context") != 0 && strcmp(argv_holder, "--silent") != 0 && strcmp(argv_holder, "-l") != 0 && strcmp(argv_holder, "-c") != 0 && strcmp(argv_holder, "-s") != 0) + return true; + + return false; +} + /* classic main function (C binary here xd) */ int main(int argc, char* argv[]) { bin_name = argv[0]; /* load language */ - static char* langctrl_str; - langctrl_str = loadlang(); + if (loadlang() != 0) + { + printf("loadlang fail\n"); + exit(1); + } - if (strcmp(langctrl_str, "en") == 0) - current = &en; - else if (strcmp(langctrl_str, "tr") == 0) - current = &tr; - - sprintf(common_symbol_rule, "%s\n", current->common_symbol_rule); + sprintf(common_symbol_rule, "%s", current->common_symbol_rule); if (search_sls() == 0) { @@ -119,7 +119,11 @@ int main(int argc, char* argv[]) LOGE("%s.\n%s `%s --help' %s.\n", current->missing_operand, current->try_h, argv[0], current->for_more); /* a structure for long arguments */ - struct option long_options[] = { + struct option option_table[] = { + {"backup", no_argument, 0, 'b'}, + {"flash", no_argument, 0, 'F'}, + {"format", no_argument, 0, 'r'}, + {"is_dummy", no_argument, 0, 'D'}, {"logical", no_argument, 0, 'l'}, {"context", required_argument, 0, 'c'}, {"list", no_argument, 0, 'p'}, @@ -134,8 +138,8 @@ int main(int argc, char* argv[]) /* boolean statements (only valid in this file) to distinguish. and pointer from a shortcut for the symbol rule */ static bool wiew_help = false; - static bool wiew_licenses = false; static bool wiew_version = false; + static bool logical_spec = false; static bool list_partitions = false; static bool combo_wiewers = false; static bool pmt_setlang = false; @@ -143,20 +147,104 @@ int main(int argc, char* argv[]) static int search_result = 3; static int opt; + if (strcmp(argv[1], "backup") == 0) + { + if (argc <= 2) + LOGE("%s 0.\n", current->expected_backup_arg); + + if (ctrl_arg(argv[2])) + target_partition = argv[2]; + else + LOGE("%s.\n", current->not_spec_opt); + + out = target_partition; + + if (argc > 3 && ctrl_arg(argv[3])) + out = argv[3]; + + check_optsym(target_partition); + check_optsym(out); + + pmt_backup = true; + } + else if (strcmp(argv[1], "flash") == 0) + { + if (argc <= 2) + LOGE("%s 0.\n", current->expected_flash_arg); + + if (argc <= 3) + LOGE("%s 1.\n", current->expected_flash_arg); + + if (ctrl_arg(argv[2])) + target_partition = argv[2]; + else + LOGE("%s.\n", current->not_spec_opt); + + if (ctrl_arg(argv[3])) + target_flash_file = argv[3]; + else + LOGE("%s.\n", current->not_spec_opt); + + check_optsym(target_flash_file); + check_optsym(target_partition); + + pmt_flash = true; + } + else if (strcmp(argv[1], "format") == 0) + { + + if (argc <= 2) + LOGE("%s 0.\n", current->expected_format_arg); + + if (argc <= 3) + LOGE("%s 1.\n", current->expected_format_arg); + + if (ctrl_arg(argv[2])) + target_partition = argv[2]; + else + LOGE("%s.\n", current->not_spec_opt); + + if (ctrl_arg(argv[3])) + format_fs = argv[3]; + else + LOGE("%s.\n", current->not_spec_opt); + + check_optsym(format_fs); + check_optsym(target_partition); + + pmt_format = true; + } + /* control for each argument */ - while ((opt = getopt_long(argc, argv, "lc:psfS:vL", long_options, NULL)) != -1) + while ((opt = getopt_long(argc, argv, "bFrDlc:psfS:vL", option_table, NULL)) != -1) { /* process arguments */ switch (opt) { + /* handle deprecates */ + case 'b': + DEPR_HANDLE('b', "backup", current->depr_backup_opt); + exit(1); + break; + case 'F': + DEPR_HANDLE('F', "flash", current->depr_flash_opt); + exit(1); + break; + case 'r': + DEPR_HANDLE('r', "format", current->depr_format_opt); + exit(1); + break; + case 'D': + DEPR_HANDLE('D', "NULLPTR", current->depr_ch_list_opt); + exit(1); + break; + case 'L': + DEPR_HANDLE('L', "license", current->depr_Vlicense_opt); + exit(1); + break; /* logical partitions option */ case 'l': - check_root(); - check_dev_point(); - if (pmt_logical) - pmt_use_logical = true; - else - LOGE("%s\n", current->not_logical); + logical_spec = true; break; /* context selector option */ case 'c': @@ -168,7 +256,7 @@ int main(int argc, char* argv[]) case 'p': list_partitions = true; /* check combo wiewer options and progress */ - if (wiew_version || wiew_help || wiew_licenses) combo_wiewers = true; + if (wiew_version || wiew_help) combo_wiewers = true; break; /* force mode option */ case 'f': @@ -187,19 +275,13 @@ int main(int argc, char* argv[]) case 'v': wiew_version = true; /* check combo wiewer options and progress */ - if (list_partitions || wiew_help || wiew_licenses) combo_wiewers = true; + if (list_partitions || wiew_help) combo_wiewers = true; break; /* help message opption */ case 0: wiew_help = true; /* check combo wiewer options and progress */ - if (wiew_version || list_partitions || wiew_licenses) combo_wiewers = true; - break; - /* license wiewer option */ - case 'L': - wiew_licenses = true; - /* check combo wiewer options and progress */ - if (wiew_version || wiew_help || list_partitions) combo_wiewers = true; + if (wiew_version || list_partitions) combo_wiewers = true; break; /* for invalid options */ case '?': @@ -207,7 +289,7 @@ int main(int argc, char* argv[]) return 1; break; default: - LOGD("%s: %s [backup] [flash] [format] [-l | --logical] [-c | --context] [-p | --list] [-v | --version] [--help] [-L | --license]\n", current->usage_head, argv[0]); + LOGD("%s: %s [backup] [flash] [format] [-l | --logical] [-c | --context] [-p | --list] [-s | --silent] [-v | --version] [--help]\n", current->usage_head, argv[0]); return 1; } } @@ -227,11 +309,6 @@ int main(int argc, char* argv[]) version(); return 0; } - else if (wiew_licenses) - { - licenses(); - return 0; - } else if (list_partitions) { check_root(); @@ -241,81 +318,31 @@ int main(int argc, char* argv[]) if (pmt_setlang) { LOGD("%s: %s\n", argv[0], current->switching_lang); - setlang(langpr); + setlang(langpr, 0); sleep(2); LOGD("%s: %s.\n", argv[0], current->please_rerun); return 0; } - /* detect target mode */ - static char arg1[20]; - sprintf(arg1, "%s", argv[1]); - - if (strcmp(argv[1], "backup") == 0) - { - if (argc == 2) - LOGE("%s 0.\n", current->expected_backup_arg); - - target_partition = argv[2]; - - if (argc == 3) - out = target_partition; - else - out = argv[3]; - - check_optsym(target_partition); - check_optsym(out); - - pmt_backup = true; - } - else if (strcmp(argv[1], "flash") == 0) - { - if (argc == 2) - LOGE("%s 0.\n", current->expected_flash_arg); - - if (argc == 2) - LOGE("%s 1.\n", current->expected_flash_arg); - - target_flash_file = argv[2]; - - target_partition = argv[3]; - - check_optsym(target_flash_file); - check_optsym(target_partition); - - pmt_flash = true; - } - else if (strcmp(argv[1], "format") == 0) - { - - if (argc == 2) - LOGE("%s 0.\n", current->expected_format_arg); - - if (argc == 3) - LOGE("%s 1.\n", current->expected_format_arg); - - format_fs = argv[2]; - - target_partition = argv[3]; - - check_optsym(format_fs); - check_optsym(target_partition); - - pmt_format = true; - } - - /* target control is done */ if (!pmt_backup && !pmt_flash && !pmt_format) - LOGE("%s `%s --help` %s\n", current->missing_operand, current->try_h, current->for_more); + LOGE("%s.\n%s `%s --help` %s\n", current->no_target, current->try_h, argv[0], current->for_more); + + if (pmt_format) + { + if (strcmp(format_fs, "ext4") != 0 && strcmp(format_fs, "ext3") != 0 && strcmp(format_fs, "ext2") != 0) + LOGE("%s: %s\n", current->unsupported_fs, format_fs); + } /* checks */ check_root(); check_dev_point(); - if (pmt_format) + if (logical_spec) { - if (strcmp(format_fs, "ext4") != 0 || strcmp(format_fs, "ext3") != 0 || strcmp(format_fs, "ext2") != 0) - LOGE("%s: %s\n", current->unsupported_fs, format_fs); + if (pmt_logical) + pmt_use_logical = true; + else + LOGE("%s\n", current->not_logical); } if (pmt_flash) @@ -362,13 +389,11 @@ int main(int argc, char* argv[]) return pmt(2); else if (pmt_format) return pmt(3); - else - LOGE("%s\n%s `%s --help' %s\n", current->no_target, current->try_h, argv[0], current->for_more); } } -#if defined(__cplusplus) +#ifdef __cplusplus } #endif -/* end of code */ \ No newline at end of file +/* end of code */ diff --git a/jni/root.c b/jni/root.c index f6ccc86..8f9edb7 100755 --- a/jni/root.c +++ b/jni/root.c @@ -1,4 +1,4 @@ -/* By YZBruh | ShawkTeam */ +/* By YZBruh */ /** * Copyright 2024 Partition Manager @@ -16,18 +16,15 @@ * limitations under the License. */ -#if defined(__cplusplus) +#ifdef __cplusplus extern "C" { #endif #define INC_MAIN_LIBS #define INC_DEBUGERS -#include - -extern struct pmt_langdb_general* current; -extern struct pmt_langdb_general en; -extern struct pmt_langdb_general tr; +#include +#include /* root checker function */ void check_root(void) @@ -37,7 +34,7 @@ void check_root(void) LOGE("%s\n", current->no_root); } -#if defined(__cplusplus) +#ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/jni/tools.c b/jni/tools.c index 3c1321d..8e9b105 100755 --- a/jni/tools.c +++ b/jni/tools.c @@ -1,4 +1,4 @@ -/* By YZBruh | ShawkTeam */ +/* By YZBruh */ /** * Copyright 2024 Partition Manager @@ -16,7 +16,7 @@ * limitations under the License. */ -#if defined(__cplusplus) +#ifdef __cplusplus extern "C" { #endif @@ -26,26 +26,8 @@ extern "C" { #define INC_DEBUGERS #define INC_TOOLS_REQS -#include - -extern char* out; -extern char* format_fs; -extern char* cust_cxt; -extern char* target_partition; -extern char* target_flash_file; -extern char* partition_type; -extern char* bin_name; -extern bool pmt_use_logical; -extern bool pmt_use_cust_cxt; -extern bool pmt_logical; -extern bool pmt_flash; -extern bool pmt_backup; -extern bool pmt_silent; -extern bool pmt_force_mode; - -extern struct pmt_langdb_general* current; -extern struct pmt_langdb_general en; -extern struct pmt_langdb_general tr; +#include +#include /** * it is meant to calculate the size of the quickly given file. @@ -80,8 +62,6 @@ partition_not_found(void) { LOGE("%s\n", current->part_not_found); } /* to stop use of function type */ #define partition_not_found partition_not_found() - - /* the partitions are meant to quickly find. */ static void search_partition(const char* _Nonnull partition) @@ -135,13 +115,13 @@ int pmt(unsigned short progress_code) /* determine output */ if (strcmp(out, target_partition) == 0) { - sprintf(outf, "%s.img", target_partition); + sprintf(outf, "%s.img", out); LOGW("%s: %s\n", current->out_not_spec, outf); } else - sprintf(outf, "%s", target_partition); + sprintf(outf, "%s", out); - targetf = open(outf, O_WRONLY | O_CREAT | O_TRUNC, 0666); + targetf = open(outf, O_WRONLY | O_CREAT | O_TRUNC, 0660); if (targetf == -1) LOGE("%s: %s: %s\n", current->not_gen, outf, strerror(errno)); @@ -188,19 +168,22 @@ int pmt(unsigned short progress_code) else LOGW("%s\n", current->flash_file_sz_fail); - if (calc_flsz(target_partition) != -1) - LOGD("%s: %.2f\n", current->part_disk_sz, calc_flsz(target_partition)); + if (calc_flsz(flasher_path) != -1) + LOGD("%s: %.2f\n", current->part_disk_sz, calc_flsz(flasher_path)); else LOGW("%s\n", current->part_disk_sz_fail); - if (calc_flsz(target_flash_file) > calc_flsz(target_partition)) - LOGE("%s\n", current->ffile_more_part); + if (calc_flsz(target_flash_file) != -1 && calc_flsz(flasher_path) != -1) + { + if (calc_flsz(target_flash_file) > calc_flsz(flasher_path)) + LOGE("%s\n", current->ffile_more_part); + } srcf = open(target_flash_file, O_RDONLY); if (srcf == -1) LOGF("%s: %s: %s\n", current->not_read, target_flash_file, strerror(errno)); - targetf = open(target_partition, O_WRONLY | O_CREAT | O_TRUNC, 0666); + targetf = open(target_partition, O_WRONLY | O_CREAT | O_TRUNC, 0660); if (targetf == -1) LOGF("%s: %s: %s\n", current->not_read, target_partition, strerror(errno)); @@ -252,7 +235,7 @@ int pmt(unsigned short progress_code) return 0; } -#if defined(__cplusplus) +#ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/jni/versioner.c b/jni/versioner.c index bdd74c9..03433c5 100755 --- a/jni/versioner.c +++ b/jni/versioner.c @@ -1,4 +1,4 @@ -/* By YZBruh | ShawkTeam */ +/* By YZBruh */ /** * Copyright 2024 Partition Manager @@ -16,20 +16,15 @@ * limitations under the License. */ -#if defined(__cplusplus) +#ifdef __cplusplus extern "C" { #endif #define INC_MAIN_LIBS -#define INC_VERSIONER_REQS -#include - -extern char* bin_name; - -extern struct pmt_langdb_general* current; -extern struct pmt_langdb_general en; -extern struct pmt_langdb_general tr; +#include +#include +#include void version(void) { @@ -43,14 +38,14 @@ void version(void) LOGD("<%s> %s\n", current->unknw_str, current->bin_str); #endif - #if defined(__clang__) - LOGD("%s: clang %d.%d.%d (NDK r%d%s %s)\n", current->compiler_str, __clang_major__, __clang_minor__, __clang_patchlevel__, __NDK_MAJOR__, __NDK_MINOR_STATUS__, __NDK_BETA_STATUS__); + #if defined(__clang__) && !defined(__NDK_BUILD) + LOGD("%s: clang %d.%d.%d\n", current->compiler_str, __clang_major__, __clang_minor__, __clang_patchlevel__); + #elif defined(__clang__) && defined(__NDK_BUILD) + LOGD("%s\n", __NDK_CC_VERSION__); #endif - - LOGD("%s\n", current->see_license); } -#if defined(__cplusplus) +#ifdef __cplusplus } #endif diff --git a/out/Makefile b/out/Makefile new file mode 100755 index 0000000..204bc08 --- /dev/null +++ b/out/Makefile @@ -0,0 +1,126 @@ +# By YZBruh + +# Copyright 2024 Partition Manager +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +##### +# sub-make for installing-uninstalling +##### + +THIS_IS := out + +# include needed variables +include ../Makefile.inc +-include $(BUILD)/config/INS_STAT.mk +-include $(BUILD)/config/UNINS_STAT.mk + +# create an empty target +all: + $(hide)printf "" + +# installer +.PHONY: install +install: + # really termux? + $(hide)if [ -f $(TERMUX_BIN)/termux-open ]; then \ + printf " ------------ $(TARGET) installer ------------ \n"; \ + if [ -f $(TERMUX_BIN)/$(TARGET) ]; then \ + printf " - $(TARGET) already installed\n"; \ + exit; \ + fi; \ + if [ ! "$(INSTALL_SUCCESS)" = "true" ] && [ ! "$(INSTALL_SUCCESS)" = "" ]; then \ + printf " - $(YELLOW)$(BOLD)Warning:$(BOLD_RESET)$(RESET) a previously-stayed failed installation process found\n"; \ + fi; \ + if [ -f $(DEB_DIR)/*.deb ]; then \ + printf " - The created deb pack was found. It's setup...\n"; \ + cd $(DEB_DIR) || exit 1; \ + apt install ./*.deb || exit 1; \ + if [ ! "$?" = "0" ]; then \ + cd $(CUR_DIR); \ + printf " - Success.\n\n"; \ + echo "INSTALL_SUCCESS := true" > $(BUILD)/config/INS_STAT.mk; \ + echo "UNINSTALLED_SUCCESS := " > $(BUILD)/config/UNINS_STAT.mk; \ + cd ..; \ + exit 0; \ + else \ + cd $(CUR_DIR); \ + printf " - $(RED)$(BOLD)Error:$(BOLD_RESET)$(RESET) installing failed!\n"; \ + echo "INSTALL_SUCCESS := false" > $(BUILD)/config/INS_STAT.mk; \ + cd ..; \ + exit 1; \ + fi; \ + fi; \ + if [ ! -f $(BINARY_DIR)/$(TARGET) ]; then \ + printf " - $(RED)$(BOLD)Error:$(BOLD_RESET)$(RESET) Package not builded! Please build package and try again \n"; \ + echo "INSTALL_SUCCESS := false" > $(BUILD)/config/INS_STAT.mk; \ + exit 1; \ + fi; \ + printf " - Installing binary...\n"; \ + if [ "`cp $(BINARY_DIR)/$(TARGET) /data/data/com.termux/files/usr/bin/$(TARGET)`" = "" ]; then \ + printf " - Setting up permissions...\n"; \ + else \ + echo "INSTALL_SUCCESS := false" > $(BUILD)/config/INS_STAT.mk; \ + exit 1; \ + fi; \ + if [ "`chmod 777 $(TERMUX_BIN)/$(TARGET)`" = "" ]; then \ + printf " - Saving current status...\n"; \ + echo "INSTALL_SUCCESS := true" > $(BUILD)/config/INS_STAT.mk; \ + else \ + echo "INSTALL_SUCCESS := false" > $(BUILD)/config/INS_STAT.mk; \ + exit 1; \ + fi; \ + printf " - Success.\n\n"; \ + echo "INSTALL_SUCCESS := true" > $(BUILD)/config/INS_STAT.mk; \ + echo "UNINSTALLED_SUCCESS := " > $(BUILD)/config/UNINS_STAT.mk; \ + else \ + printf " - $(RED)$(BOLD)Error:$(BOLD_RESET)$(RESET) This function is only available on Termux.\n"; \ + exit 1; \ + fi + +# uninstaller +.PHONY: uninstall +uninstall: + # really termux? + $(hide)if [ -f $(TERMUX_BIN)/termux-open ]; then \ + printf " ----------- $(TARGET) uninstaller ----------- \n"; \ + if [ ! -f $(TERMUX_BIN)/$(TARGET) ]; then \ + printf " - $(TARGET) already uninstalled\n"; \ + exit; \ + fi; \ + if [ ! "$(UNINSTALL_SUCCESS)" = "true" ] && [ ! "$(UNINSTALL_SUCCESS)" = "" ]; then \ + printf " - $(YELLOW)$(BOLD)Warning:$(BOLD_RESET)$(RESET) a previously-stayed failed uninstallation process found\n"; \ + fi; \ + if [ -f $(TERMUX_USR)/share/man/man8/$(TARGET).8.gz ]; then \ + printf " - It was found to be established by $(TARGET)'s deb pack. It's removed with apt...\n"; \ + apt remove -y $(TARGET) || exit 1; \ + printf " - Success.\n\n"; \ + echo "UNINSTALLED_SUCCESS := true" > $(BUILD)/config/UNINS_STAT.mk; \ + echo "INSTALL_SUCCESS := " > $(BUILD)/config/INS_STAT.mk; \ + else \ + printf " - It was found that pmt was manually established (with this makefile or copying). Manually removed...\n"; \ + if [ "`rm $(TERMUX_BIN)/$(TARGET)`" = "" ]; then \ + printf " - Success.\n\n"; \ + echo "UNINSTALLED_SUCCESS := true" > $(BUILD)/config/UNINS_STAT.mk; \ + echo "INSTALL_SUCCESS := " > $(BUILD)/config/INS_STAT.mk; \ + else \ + echo "UNINSTALLED_SUCCESS := false" > $(BUILD)/config/UNINS_STAT.mk; \ + exit 1; \ + fi; \ + fi; \ + else \ + printf "$(RED)$(BOLD)Error:$(BOLD_RESET)$(RESET) This function is only available on Termux.\n"; \ + exit 1; \ + fi + +# end \ No newline at end of file diff --git a/utils.sh b/utils.sh deleted file mode 100755 index 4a7a7c2..0000000 --- a/utils.sh +++ /dev/null @@ -1,208 +0,0 @@ -#!/usr/bin/bash -# By YZBruh | ShawkTeam - -# Copyright 2024 Partition Manager -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# ANSI color codes -RED='\e[31m' -NC='\e[0m' - -# needed variables -VERSION="2.4.0" -CUR_DIR=$(pwd) -LIB_DIR=${CUR_DIR}/libs -ARMV8A_DIR=${LIB_DIR}/arm64-v8a -ARMV7A_DIR=${LIB_DIR}/armeabi-v7a -DEB_DIR=${CUR_DIR}/deb -DEBUTILS_DIR=${CUR_DIR}/debutils -DEBTERMUX_USR=${DEBUTILS_DIR}/data/data/com.termux/files/usr - -# set file modes (all) to 755 -${SUDO} chmod -R 755 * - -# error messages -abort() -{ - if [ ! "$1" = "" ]; then - printf "${RED}${1}${NC}\n" - fi - if [ -d ${DEBUTILS_DIR}/temp ]; then - rm -rf ${DEBUTILS_DIR}/temp - fi - exit 1 -} - -gen_deb() -{ - printf " --------- Making pmt deb package ---------\n"; - printf " - Checking all files and directories (only -eededs)...\n"; - - # check important files - if [ ! -d ${DEBUTILS_DIR} ]; then - abort " - Not found: ${DEBUTILS_DIR}\n" - fi - if [ ! -d ${DEBUTILS_DIR}/DEBIAN ]; then - abort " - Not found: ${DEBUTILS_DIR}/DEBIAN\n" - fi - if [ ! -d ${DEBUTILS_DIR}/mandoc ]; then - abort " - Not found: ${DEBUTILS_DIR}/mandoc\n" - fi - if [ ! -d ${DEBUTILS_DIR}/data/data/com.termux ]; then - abort " - Not found: ${DEBUTILS_DIR}/data/data/com.termux\n" - fi - if [ ! -d ${DEBUTILS_DIR}/data/data/com.termux/files/usr ]; then - abort " - Not found: ${DEBUTILS_DIR}/data/data/com.termux/files/usr\n" - fi - if [ ! -d ${DEBUTILS_DIR}/data/data/com.termux/files/usr/bin ]; then - abort " - Not found: ${DEBUTILS_DIR}/data/data/com.termux/files/usr/bin\n" - fi - if [ ! -d ${DEBUTILS_DIR}/data/data/com.termux/files/usr/share/man/man8 ]; then - abort " - Not found: ${DEBUTILS_DIR}/data/data/com.termux/files/usr/share/man/man8\n" - fi - if [ ! -f ${DEBUTILS_DIR}/mandoc/pmt.8.gz ]; then - abort " - Not found: ${DEBUTILS_DIR}/mandoc/pmt.8.gz\n" - fi - if [ ! -f ${DEBUTILS_DIR}/DEBIAN/control_32 ]; then - abort " - Not found: ${DEBUTILS_DIR}/DEBIAN/control_32\n" - fi - if [ ! -f ${DEBUTILS_DIR}/DEBIAN/control_64 ]; then - abort " - Not found: ${DEBUTILS_DIR}/DEBIAN/control_64\n" - fi - if [ ! -f ${ARMV8A_DIR}/pmt ]; then - abort " - Package not comptely builded! Please build package and try again\n" - elif [ ! -f ${ARMV7A_DIR}/pmt ]; then - abort " - Package not comptely builded! Please build package and try again\n" - fi - - # generate template dir - printf " - Generating template dir...\n" - ${SUDO} mkdir -p ${DEBUTILS_DIR}/temp || abort - - # generate out dir - printf " - Generating out dir...\n" - ${SUDO} mkdir -p ${DEB_DIR} || abort - - # copy files - printf " - Copying files...\n" - ${SUDO} cp -r ${DEBUTILS_DIR}/data ${DEBUTILS_DIR}/temp || abort - ${SUDO} rm -f ${DEBTERMUX_USR}/share/man/man8/dummy - ${SUDO} rm -f ${DEBTERMUX_USR}/bin/dummy - ${SUDO} mkdir -p ${DEBUTILS_DIR}/temp/DEBIAN || abort - - # select control file - printf " - Selected arm-${PREFIX} package control file.\n" - ${SUDO} cp ${DEBUTILS_DIR}/DEBIAN/control_${PREFIX} ${DEBUTILS_DIR}/temp/DEBIAN/control || exit 1 - ${SUDO} cp ${DEBUTILS_DIR}/mandoc/pmt.8.gz ${DEBTERMUX_USR}/share/man/man8 || abort - if [ "${PREFIX}" = "64" ]; then - ${SUDO} cp ${ARMV8A_DIR}/pmt ${DEBTERMUX_USR}/bin || abort - elif [ "${PREFIX}" = "32" ]; then - ${SUDO} cp ${ARMV7A_DIR}/pmt ${DEBTERMUX_USR}/bin || abort - fi - - # start dpkg-deb - printf " - Starting dpkg-deb...\n" - sleep 2 - ${SUDO} chmod -R 755 * - - # if ARM_PREFIX is '-v7a', unset ARM_PREFIX and PREFIX. Re set PREFIX - if [ "${PREFIX}" = "32" ]; then - unset PREFIX - PREFIX="eabi-v7a" - fi - - ${SUDO} dpkg-deb -b ${DEBUTILS_DIR}/temp ${DEB_DIR}/pmt-${VERSION}-arm${PREFIX}${ARM_PREFIX}.deb || abort - ${SUDO} rm -rf ${DEBUTILS_DIR}/temp - - printf " - Done! Package: ${DEB_DIR}/pmt-${VERSION}-arm${PREFIX}${ARM_PREFIX}.deb\n" -} - -gen_modpack() -{ - printf " ----------- Making static lib package -----------\n" - printf " - Checking files...\n" - - if [ ! -f $(STATICLIB_DIR)/libpmt_root.a ]; then - printf " - Not found: $(STATICLIB_DIR)/libpmt_root.a\n" - exit 1 - fi - if [ ! -f $(STATICLIB_DIR)/libpmt_lister.a ]; then - printf " - Not found: $(STATICLIB_DIR)/libpmt_lister.a\n" - exit 1 - fi - if [ ! -f $(STATICLIB_DIR)/libpmtpartition_tool.a ]; then - printf " - Not found: $(STATICLIB_DIR)/libpmtpartition_tool.a\n" - exit 1 - fi - - printf " - Compressing...\n" - mkdir -p static-lib-pack - cd static-lib-pack - cp jni/include/pmt.h . - mkdir -p include - mv pmt.h include/ - zip -rq pmt-static-lib-pack.zip *.a include || exit 1 - rm -rf include - sleep 1 - printf " - Success.\n\n" - cd .. -} - -case "${1}" in - make-deb) - case "${2}" in - arm64-v8a) - PREFIX="64" - ARM_PREFIX="-v8a" - ;; - armeabi-v7a) - PREFIX="32" - ARM_PREFIX="" - ;; - *) - abort " - Error: unknown architecture flag: $2. Avaiable: arm64-v8a & armeabi-v7a.\n" - esac - - case "${3}" in - sudo) - SUDO="sudo" - ;; - no-sudo) - SUDO="" - ;; - *) - SUDO="" - esac - gen_deb - ;; - modpack) - case "${2}" in - arm64-v8a) - STATICLIB_DIR="${CUR_DIR}/obj/local/${2}" - ;; - armeabi-v7a) - STATICLIB_DIR="${CUR_DIR}/obj/local/${2}" - ;; - *) - abort " - Error: unknown architecture flag: ${2}. Avaiable: arm64-v8a & armeabi-v7a.\n" - esac - - gen_modpack - ;; - *) - abort "${0}: invalid operand.\nUse the make-deb flag to create a deb package, and the modpack flag to create packages for static libraries." -esac - -# end of script