diff --git a/sdk/common.mk b/sdk/common.mk index 98ed894..71b32ad 100644 --- a/sdk/common.mk +++ b/sdk/common.mk @@ -29,7 +29,7 @@ endif Z88DK := $(ZXSDK)/src/z88dk ZCCCFG := $(Z88DK)/lib/config -PATH := $(ZXSDK_PLATFORM)/bin:$(Z88DK)/bin:$(PATH) +PATH := $(ZXSDK_PLATFORM)/bin:$(Z88DK)/bin:$(ZXSDK):$(PATH) ifeq ($(OS),Windows_NT) PATH := $(ZXSDK_PLATFORM)/lib:$(PATH) diff --git a/sdk/extract.sh b/sdk/extract.sh new file mode 100755 index 0000000..47509e3 --- /dev/null +++ b/sdk/extract.sh @@ -0,0 +1,302 @@ +#!/bin/bash -e +# extract.sh - extract contents of an archive. +# +# SPDX-FileCopyrightText: 2021 Ivan Tatarinov +# +# SPDX-License-Identifier: GPL-3.0-or-later + +declare -a errors +declare -A tmp_files +declare o_input +declare o_check=0 +declare o_sha256 +declare o_type +declare o_subdir=. +declare o_output +declare o_use_tmp=0 + +msg_err_begin() { + echo -en '\E[1;31m' +} + +msg_err_end() { + echo -en '\E[0m' +} + +# $1 = message +add_error() { + errors[${#errors[@]}]="$1" +} + +# $1 = argument name, $2 = argument index +add_missing_arg_error() { + add_error "Missing parameter for '$1' (argument #$2)." +} + +exit_on_errors() { + local -i i + local -i N + N=${#errors[@]} + if [[ $N -ne 0 ]]; then + msg_err_begin >&2 + i=0 + while [[ $i -lt $N ]]; do + echo "$BASH_SOURCE: Error ($((i+1))): ${errors[$i]}" >&2 + let i=i+1 + done + echo -n "$BASH_SOURCE: " >&2 + if [[ $N -eq 1 ]]; then + echo -n "$N error occured." >&2 + else + echo -n "$N errors occured." >&2 + fi + echo " Stopped." >&2 + msg_err_end >&2 + exit 1 + fi +} + +# $1 = message (optional) +error_exit() { + if [[ -n "$1" ]]; then + msg_err_begin >&2 + echo "$1" >&2 + msg_err_end >&2 + fi + exit 1 +} + +# $1 = temporary file name +new_tmp_file() { + tmp_files[$1]=f +} + +# $1 = temporary directory name +new_tmp_dir() { + tmp_files[$tmp]=d +} + +# $1 = temporary file or directory name +free_tmp() { + unset tmp_files[$1] +} + +# $1 = temporary file name +rm_tmp_file() { + rm -f "$1" + free_tmp "$1" +} + +# $1 = temporary directory name +rm_tmp_dir() { + rm -rf "$1" + free_tmp "$1" +} + +rm_all_tmps() { + local t + if [[ ${#tmp_files[*]} -gt 0 ]]; then + OFS="$IFS" + IFS=`echo -en "\t"` + for t in ${!tmp_files[*]}; do + case ${tmp_files[$t]} in + f) + rm_tmp_file "$t" + ;; + d) + rm_tmp_dir "$t" + ;; + esac + done + IFS="$OFS" + fi +} + +show_usage() { + cat <&2 + echo "$BASH_SOURCE: Error on line $BASH_LINENO: Exit status $err. Stopped." >&2 + msg_err_end >&2 + exit $err +} + +OnExit() { + rm_all_tmps +} + +trap OnError ERR +trap OnExit EXIT + +if [[ $# -eq 0 ]]; then + show_usage + exit +fi + +parse_option=1 +i=1 +while [[ $# -gt 0 ]]; do + non_option=0 + if [[ $parse_option -eq 1 ]]; then + case "$1" in + --sha256) + if [[ $# -eq 1 ]]; then + add_missing_arg_error $1 $i + break + fi + o_check=1 + o_sha256=$2 + shift 2 + let i=i+1 + ;; + --type) + if [[ $# -eq 1 ]]; then + add_missing_arg_error $1 $i + break + fi + case "$2" in + .zip|.tar.gz|.tar.bz2|.7z) + o_type=$2 + ;; + *) + add_error "Unknown archive type specified: '$2' (argument #$((i+1)))." + ;; + esac + shift 2 + let i=i+1 + ;; + --subdir) + if [[ $# -eq 1 ]]; then + add_missing_arg_error $1 $i + break + fi + o_subdir=$2 + shift 2 + let i=i+1 + ;; + --output) + if [[ $# -eq 1 ]]; then + add_missing_arg_error $1 $i + break + fi + o_output=$2 + shift 2 + let i=i+1 + ;; + --use-tmp-dir) + o_use_tmp=1 + shift 1 + ;; + --) + parse_option=0 + shift 1 + ;; + -*) + add_error "Unknown option '$1' (argument #$i)." + shift 1 + ;; + *) + non_option=1 + ;; + esac + else + non_option=1 + fi + if [[ $non_option -eq 1 ]]; then + if [[ -z "$o_input" ]]; then + o_input="$1" + else + add_error "Extra input file specified: '$1' (argument #$i)." + fi + shift 1 + fi + let i=i+1 +done + +if [[ -z "$o_input" ]]; then + add_error "No input file specified." +fi + +if [[ -z "$o_type" ]]; then + add_error "No input file type specified." +fi + +if [[ -z "$o_output" ]]; then + add_error "No output directory specified." +fi + +#~ echo "$BASH_SOURCE: o_input: \"$o_input\"" +#~ echo "$BASH_SOURCE: o_check: $o_check" +#~ echo "$BASH_SOURCE: o_sha256: \"$o_sha256\"" +#~ echo "$BASH_SOURCE: o_type: \"$o_type\"" +#~ echo "$BASH_SOURCE: o_subdir: \"$o_subdir\"" +#~ echo "$BASH_SOURCE: o_output: \"$o_output\"" +#~ echo "$BASH_SOURCE: o_use_tmp: $o_use_tmp" + +exit_on_errors + +tmp=`mktemp` +new_tmp_file "$tmp" +echo "$o_sha256 $o_input" >"$tmp" +sha256sum -c "$tmp" +rm_tmp_file "$tmp" + +if [[ $o_use_tmp -eq 0 ]]; then + if [[ "$o_subdir" != "$o_output" && "$o_subdir" != '.' ]]; then + rm -rf "$o_subdir" + fi + case "$o_type" in + .zip) + if [[ "$o_subdir" = '.' ]]; then + unzip -nq -d "$o_output" "$o_input" + else + unzip -nq "$o_input" + fi + ;; + .tar.gz) + if [[ "$o_subdir" = '.' ]]; then + add_error "Not implemented for '$o_type': subdir='$o_subdir'." + exit_on_errors + else + tar -xzf "$o_input" + fi + ;; + .tar.bz2) + if [[ "$o_subdir" = '.' ]]; then + add_error "Not implemented for '$o_type': subdir='$o_subdir'." + exit_on_errors + else + tar -xjf "$o_input" + fi + ;; + .7z) + if [[ "$o_subdir" = '.' ]]; then + 7z x -bd -o "$o_output" "$o_input" + else + 7z x -bd "$o_input" + fi + ;; + *) + add_error "Not supported archive type: '$o_type'." + exit_on_errors + ;; + esac + if [[ "$o_subdir" != "$o_output" && "$o_subdir" != '.' ]]; then + mv "$o_subdir" "$o_output" + fi +else + add_error "Temporary directory usage is not implemented yet." + exit_on_errors +fi diff --git a/sdk/setenv.sh b/sdk/setenv.sh index 6352b70..8a2cc9e 100644 --- a/sdk/setenv.sh +++ b/sdk/setenv.sh @@ -12,7 +12,7 @@ if [[ "x$ZXSDK" == x ]]; then fi Z88DK=$ZXSDK/src/z88dk ZCCCFG=$Z88DK/lib/config - PATH=$ZXSDK_PLATFORM/bin:$Z88DK/bin:$PATH + PATH=$ZXSDK_PLATFORM/bin:$Z88DK/bin:$ZXSDK:$PATH if [[ x$OS == xWindows_NT ]]; then PATH=$ZXSDK_PLATFORM/lib:$PATH # Fix paths under Cygwin for z88dk on Windows diff --git a/sdk/src/sjasmplus-z00m128.inc.mk b/sdk/src/sjasmplus-z00m128.inc.mk index e00fca0..6ad1375 100644 --- a/sdk/src/sjasmplus-z00m128.inc.mk +++ b/sdk/src/sjasmplus-z00m128.inc.mk @@ -22,21 +22,12 @@ build-sjasmplus: | sjasmplus-z00m128/.extracted sjasmplus-z00m128.mk $(MAKE) -w -C sjasmplus -f ../sjasmplus-z00m128.mk prefix=$(shell realpath --relative-to=sjasmplus-z00m128 $(prefix)) sjasmplus-z00m128/.extracted: $(SJASMPLUS_ARCHIVE) - echo '$(SJASMPLUS_ARCHIVE_SHA256) $<' >$<.sha256 - sha256sum -c $<.sha256 - rm -f $<.sha256 rm -rf $(@D) - test '$(@D)' = '$(SJASMPLUS_ARCHIVE_SUBDIR)' -o '$(SJASMPLUS_ARCHIVE_SUBDIR)' = . || rm -rf $(SJASMPLUS_ARCHIVE_SUBDIR) -ifeq ($(SJASMPLUS_ARCHIVE_TYPE),.tar.gz) - ifeq ($(SJASMPLUS_ARCHIVE_SUBDIR),.) - $(error Not implemented) - else - tar -xzf $< - endif -else - $(error Not implemented) -endif - test '$(@D)' = '$(SJASMPLUS_ARCHIVE_SUBDIR)' -o '$(SJASMPLUS_ARCHIVE_SUBDIR)' = . || mv $(SJASMPLUS_ARCHIVE_SUBDIR) $(@D) + extract.sh $<\ + --sha256 $(SJASMPLUS_ARCHIVE_SHA256)\ + --type $(SJASMPLUS_ARCHIVE_TYPE)\ + --subdir $(SJASMPLUS_ARCHIVE_SUBDIR)\ + --output $(@D) touch $@ .downloads/sjasmplus-z00m128/v1.18.2.tar.gz: | .downloads/sjasmplus-z00m128 @@ -83,21 +74,12 @@ SJASMPLUS_ARCHIVE_TYPE = .zip SJASMPLUS_ARCHIVE_SUBDIR = sjasmplus-1.18.2.win sjasmplus-z00m128/.extracted: $(SJASMPLUS_ARCHIVE) - echo '$(SJASMPLUS_ARCHIVE_SHA256) $<' >$<.sha256 - sha256sum -c $<.sha256 - rm -f $<.sha256 rm -rf $(@D) - test '$(@D)' = '$(SJASMPLUS_ARCHIVE_SUBDIR)' -o '$(SJASMPLUS_ARCHIVE_SUBDIR)' = . || rm -rf $(SJASMPLUS_ARCHIVE_SUBDIR) -ifeq ($(SJASMPLUS_ARCHIVE_TYPE),.zip) - ifeq ($(SJASMPLUS_ARCHIVE_SUBDIR),.) - unzip -nq -d $(@D) $< - else - unzip -nq $< - endif -else - $(error Not implemented) -endif - test '$(@D)' = '$(SJASMPLUS_ARCHIVE_SUBDIR)' -o '$(SJASMPLUS_ARCHIVE_SUBDIR)' = . || mv $(SJASMPLUS_ARCHIVE_SUBDIR) $(@D) + extract.sh $<\ + --sha256 $(SJASMPLUS_ARCHIVE_SHA256)\ + --type $(SJASMPLUS_ARCHIVE_TYPE)\ + --subdir $(SJASMPLUS_ARCHIVE_SUBDIR)\ + --output $(@D) touch $@ .downloads/sjasmplus-z00m128/sjasmplus-1.18.2.win.zip: | .downloads/sjasmplus-z00m128 diff --git a/sdk/src/sjasmplus.inc.mk b/sdk/src/sjasmplus.inc.mk index 3096f26..2a0efb5 100644 --- a/sdk/src/sjasmplus.inc.mk +++ b/sdk/src/sjasmplus.inc.mk @@ -22,21 +22,12 @@ build-sjasmplus: | sjasmplus/.extracted sjasmplus.mk $(MAKE) -w -C sjasmplus -f ../sjasmplus.mk prefix=$(shell realpath --relative-to=sjasmplus $(prefix)) sjasmplus/.extracted: $(SJASMPLUS_ARCHIVE) - echo '$(SJASMPLUS_SHA256) $<' >$<.sha256 - sha256sum -c $<.sha256 - rm -f $<.sha256 rm -rf $(@D) - test '$(@D)' = '$(SJASMPLUS_ARCHIVE_SUBDIR)' -o '$(SJASMPLUS_ARCHIVE_SUBDIR)' = . || rm -rf $(SJASMPLUS_ARCHIVE_SUBDIR) -ifeq ($(SJASMPLUS_ARCHIVE_TYPE),.tar.gz) - ifeq ($(SJASMPLUS_ARCHIVE_SUBDIR),.) - $(error Not implemented) - else - tar -xzf $< - endif -else - $(error Not implemented) -endif - test '$(@D)' = '$(SJASMPLUS_ARCHIVE_SUBDIR)' -o '$(SJASMPLUS_ARCHIVE_SUBDIR)' = . || mv $(SJASMPLUS_ARCHIVE_SUBDIR) $(@D) + extract.sh $<\ + --sha256 $(SJASMPLUS_ARCHIVE_SHA256)\ + --type $(SJASMPLUS_ARCHIVE_TYPE)\ + --subdir $(SJASMPLUS_ARCHIVE_SUBDIR)\ + --output $(@D) touch $@ .downloads/sjasmplus/20190306.1.tar.gz: | .downloads/sjasmplus @@ -94,21 +85,12 @@ else endif sjasmplus/.extracted: $(SJASMPLUS_ARCHIVE) - echo '$(SJASMPLUS_ARCHIVE_SHA256) $<' >$<.sha256 - sha256sum -c $<.sha256 - rm -f $<.sha256 rm -rf $(@D) - test '$(@D)' = '$(SJASMPLUS_ARCHIVE_SUBDIR)' -o '$(SJASMPLUS_ARCHIVE_SUBDIR)' = . || rm -rf $(SJASMPLUS_ARCHIVE_SUBDIR) -ifeq ($(SJASMPLUS_ARCHIVE_TYPE),.7z) - ifeq ($(SJASMPLUS_ARCHIVE_SUBDIR),.) - 7z x -bd -o$(@D) $< - else - 7z x -bd $< - endif -else - $(error Not implemented) -endif - test '$(@D)' = '$(SJASMPLUS_ARCHIVE_SUBDIR)' -o '$(SJASMPLUS_ARCHIVE_SUBDIR)' = . || mv $(SJASMPLUS_ARCHIVE_SUBDIR) $(@D) + extract.sh $<\ + --sha256 $(SJASMPLUS_ARCHIVE_SHA256)\ + --type $(SJASMPLUS_ARCHIVE_TYPE)\ + --subdir $(SJASMPLUS_ARCHIVE_SUBDIR)\ + --output $(@D) touch $@ .downloads/sjasmplus/sjasmplus-win32-20190306.1.7z: | .downloads/sjasmplus diff --git a/sdk/src/z88dk.inc.mk b/sdk/src/z88dk.inc.mk index ad50b3b..9b769ca 100644 --- a/sdk/src/z88dk.inc.mk +++ b/sdk/src/z88dk.inc.mk @@ -53,21 +53,12 @@ z88dk/.done: | z88dk/.extracted z88dk.mk touch $@ z88dk/.extracted: $(Z88DK_ARCHIVE) | z88dk.patch - echo '$(Z88DK_ARCHIVE_SHA256) $<' >$<.sha256 - sha256sum -c $<.sha256 - rm -f $<.sha256 rm -rf $(@D) - test '$(@D)' = '$(Z88DK_ARCHIVE_SUBDIR)' -o '$(Z88DK_ARCHIVE_SUBDIR)' = . || rm -rf $(Z88DK_ARCHIVE_SUBDIR) -ifeq ($(Z88DK_ARCHIVE_TYPE),.tar.gz) - ifeq ($(Z88DK_ARCHIVE_SUBDIR),.) - $(error Not implemented) - else - tar -xzf $< - endif -else - $(error Not implemented) -endif - test '$(@D)' = '$(Z88DK_ARCHIVE_SUBDIR)' -o '$(Z88DK_ARCHIVE_SUBDIR)' = . || mv $(Z88DK_ARCHIVE_SUBDIR) $(@D) + extract.sh $<\ + --sha256 $(Z88DK_ARCHIVE_SHA256)\ + --type $(Z88DK_ARCHIVE_TYPE)\ + --subdir $(Z88DK_ARCHIVE_SUBDIR)\ + --output $(@D) patch -N -p0 -s <$| || true touch $@ @@ -106,21 +97,12 @@ Z88DK_ARCHIVE_TYPE = .zip Z88DK_ARCHIVE_SUBDIR = z88dk z88dk/.done: $(Z88DK_ARCHIVE) - echo '$(Z88DK_ARCHIVE_SHA256) $<' >$<.sha256 - sha256sum -c $<.sha256 - rm -f $<.sha256 rm -rf $(@D) - test '$(@D)' = '$(Z88DK_ARCHIVE_SUBDIR)' -o '$(Z88DK_ARCHIVE_SUBDIR)' = . || rm -rf $(Z88DK_ARCHIVE_SUBDIR) -ifeq ($(Z88DK_ARCHIVE_TYPE),.zip) - ifeq ($(Z88DK_ARCHIVE_SUBDIR),.) - unzip -nq -d $(@D) $< - else - unzip -nq $< - endif -else - $(error Not implemented) -endif - test '$(@D)' = '$(Z88DK_ARCHIVE_SUBDIR)' -o '$(Z88DK_ARCHIVE_SUBDIR)' = . || mv $(Z88DK_ARCHIVE_SUBDIR) $(@D) + extract.sh $<\ + --sha256 $(Z88DK_ARCHIVE_SHA256)\ + --type $(Z88DK_ARCHIVE_TYPE)\ + --subdir $(Z88DK_ARCHIVE_SUBDIR)\ + --output $(@D) touch $@ .downloads/z88dk/z88dk-win32-2.1.zip: | .downloads/z88dk