2024-03-19 13:50:13 +01:00
#export GOPATH=$(shell pwd)/GO
#export GOBIN=$(GOPATH)/bin
#export PATH=$(GOBIN):$(shell echo $${PATH})
2024-02-27 07:22:57 +01:00
2025-03-12 12:55:41 +01:00
GOFLAGS =
2022-02-24 07:26:55 +01:00
GOCMD = go
2025-03-12 12:55:41 +01:00
GOBUILD = $( GOCMD) build $( GOFLAGS)
2024-06-01 17:26:16 +02:00
GOGENERATE = $( GOCMD) generate
2022-02-24 07:26:55 +01:00
GOCLEAN = $( GOCMD) clean
GOTEST = $( GOCMD) test
GOGET = $( GOCMD) get
2022-01-14 15:21:00 +01:00
2022-02-24 07:26:55 +01:00
BUILD_DIR = build
2023-02-02 13:11:04 +01:00
OBITOOLS_PREFIX :=
2022-01-14 15:21:00 +01:00
2022-02-24 07:26:55 +01:00
PACKAGES_SRC := $( wildcard pkg/*/*.go pkg/*/*/*.go)
PACKAGE_DIRS := $( sort $( patsubst %/,%,$( dir $( PACKAGES_SRC) ) ) )
PACKAGES := $( notdir $( PACKAGE_DIRS) )
2022-01-14 15:21:00 +01:00
2025-03-08 18:56:02 +01:00
GITHOOK_SRC_DIR = git-hooks
GITHOOKS_SRC := $( wildcard $( GITHOOK_SRC_DIR) /*)
GITHOOK_DIR = .git/hooks
GITHOOKS := $( patsubst $( GITHOOK_SRC_DIR) /%,$( GITHOOK_DIR) /%,$( GITHOOKS_SRC) )
2022-02-24 07:26:55 +01:00
OBITOOLS_SRC := $( wildcard cmd/obitools/*/*.go)
OBITOOLS_DIRS := $( sort $( patsubst %/,%,$( dir $( OBITOOLS_SRC) ) ) )
OBITOOLS := $( notdir $( OBITOOLS_DIRS) )
2022-01-14 15:21:00 +01:00
2022-02-24 07:26:55 +01:00
d e f i n e M A K E _ P K G _ R U L E
2024-06-01 17:26:16 +02:00
pkg-$(notdir $(1)) : $( 1) pkg /obioptions /version .go
2022-02-24 07:26:55 +01:00
@echo -n - Building package $( notdir $( 1) ) ...
@$( GOBUILD) ./$( 1) \
2> pkg-$( notdir $( 1) ) .log \
|| cat pkg-$( notdir $( 1) ) .log
@rm -f pkg-$( notdir $( 1) ) .log
@echo Done.
e n d e f
2022-01-14 15:21:00 +01:00
2022-02-24 07:26:55 +01:00
d e f i n e M A K E _ O B I T O O L S _ R U L E
2024-06-01 17:26:16 +02:00
$(OBITOOLS_PREFIX)$(notdir $(1)) : $( BUILD_DIR ) $( 1) pkg /obioptions /version .go
2022-02-24 07:26:55 +01:00
@echo -n - Building obitool $( notdir $( 1) ) ...
@$( GOBUILD) -o $( BUILD_DIR) /$( OBITOOLS_PREFIX) $( notdir $( 1) ) ./$( 1) \
2> $( OBITOOLS_PREFIX) $( notdir $( 1) ) .log \
|| cat $( OBITOOLS_PREFIX) $( notdir $( 1) ) .log
@rm -f $( OBITOOLS_PREFIX) $( notdir $( 1) ) .log
@echo Done.
e n d e f
2022-01-14 15:21:00 +01:00
2024-06-01 17:26:16 +02:00
GIT = $( shell which git 2>& 1 >/dev/null && which git)
GITDIR = $( shell ls -d .git 2>/dev/null && echo .git || echo )
i f n e q ( $( strip $ ( GIT ) ) , )
i f n e q ( $( strip $ ( GITDIR ) ) , )
COMMIT_ID := $( shell $( GIT) log -1 HEAD --format= %h)
LAST_TAG := $( shell $( GIT) describe --tags $$ ( $( GIT) rev-list --tags --max-count= 1) | \
tr '_' ' ' )
e n d i f
e n d i f
OUTPUT := $( shell mktemp)
2022-01-14 15:21:00 +01:00
2025-03-08 18:56:02 +01:00
all : install -githook obitools
2022-01-14 15:21:00 +01:00
2026-02-05 17:38:47 +01:00
obitools : $( patsubst %,$ ( OBITOOLS_PREFIX ) %,$ ( OBITOOLS ) )
2022-01-14 15:21:00 +01:00
2025-03-08 18:56:02 +01:00
install-githook : $( GITHOOKS )
2026-02-05 17:38:47 +01:00
2025-03-08 18:56:02 +01:00
$(GITHOOK_DIR)/% : $( GITHOOK_SRC_DIR ) /%
@echo installing $$ ( basename $@ ) ...
@mkdir -p $( GITHOOK_DIR)
@cp $< $@
@chmod +x $@
2023-03-21 22:02:18 +07:00
update-deps :
go get -u ./...
2025-03-08 18:56:02 +01:00
test : .FORCE
2023-08-27 17:22:51 +02:00
$( GOTEST) ./...
2025-02-19 13:17:36 +01:00
2026-02-05 17:38:47 +01:00
obitests :
2025-02-19 15:55:07 +01:00
@for t in $$ ( find obitests -name test.sh -print) ; do \
2025-03-08 16:54:24 +01:00
bash $$ { t} || exit 1; \
2026-02-05 17:38:47 +01:00
done
2025-02-19 14:37:05 +01:00
githubtests : obitools obitests
2022-05-27 11:53:29 +03:00
2022-02-24 07:26:55 +01:00
$(BUILD_DIR) :
mkdir -p $@
2022-01-14 15:21:00 +01:00
2022-02-24 07:26:55 +01:00
$( foreach P ,$ ( PACKAGE_DIRS ) ,$ ( eval $ ( call MAKE_PKG_RULE ,$ ( P ) ) ) )
2022-01-14 15:21:00 +01:00
2022-02-24 07:26:55 +01:00
$( foreach P ,$ ( OBITOOLS_DIRS ) ,$ ( eval $ ( call MAKE_OBITOOLS_RULE ,$ ( P ) ) ) )
2022-01-14 15:21:00 +01:00
2026-02-05 17:38:47 +01:00
pkg/obioptions/version.go : version .txt .FORCE
@version= $$ ( cat version.txt) ; \
cat $@ \
| sed -E 's/^var _Version = "[^"]*"/var _Version = "Release ' $$ version'"/' \
2024-06-01 17:26:16 +02:00
> $( OUTPUT)
@diff $@ $( OUTPUT) 2>& 1 > /dev/null \
2026-02-05 17:38:47 +01:00
|| ( echo " Update version.go to $$ (cat version.txt) " && mv $( OUTPUT) $@ )
2024-06-01 17:26:16 +02:00
@rm -f $( OUTPUT)
2026-02-05 17:38:47 +01:00
bump-version :
@echo "Incrementing version..."
@current= $$ ( cat version.txt) ; \
echo " Current version: $$ current " ; \
major = $$ ( echo $$ current | cut -d. -f1) ; \
minor = $$ ( echo $$ current | cut -d. -f2) ; \
patch = $$ ( echo $$ current | cut -d. -f3) ; \
new_patch = $$ ( ( patch + 1) ) ; \
new_version = " $$ major. $$ minor. $$ new_patch " ; \
echo " New version: $$ new_version " ; \
echo " $$ new_version " > version.txt
@echo "✓ Version updated in version.txt"
@$( MAKE) pkg/obioptions/version.go
2024-06-01 17:26:16 +02:00
2026-01-25 18:43:30 +01:00
jjnew :
@echo " $( YELLOW) → Creating a new commit... $( NC) "
@echo " $( BLUE) → Documenting current commit... $( NC) "
@jj auto-describe
@echo " $( BLUE) → Done. $( NC) "
@jj new
@echo " $( GREEN) ✓ New commit created $( NC) "
2026-02-05 17:38:47 +01:00
jjpush :
2026-02-20 11:52:34 +01:00
@$( MAKE) jjpush-describe
@$( MAKE) jjpush-bump
@$( MAKE) jjpush-push
@$( MAKE) jjpush-tag
@echo " $( GREEN) ✓ Release complete $( NC) "
jjpush-describe :
2026-01-25 18:43:30 +01:00
@echo " $( BLUE) → Documenting current commit... $( NC) "
@jj auto-describe
2026-02-20 11:52:34 +01:00
jjpush-bump :
2026-02-05 17:38:47 +01:00
@echo " $( BLUE) → Creating new commit for version bump... $( NC) "
@jj new
2026-02-20 11:52:34 +01:00
@$( MAKE) bump-version
@echo " $( BLUE) → Documenting version bump commit... $( NC) "
@jj auto-describe
jjpush-push :
@echo " $( BLUE) → Pushing commits... $( NC) "
@jj git push --change @
jjpush-tag :
@version= $$ ( cat version.txt) ; \
2026-02-05 17:53:43 +01:00
tag_name = " Release_ $$ version " ; \
2026-02-20 11:52:34 +01:00
echo " $( BLUE) → Generating release notes for $$ tag_name... $( NC) " ; \
release_message = " Release $$ version " ; \
2026-02-09 09:05:47 +01:00
if command -v orla >/dev/null 2>& 1 && command -v jq >/dev/null 2>& 1; then \
2026-02-20 11:52:34 +01:00
previous_tag = $$ ( git describe --tags --abbrev= 0 --match 'Release_*' HEAD^ 2>/dev/null) ; \
if [ -z " $$ previous_tag " ] ; then \
echo " $( YELLOW) ⚠ No previous Release tag found, skipping release notes $( NC) " ; \
2026-02-09 09:05:47 +01:00
else \
2026-02-20 11:52:34 +01:00
raw_output = $$ ( git log --format= "%h %B" " $$ previous_tag..HEAD " | \
ORLA_MAX_TOOL_CALLS = 50 orla agent -m ollama:qwen3-coder-next:latest \
" Summarize the following commits into a GitHub release note for version $$ version. Ignore commits related to version bumps, .gitignore changes, or any internal housekeeping that is irrelevant to end users. Describe each user-facing change precisely without exposing code. Eliminate redundancy. Output strictly valid JSON with no surrounding text, using this exact schema: {\"title\": \"<short release title>\", \"body\": \"<detailed markdown release notes>\"} " 2>/dev/null) || true; \
if [ -n " $$ raw_output " ] ; then \
sanitized = $$ ( echo " $$ raw_output " | sed -n '/^{/,/^}/p' | tr -d '\000-\011\013-\014\016-\037' ) ; \
release_title = $$ ( echo " $$ sanitized " | jq -r '.title // empty' 2>/dev/null) ; \
release_body = $$ ( echo " $$ sanitized " | jq -r '.body // empty' 2>/dev/null) ; \
if [ -n " $$ release_title " ] && [ -n " $$ release_body " ] ; then \
release_message = " $$ release_title " $$ '\n\n' " $$ release_body " ; \
else \
echo " $( YELLOW) ⚠ JSON parsing failed, using default release message $( NC) " ; \
fi ; \
fi ; \
2026-02-09 09:05:47 +01:00
fi ; \
2026-02-07 11:48:18 +01:00
fi ; \
2026-02-20 11:52:34 +01:00
install_section = $$ '\n## Installation\n\n### Pre-built binaries\n\nDownload the appropriate archive for your system from the\n[release assets](https://github.com/metabarcoding/obitools4/releases/tag/Release_' " $$ version " ')\nand extract it:\n\n#### Linux (AMD64)\n```bash\ntar -xzf obitools4_' " $$ version " '_linux_amd64.tar.gz\n```\n\n#### Linux (ARM64)\n```bash\ntar -xzf obitools4_' " $$ version " '_linux_arm64.tar.gz\n```\n\n#### macOS (Intel)\n```bash\ntar -xzf obitools4_' " $$ version " '_darwin_amd64.tar.gz\n```\n\n#### macOS (Apple Silicon)\n```bash\ntar -xzf obitools4_' " $$ version " '_darwin_arm64.tar.gz\n```\n\nAll OBITools4 binaries are included in each archive.\n\n### From source\n\nYou can also compile and install OBITools4 directly from source using the\ninstallation script:\n\n```bash\ncurl -L https://raw.githubusercontent.com/metabarcoding/obitools4/master/install_obitools.sh | bash -s -- --version ' " $$ version " '\n```\n\nBy default binaries are installed in `/usr/local/bin`. Use `--install-dir` to\nchange the destination and `--obitools-prefix` to add a prefix to command names:\n\n```bash\ncurl -L https://raw.githubusercontent.com/metabarcoding/obitools4/master/install_obitools.sh | \\\n bash -s -- --version ' " $$ version " ' --install-dir ~/local --obitools-prefix k\n```\n' ; \
release_message = " $$ release_message $$ install_section " ; \
echo " $( BLUE) → Creating tag $$ tag_name... $( NC) " ; \
git tag -a " $$ tag_name " -m " $$ release_message " 2>/dev/null || echo " $( YELLOW) ⚠ Tag $$ tag_name already exists $( NC) " ; \
echo " $( BLUE) → Pushing tag $$ tag_name... $( NC) " ; \
git push origin " $$ tag_name " 2>/dev/null || echo " $( YELLOW) ⚠ Tag push failed or already pushed $( NC) "
2026-01-25 18:43:30 +01:00
jjfetch :
@echo " $( YELLOW) → Pulling latest commits... $( NC) "
@jj git fetch
@jj new master@origin
@echo " $( GREEN) ✓ Latest commits pulled $( NC) "
2026-02-20 11:52:34 +01:00
.PHONY : all obitools update -deps obitests githubtests jjnew jjpush jjpush -describe jjpush -bump jjpush -push jjpush -tag jjfetch bump -version .FORCE
2026-02-05 17:38:47 +01:00
.FORCE :