8 Commits
5 changed files with 125 additions and 53 deletions
+5 -3
View File
@@ -21,7 +21,7 @@ Creating a package for BPM with these utilities is simple
2) Run the following command (You can run the comamnd with no arguments to see available options) 2) Run the following command (You can run the comamnd with no arguments to see available options)
``` ```
bpm-setup -D my_bpm_package -t <binary/source> bpm-setup -D my_package -t <binary/source>
``` ```
3) This will create a directory named 'my_bpm_package' under the current directory with all the required files for the chosen package type 3) This will create a directory named 'my_bpm_package' under the current directory with all the required files for the chosen package type
4) You are able to edit the pkg.info descriptor file inside the newly created directory to your liking. Here's an example of what a descriptor file could look like 4) You are able to edit the pkg.info descriptor file inside the newly created directory to your liking. Here's an example of what a descriptor file could look like
@@ -29,12 +29,14 @@ bpm-setup -D my_bpm_package -t <binary/source>
name: my_package name: my_package
description: My package's description description: My package's description
version: 1.0 version: 1.0
revision: 2 (Optional)
architecture: x86_64 architecture: x86_64
url: https://www.my-website.com/ (Optional) url: https://www.my-website.com/ (Optional)
license: MyLicense (Optional) license: MyLicense (Optional)
type: <binary/source> type: <binary/source>
depends: dependency1,dependency2 (Optional) depends: ["dependency1","dependency2"] (Optional)
make_depends: make_depend1,make_depend2 (Optional) optional_depends: ["optional_depend1","optional_depend2"]
make_depends: ["make_depend1","make_depend2"] (Optional)
``` ```
### Binary Packages ### Binary Packages
3) If you are making a binary package, copy all your binaries along with the directories they reside in (i.e files/usr/bin/my_binary) 3) If you are making a binary package, copy all your binaries along with the directories they reside in (i.e files/usr/bin/my_binary)
+55 -3
View File
@@ -1,10 +1,17 @@
#!/bin/bash #!/bin/bash
while getopts "ksa:" o; do if [ -f .compilation-options ]; then
source ./.compilation-options
fi
echo "$ARCH"
while getopts "ksfa:" o; do
case "${o}" in case "${o}" in
a) ARCH="$OPTARG";; a) ARCH="$OPTARG";;
k) KEEP=true;; k) KEEP=true;;
s) SKIPCHECK=true;; s) SKIPCHECK=true;;
f) FORCE=true;;
*) exit 1;; *) exit 1;;
esac esac
done done
@@ -55,6 +62,44 @@ function ReadPkgInfo() {
} }
ReadPkgInfo ReadPkgInfo
if [ -z "$FORCE" ] && command -v bpm &> /dev/null && [ -n "$PKGINFO[depends]" ]; then
MISSING=()
for depend in $(echo "${PKGINFO[depends]}" | tr -d '[]' | tr ',' '\n' ); do
if ! bpm info "$depend" &> /dev/null; then
MISSING+=("$depend")
fi
done
if [ "${#MISSING[@]}" -ne 0 ]; then
echo "The following dependencies could not be resolved: ${MISSING[@]}"
EXIT=true
fi
elif ! command -v bpm &> /dev/null; then
echo "BPM not in PATH. Skipping dependency resolution"
elif [ -n "$FORCE" ]; then
echo "Force compilation enabled. Skipping dependency resolution"
fi
if [ -z "$FORCE" ] && command -v bpm &> /dev/null && [ -n "$PKGINFO[make_depends]" ]; then
MISSING=()
for depend in $(echo "${PKGINFO[make_depends]}" | tr -d '[]' | tr ',' '\n' ); do
if ! bpm info "$depend" &> /dev/null; then
MISSING+=("$depend")
fi
done
if [ "${#MISSING[@]}" -ne 0 ]; then
echo "The following make dependencies could not be resolved: ${MISSING[@]}"
EXIT=true
fi
elif ! command -v bpm &> /dev/null; then
echo "BPM not in PATH. Skipping make dependency resolution"
elif [ -n "$FORCE" ]; then
echo "Force compilation enabled. Skipping make dependency resolution"
fi
if [ -n "$EXIT" ]; then
exit 1
fi
# Creating temporary compilation directory structure # Creating temporary compilation directory structure
TEMPDIR="/var/tmp/bpm_source_${PKGINFO[name]}" TEMPDIR="/var/tmp/bpm_source_${PKGINFO[name]}"
if [ -d "$TEMPDIR" ] && [ -z "$KEEP" ]; then if [ -d "$TEMPDIR" ] && [ -z "$KEEP" ]; then
@@ -62,13 +107,18 @@ if [ -d "$TEMPDIR" ] && [ -z "$KEEP" ]; then
fi fi
mkdir -p "$TEMPDIR" mkdir -p "$TEMPDIR"
mkdir -p "$TEMPDIR"/source mkdir -p "$TEMPDIR"/source
[ -d "$TEMPDIR"/output ] && rm -rf "$TEMPDIR"/output
mkdir -p "$TEMPDIR"/output mkdir -p "$TEMPDIR"/output
tar -xf "$PACKAGE" -C "$TEMPDIR" source.sh tar -xf "$PACKAGE" -C "$TEMPDIR" source.sh
if tar -xf "$PACKAGE" -C "$TEMPDIR" source-files &> /dev/null; then if tar -xf "$PACKAGE" -C "$TEMPDIR" source-files &> /dev/null; then
mv "$TEMPDIR"/source-files/* "$TEMPDIR"/ mv "$TEMPDIR"/source-files/* "$TEMPDIR"/
rm -d "$TEMPDIR"/source-files rm -d "$TEMPDIR"/source-files
fi fi
PACKAGE_SCRIPTS=()
while read line; do
PACKAGE_SCRIPTS+=("$line")
done < <(tar -tf "$PACKAGE" | grep -v -E 'source.sh|pkg.info|source-files')
tar -xf "$PACKAGE" -C "$TEMPDIR" ${PACKAGE_SCRIPTS[@]} &> /dev/null
cd "$TEMPDIR" cd "$TEMPDIR"
# Declare and run Set Variables function # Declare and run Set Variables function
@@ -118,7 +168,9 @@ cd "$BPM_SOURCE"
RunPkgFunction build RunPkgFunction build
cd "$BPM_SOURCE" cd "$BPM_SOURCE"
if [ -z "$SKIPCHECK" ]; then
RunPkgFunction check RunPkgFunction check
fi
# Packaging all packages # Packaging all packages
for func in $(typeset -F | awk '{print $3}' | grep '^package'); do for func in $(typeset -F | awk '{print $3}' | grep '^package'); do
@@ -148,7 +200,7 @@ for func in $(typeset -F | awk '{print $3}' | grep '^package'); do
echo "${PKGINFO_FILE}" > pkg.info echo "${PKGINFO_FILE}" > pkg.info
sed -i "s/architecture:.*/architecture: ${ARCH}/g" pkg.info sed -i "s/architecture:.*/architecture: ${ARCH}/g" pkg.info
sed -i 's/type:.*/type: binary/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/' fakeroot -i "$TEMPDIR"/fakeroot_file_"$pkgname" tar -czpf "$pkgname".tar.gz pkg.info ${PACKAGE_SCRIPTS[@]} output --transform 's/output/files/'
mv "$pkgname".tar.gz "$DIR"/"$pkgname"-"$BPM_PKG_VERSION"-"$ARCH".bpm mv "$pkgname".tar.gz "$DIR"/"$pkgname"-"$BPM_PKG_VERSION"-"$ARCH".bpm
echo "Packaged ${pkgname} successfully!" echo "Packaged ${pkgname} successfully!"
rm "$TEMPDIR"/fakeroot_file_"$pkgname" rm "$TEMPDIR"/fakeroot_file_"$pkgname"
+26 -22
View File
@@ -1,23 +1,33 @@
#!/bin/bash #!/bin/bash
if [ $# -eq 0 ]
then if [ -f .compilation-options ]; then
echo "No output package name given!" source ./.compilation-options
exit 1
fi fi
while getopts "cska:" flag; do while getopts "cskfa:" flag; do
case "$flag" in case "$flag" in
c) CONVERT=true;; c) CONVERT=true;;
k) KEEP=true;; k) KEEP=true;;
s) SKIPCHECK=true;; s) SKIPCHECK=true;;
a) ARCHITECTURE="${OPTARG}";; f) FORCE=true;;
a) ARCH="${OPTARG}";;
*) exit 1;; *) exit 1;;
esac esac
done done
output="${@:$OPTIND:1}" if [ -f pkg.info ]; then
echo "pkg.info file found"
else
echo "pkg.info file not found in $PWD"
exit 1
fi
if [[ ! "$output" =~ ^[a-z.A-Z0-9_-]{1,}$ ]]; then output="${@:$OPTIND:1}"
if [ -z "$output" ]; then
pkgname=$(grep "^name: " pkg.info)
output=$(echo "$pkgname" | cut -d' ' -f2)"-src.bpm"
fi
if [ -z "$output" ] || [[ ! "$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!"
exit 1 exit 1
fi fi
@@ -51,6 +61,10 @@ else
echo "post_install.sh file found" echo "post_install.sh file found"
toCompress+=("post_install.sh") toCompress+=("post_install.sh")
fi fi
if [ -f pre_remove.sh ]; then
echo "pre_remove.sh file found"
toCompress+=("pre_remove.sh")
fi
if [ -f post_remove.sh ]; then if [ -f post_remove.sh ]; then
echo "post_remove.sh file found" echo "post_remove.sh file found"
toCompress+=("post_remove.sh") toCompress+=("post_remove.sh")
@@ -67,13 +81,6 @@ else
fi fi
fi fi
if [ -f pkg.info ]; then
echo "pkg.info file found"
else
echo "pkg.info file not found in $PWD"
exit 1
fi
for pkginfo in ./pkg.inf*; do for pkginfo in ./pkg.inf*; do
pkginfo=$(basename "$pkginfo") pkginfo=$(basename "$pkginfo")
echo "${pkginfo} file found" echo "${pkginfo} file found"
@@ -85,11 +92,8 @@ tar -c --owner=0 --group=0 --no-same-owner -zf "$output" "${toCompress[@]}"
if [ ! -z "$CONVERT" ] && "$CONVERT" && [[ "$type" == "source" ]]; then if [ ! -z "$CONVERT" ] && "$CONVERT" && [[ "$type" == "source" ]]; then
args=() args=()
if ! [ -z "$KEEP" ]; then [ -n "$KEEP" ] && args+=("-k")
args+=("-a" "$ARCHITECTURE") [ -n "$SKIPCHECK" ] && args+=("-s")
fi [ -n "$FORCE" ] && args+=("-f")
if ! [ -z "$SKIPCHECK" ]; then bpm-convert "${args[@]}" -a "$ARCH" "$output"
args+=("-s")
fi
bpm-convert "${args[@]}" -a "$ARCHITECTURE" "$output"
fi fi
+4 -1
View File
@@ -19,7 +19,6 @@ if [ $# -eq 0 ]; then
exit exit
fi fi
NAME="package-name"
DESCRIPTION="Default package description" DESCRIPTION="Default package description"
VERSION="1.0" VERSION="1.0"
#URL="https://my.project.url/ (Optional)" #URL="https://my.project.url/ (Optional)"
@@ -79,6 +78,10 @@ if [ -z "${DIRECTORY}" ]; then
exit 1 exit 1
fi fi
if [ -z "${NAME}" ]; then
NAME="${DIRECTORY}"
fi
if [[ ! "${DIRECTORY}" == "/"* ]]; then if [[ ! "${DIRECTORY}" == "/"* ]]; then
DIRECTORY="${PWD}/${DIRECTORY}" DIRECTORY="${PWD}/${DIRECTORY}"
fi fi
+28 -17
View File
@@ -1,5 +1,12 @@
#!/bin/bash #!/bin/bash
containsElement () {
local e match="$1"
shift
for e; do [[ "$e" == "$match" ]] && return 0; done
return 1
}
SCRIPT_PATH=$(realpath "$0") SCRIPT_PATH=$(realpath "$0")
SCRIPT_DIR=$(dirname "$SCRIPT_PATH") SCRIPT_DIR=$(dirname "$SCRIPT_PATH")
@@ -30,34 +37,38 @@ fi
shopt -s nullglob shopt -s nullglob
if ! $DEEP; then create_entry() {
for arch in "$REPO"/*/; do if [ $# -eq 0 ]; then
for pkg in "$arch"/*.bpm; do return 0
info=$(tar -xf "$pkg" pkg.info -O) fi
package=$(echo "$info" | grep 'name: ' | awk '{print $2}') if ! [ -f "$1" ]; then
if [[ ${PKGS[@]} =~ "$package" ]]; then return 0
fi
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}" echo "The following package was found in more than 1 package archives: ${package}"
exit 1
fi fi
PKGS+=("$package") PKGS+=("$package")
file="$(realpath -s --relative-to="$REPO" "$pkg")" file="$(realpath -s --relative-to="$REPO" "$pkg")"
info+=$'\n'"file: ${file}" info+=$'\n'"download: ${file}"
info+=$'\n---' info+=$'\n---'
echo "$info" echo "$info"
}
if ! $DEEP; then
for arch in "$REPO"/*/; do
for pkg in "$arch"/*.bpm; do
create_entry "$pkg"
done done
done done
else else
for arch in "$REPO"/*/; do for arch in "$REPO"/*/; do
for pkg in "$arch"/**/*.bpm; do for pkg in "$arch"/**/*.bpm; do
info=$(tar -xf "$pkg" pkg.info -O) create_entry "$pkg"
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
done done
fi fi