9 Commits
Author SHA1 Message Date
EnumDev 39b56204ae Fixed 'skip check' flag and added .compilation-options files that can alter the metadata of the output binary bpm file 2024-09-09 09:23:46 +00:00
CapCreeperGR 190a670cff Added split-package functionality and the create-repository-data script for unpac repository creation 2024-07-12 15:35:55 +00:00
CapCreeperGR d077b13a3f Added -g flag to bpm-setup for automatic git repository initialization 2024-07-05 11:52:22 +03:00
EnumDev 5d868579af Multiple improvements to the BPM-Utils 2024-07-01 13:45:50 +03:00
EnumDev 6b82675582 bpm-convert will now read global variables in source.sh 2024-06-01 20:24:57 +03:00
EnumDev 8b39b3d575 Fixed minor mistake in source.default 2024-06-01 20:10:56 +03:00
EnumDev 3ea431b98d Added '-a <architecture>' flag to to bpm-package 2024-05-30 15:55:47 +03:00
EnumDev a3a97efd59 Updated source.default, updated bpm-package and added bpm-convert
source.default now uses the new PKGBUILD-like structure
bpm-package now accepts a '-c' flag that creates an additional binary package from a source package
bpm-convert creates a binary package from a source package
2024-05-30 14:23:14 +03:00
EnumDev ede04e3aba Updated README.md 2024-05-02 18:50:53 +03:00
6 changed files with 331 additions and 31 deletions
+5 -4
View File
@@ -8,12 +8,13 @@ BPM Utils is a package providing a number of different helper scripts for settin
## Provided Scripts ## Provided Scripts
- bpm-setup (Creates a directory with the required files for a BPM package) - bpm-setup (Creates a directory with the required files for a BPM package)
- bpm-package (Turns a BPM package directory into a .bpm archive) - bpm-package (Turns a BPM package directory into a .bpm archive)
- bpm-convert (Converts source packages to binary ones)
- create-repository-data (Generates a repository package data list for unpac)
## Installation ## Installation
Currently all BPM Utilities are simple bash scripts. This means you are able to simply clone this repository and place these scripts wherever you would like. Additionally pre-made packages are available for the following Linux distributions: Currently all BPM Utilities are simple bash scripts. This means you are able to simply clone this repository and place these scripts wherever you would like
## Package Creation using BPM Utils ## Package Creation using BPM Utils
Creating a package for BPM with these utilities is simple Creating a package for BPM with these utilities is simple
@@ -46,7 +47,7 @@ bpm-package <filename.bpm>
3) If you would like to bundle patches or other files with your source package place them in the 'source-files' directory. They will be extracted to the same location as the source.sh file during compilation 3) If you would like to bundle patches or other files with your source package place them in the 'source-files' directory. They will be extracted to the same location as the source.sh file during compilation
4) You need to edit your 'source.sh' file, the default source.sh template should explain the basic process of compiling your program 4) You need to edit your 'source.sh' file, the default source.sh template should explain the basic process of compiling your program
5) Your goal is to download your program's source code with either git, wget, curl, etc. and put the binaries under a folder called 'output' in the root of the temp directory. There is a simple example script with helpful comments in the htop-src test package 5) Your goal is to download your program's source code with either git, wget, curl, etc. and put the binaries under a folder called 'output' in the root of the temp directory. There is a simple example script with helpful comments in the htop-src test package
6) When you are done making your source.sh script run the following to create a package archive 6) When you are done making your source.sh script run the following to create a package archive. You may also append the -c flag to compile the package and create a binary package as well
``` ```
bpm-package <filename.bpm> bpm-package <filename.bpm>
``` ```
Executable
+170
View File
@@ -0,0 +1,170 @@
#!/bin/bash
if [ -f .compilation-options ]; then
source ./.compilation-options
fi
echo "$ARCH"
while getopts "ksa:" o; do
case "${o}" in
a) ARCH="$OPTARG";;
k) KEEP=true;;
s) SKIPCHECK=true;;
*) exit 1;;
esac
done
PACKAGE="${@:$OPTIND:1}"
DIR="$PWD"
if [ -z "$ARCH" ]; then
ARCH=$(uname -m)
fi
if ! [ -f "$PACKAGE" ]; then
echo "$PACKAGE is not a path to a file"
exit 1
fi
if ! file "$PACKAGE" | grep -q 'gzip compressed data'; then
echo "$PACKAGE is not a BPM package"
exit 1
fi
if ! tar -tf "$PACKAGE" | grep -q 'source.sh'; then
echo "$PACKAGE is not a BPM source package"
exit 1
fi
echo "$Converting $PACKAGE..."
declare -A PKGINFO
# Declare and run Read Package Information function
function ReadPkgInfo() {
local BACK="$PWD"
cd "$DIR"
if [ $# -eq 0 ]; then
FILE=pkg.info
PKGINFO_FILE=$(tar -xf "$PACKAGE" pkg.info -O)
else
FILE=pkg.info."$1"
fi
if ! tar -tf "$PACKAGE" "$FILE"; then
echo "Could not find $FILE in $PACKAGE"
exit 1
fi
PKGINFO_FILE=$(tar -xf "$PACKAGE" "$FILE" -O)
while read line; do
PKGINFO[$(echo -n "$line" | cut -d":" -f1 | xargs)]=$(echo -n "$line" | cut -d":" -f2 | xargs)
done < <(tar -xf "$PACKAGE" "$FILE" -O)
cd "$BACK"
}
ReadPkgInfo
# Creating temporary compilation directory structure
TEMPDIR="/var/tmp/bpm_source_${PKGINFO[name]}"
if [ -d "$TEMPDIR" ] && [ -z "$KEEP" ]; then
rm -rf "$TEMPDIR"
fi
mkdir -p "$TEMPDIR"
mkdir -p "$TEMPDIR"/source
mkdir -p "$TEMPDIR"/output
tar -xf "$PACKAGE" -C "$TEMPDIR" source.sh
if tar -xf "$PACKAGE" -C "$TEMPDIR" source-files &> /dev/null; then
mv "$TEMPDIR"/source-files/* "$TEMPDIR"/
rm -d "$TEMPDIR"/source-files
fi
cd "$TEMPDIR"
# Declare and run Set Variables function
function SetVariables() {
export BPM_PKG_NAME="${PKGINFO[name]}"
export BPM_PKG_DESC="${PKGINFO[description]}"
export BPM_PKG_VERSION="${PKGINFO[version]}"
export BPM_PKG_URL="${PKGINFO[url]}"
export BPM_PKG_ARCH="${PKGINFO[architecture]}"
IFS=',' read -r -a BPM_PKG_DEPENDS <<< "${PKGINFO[depends]}"
IFS=',' read -r -a BPM_PKG_MAKE_DEPENDS <<< "${PKGINFO[make_depends]}"
export BPM_PKG_DEPENDS
export BPM_PKG_MAKE_DEPENDS
export BPM_WORKDIR="$TEMPDIR"
export BPM_SOURCE="$TEMPDIR"/source
export BPM_OUTPUT="$TEMPDIR"/output
}
SetVariables
# Declare Run Package Function function
function RunPkgFunction() {
if [ $# -eq 0 ]; then
echo "No function name given"
exit 1
fi
func="$1"
if [[ $(type -t "$func") == function ]]; then
echo "Running ${func}() function..."
bash -e -c "$func"
if [ $? -ne 0 ]; then
echo "Failed to run ${func}() function in source.sh"
exit 1
fi
fi
}
# Read source.sh file and source functions
set -a
source source.sh
set +a
cd "$BPM_WORKDIR"
RunPkgFunction prepare
cd "$BPM_SOURCE"
RunPkgFunction build
cd "$BPM_SOURCE"
if [ -z "$SKIPCHECK" ]; then
RunPkgFunction check
fi
# Packaging all packages
for func in $(typeset -F | awk '{print $3}' | grep '^package'); do
cd "$BPM_SOURCE"
if [[ "$func" == "package" ]]; then
pkgname="$BPM_PKG_NAME"
ReadPkgInfo
else
pkgname="${func##package-}"
ReadPkgInfo "$pkgname"
fi
SetVariables
echo "Running ${func}() function..."
touch "$TEMPDIR"/fakeroot_file_"$pkgname"
fakeroot -s "$TEMPDIR"/fakeroot_file_"$pkgname" bash -e -c "$func"
if [ $? -ne 0 ]; then
echo "Failed to run ${func}() function in source.sh"
exit 1
fi
cd "$BPM_WORKDIR"
touch pkg.info
if [[ "$pkgname" == "$BPM_PKG_NAME" ]]; then
echo "${PKGINFO_FILE}" > pkg.info
else
echo "${PKGINFO_FILE}" > pkg.info
fi
echo "${PKGINFO_FILE}" > pkg.info
sed -i "s/architecture:.*/architecture: ${ARCH}/g" pkg.info
sed -i 's/type:.*/type: binary/g' pkg.info
fakeroot -i "$TEMPDIR"/fakeroot_file_"$pkgname" tar -czpf "$pkgname".tar.gz pkg.info output --transform 's/output/files/'
mv "$pkgname".tar.gz "$DIR"/"$pkgname"-"$BPM_PKG_VERSION"-"$ARCH".bpm
echo "Packaged ${pkgname} successfully!"
rm "$TEMPDIR"/fakeroot_file_"$pkgname"
rm -r output/
mkdir output
rm pkg.info
done
if [ -z "$KEEP" ]; then
rm -rf "$TEMPDIR"
fi
+34 -4
View File
@@ -5,7 +5,21 @@ then
exit 1 exit 1
fi fi
output=$1 if [ -f .compilation-options ]; then
source ./.compilation-options
fi
while getopts "cska:" flag; do
case "$flag" in
c) CONVERT=true;;
k) KEEP=true;;
s) SKIPCHECK=true;;
a) ARCH="${OPTARG}";;
*) exit 1;;
esac
done
output="${@:$OPTIND:1}"
if [[ ! "$output" =~ ^[a-z.A-Z0-9_-]{1,}$ ]]; then if [[ ! "$output" =~ ^[a-z.A-Z0-9_-]{1,}$ ]]; then
echo "Invalid output name! The name must only contain letters, numbers, hyphens or underscores!" echo "Invalid output name! The name must only contain letters, numbers, hyphens or underscores!"
@@ -13,7 +27,7 @@ if [[ ! "$output" =~ ^[a-z.A-Z0-9_-]{1,}$ ]]; then
fi fi
type="binary" type="binary"
toCompress=("pkg.info") toCompress=()
echo "Creating package with the name $output..." echo "Creating package with the name $output..."
@@ -64,6 +78,22 @@ else
exit 1 exit 1
fi fi
echo "Creating $type package as $output" for pkginfo in ./pkg.inf*; do
pkginfo=$(basename "$pkginfo")
echo "${pkginfo} file found"
toCompress+=("$pkginfo")
done
tar -czf "$output" "${toCompress[@]}" echo "Creating $type package as $output"
tar -c --owner=0 --group=0 --no-same-owner -zf "$output" "${toCompress[@]}"
if [ ! -z "$CONVERT" ] && "$CONVERT" && [[ "$type" == "source" ]]; then
args=()
if ! [ -z "$KEEP" ]; then
args+=("-a" "$ARCH")
fi
if ! [ -z "$SKIPCHECK" ]; then
args+=("-s")
fi
bpm-convert "${args[@]}" -a "$ARCH" "$output"
fi
+20 -1
View File
@@ -11,6 +11,7 @@ usage () {
echo "bpm-setup -l <licenses> | Set the package licenses (Optional)" echo "bpm-setup -l <licenses> | Set the package licenses (Optional)"
echo "bpm-setup -t <binary/source> | Set the package type to binary or source (Defaults to binary)" echo "bpm-setup -t <binary/source> | Set the package type to binary or source (Defaults to binary)"
echo "bpm-setup -s <source template file> | Use a default template file (Defaults to /etc/bpm-utils/source.default)" echo "bpm-setup -s <source template file> | Use a default template file (Defaults to /etc/bpm-utils/source.default)"
echo "bpm-setup -g <true/false> | Create git repository (Defaults to true)"
} }
if [ $# -eq 0 ]; then if [ $# -eq 0 ]; then
@@ -25,8 +26,9 @@ VERSION="1.0"
#LICENSE="Your project's license (Optional)" #LICENSE="Your project's license (Optional)"
TYPE="binary" TYPE="binary"
SOURCE_FILE="/etc/bpm-utils/source.default" SOURCE_FILE="/etc/bpm-utils/source.default"
GIT=true
while getopts "D:n:d:v:u:l:t:s:y" o; do while getopts "D:n:d:v:u:l:t:s:g:y" o; do
case "${o}" in case "${o}" in
D) D)
DIRECTORY="${OPTARG}" DIRECTORY="${OPTARG}"
@@ -55,6 +57,16 @@ while getopts "D:n:d:v:u:l:t:s:y" o; do
s) s)
SOURCE_FILE="$(realpath ${OPTARG})" SOURCE_FILE="$(realpath ${OPTARG})"
;; ;;
g)
if [[ "${OPTARG}" == true ]]; then
GIT=TRUE
elif [[ "${OPTARG}" == false ]]; then
GIT=false
else
echo "${OPTARG} is not a true or false value!"
exit 1
fi
;;
*) *)
usage usage
exit 1 exit 1
@@ -99,6 +111,9 @@ if [ -z "${CONFIRM}" ]; then
fi fi
echo "Package type: $TYPE" echo "Package type: $TYPE"
if [[ "$TYPE" == "source" ]]; then
echo "Create Git repository: $GIT"
fi
read -p "Create package directory? [y/N]: " CREATE read -p "Create package directory? [y/N]: " CREATE
case $CREATE in case $CREATE in
[Yy]* ) [Yy]* )
@@ -146,6 +161,10 @@ else
echo "Source file at ${SOURCE_FILE} does not exist! Creating empty source.sh instead..." echo "Source file at ${SOURCE_FILE} does not exist! Creating empty source.sh instead..."
touch source.sh touch source.sh
fi fi
if $GIT ; then
git init
echo -e "*.bpm\n.gitignore" > .gitignore
fi
echo "Package directory created successfully!" echo "Package directory created successfully!"
echo "Make sure to edit the pkg.info file with the appropriate information for your package" echo "Make sure to edit the pkg.info file with the appropriate information for your package"
echo "Add your compilation code in the source.sh file. Follow the instructions on the template file on how to properly create your compilation script" echo "Add your compilation code in the source.sh file. Follow the instructions on the template file on how to properly create your compilation script"
+72
View File
@@ -0,0 +1,72 @@
#!/bin/bash
containsElement () {
local e match="$1"
shift
for e; do [[ "$e" == "$match" ]] && return 0; done
return 1
}
SCRIPT_PATH=$(realpath "$0")
SCRIPT_DIR=$(dirname "$SCRIPT_PATH")
DEEP=false
PKGS=()
while getopts "d" flag; do
case "$flag" in
d) DEEP=true
shopt -s globstar;;
*) echo "Unknown flag ${flag}"
exit 2;;
esac
done
if [ -z "${@:$OPTIND:1}" ]; then
echo "You have not specified a repository"
exit 1
fi
if ! [ -d "${@:$OPTIND:1}" ]; then
echo "The given path is not a directory"
exit 1
fi
if realpath "${@:$OPTIND:1}" &> /dev/null; then
REPO=$(realpath "${@:$OPTIND:1}")
fi
shopt -s nullglob
if ! $DEEP; then
for arch in "$REPO"/*/; do
for pkg in "$arch"/*.bpm; do
info="info:"$'\n'
info+=$(tar -xf "$pkg" pkg.info -O | sed 's/^/ /g')
package=$(echo "$info" | grep 'name: ' | xargs | awk '{print $2}')
if containsElement "$package" "${PKGS[@]}"; then
echo "The following package was found in more than 1 package archives: ${package}"
exit 1
fi
PKGS+=("$package")
file="$(realpath -s --relative-to="$REPO" "$pkg")"
info+=$'\n'"download: ${file}"
info+=$'\n---'
echo "$info"
done
done
else
for arch in "$REPO"/*/; do
for pkg in "$arch"/**/*.bpm; do
info=$(tar -xf "$pkg" pkg.info -O)
package=$(echo "$info" | grep 'name: ' | awk '{print $2}')
if [[ ${PKGS[@]} =~ "$package" ]]; then
echo "The following package was found in more than 1 package archives: ${package}"
fi
PKGS+=("$package")
file="$(realpath -s --relative-to="$REPO" "$pkg")"
info+=$'\n'"file: ${file}"
info+=$'\n---'
echo "$info"
done
done
fi
+30 -22
View File
@@ -1,24 +1,32 @@
# This is the source.sh script. It is executed by BPM in a temporary directory when compiling a source package # This is the source.sh script. It is executed by BPM in a temporary directory when compiling a source package
# BPM expects there to be an 'output' directory under the root of the temporary directory after this script finishes executing, otherwise your program may not be correctly installed # BPM Expects the source code to be extracted into the automatically created 'source' directory which can be accessed using $BPM_SOURCE
# It is recommended you create the 'output' directory along with a 'source' directory in the root of the temporary directory like this # BPM Expects the output files to be present in the automatically created 'output' directory which can be accessed using $BPM_OUTPUT
echo "Compiling ${NAME}..."
# Creating SOURCE and OUTPUT variables DOWNLOAD="https://wwww.my-url.com/file.tar.gz"
SOURCE="$(pwd)"/source
OUTPUT="$(pwd)"/output
# Creating the 'source' and 'output' directories
mkdir "$SOURCE"
mkdir "$OUTPUT"
# Creating DOWNLOAD and FILENAME variables
DOWNLOAD="https://www.my-url.com/file.tar.gz"
FILENAME="${DOWNLOAD##*/}" FILENAME="${DOWNLOAD##*/}"
# Downloading files
wget "$DOWNLOAD" # The prepare function is executed in the root of the temp directory
# Extracting archive into 'source' # This function is used for downloading files and putting them into the correct location
tar -xvf "$FILENAME" --strip-components=1 -C "$SOURCE" prepare() {
# Changing directory into 'source' wget "$DOWNLOAD"
cd "$SOURCE" tar -xvf "$FILENAME" --strip-components=1 -C "$BPM_SOURCE"
# Configuring and compiling ${NAME} }
./configure --prefix=/usr
make # The build function is executed in the source directory
make install DESTDIR="$OUTPUT" # This function is used to compile the source code
echo "${NAME} compilation complete!" build() {
./configure --prefix=/usr
make
}
# The check function is executed in the source directory
# This function is used to run tests to verify the package has been compiled correctly
check() {
make check
}
# The package function is executed in the source directory
# This function is used to move the compiled files into the output directory
package() {
make DESTDIR="$BPM_OUTPUT" install
}