11SHELL := /bin/bash -e -o pipefail
2+ export PATH := $(HOME ) /.local/bin:$(PATH )
3+
24PROJECT ?= pytrade
3- BRANCH_NAME ?= local
5+ BRANCH_NAME ?= $( shell git rev-parse --abbrev-ref HEAD | tr '/' '-')
46BUILD_NUMBER ?= 0
5- IMAGE ?= ${PROJECT}:${BRANCH_NAME}-${BUILD_NUMBER}
6- COMPOSE_FILE =docker/docker-compose.yaml
7- COMPOSE_BASE_FILE =docker/docker-compose.base.yaml
8- DC =docker compose -p ${PROJECT} -f ${COMPOSE_FILE} -f ${COMPOSE_BASE_FILE}
9- SERVICE := pytrade
10- POETRY ?= "poetry"
11- VERSION := $(shell head VERSION | grep -Eo "\d+.\d+.\d+")
7+ POETRY ?= poetry
8+ SRC_DIR := src
9+
10+ # Auto-discover packages under src/
11+ PACKAGES := $(shell ls $(SRC_DIR ) )
12+
13+ # Package filter: "make <cmd> pytrade" selects one package
14+ PKG_FILTER := $(filter $(PACKAGES ) ,$(MAKECMDGOALS ) )
15+ SELECTED_PKGS := $(or $(PKG_FILTER ) ,$(PACKAGES ) )
16+
17+ # Convert hyphenated package name to Python import name (e.g. pytrade-backtest -> pytradebacktest)
18+ pkg_to_import = $(subst -,,$(1 ) )
19+
20+ # Computed paths used by sub-makefiles
21+ SRC_DIRS := $(foreach pkg,$(SELECTED_PKGS ) ,$(SRC_DIR ) /$(pkg ) /$(call pkg_to_import,$(pkg ) ) )
22+ LINT_DIRS := $(SRC_DIRS ) tests
23+ COV_ARGS := $(foreach pkg,$(SELECTED_PKGS ) ,--cov=$(call pkg_to_import,$(pkg ) ) )
24+ MYPY_ARGS := $(foreach pkg,$(SELECTED_PKGS ) ,-p $(call pkg_to_import,$(pkg ) ) )
25+
26+ # Allow package names as make goals (no-op targets)
27+ ifneq ($(PKG_FILTER ) ,)
28+ $(PKG_FILTER ) : @:
29+ endif
1230
1331.DEFAULT_GOAL := help
1432
@@ -18,4 +36,11 @@ include makefiles/development.mk
1836include makefiles/help.mk
1937include makefiles/lint.mk
2038include makefiles/local.mk
21- include makefiles/test.mk
39+ include makefiles/test.mk
40+
41+ .PHONY : list-packages
42+ list-packages : # #@other List all packages in src/
43+ @echo " Available packages:"
44+ @for pkg in $(PACKAGES ) ; do echo " - $$ pkg" ; done
45+ @echo " "
46+ @echo " Usage: make <target> [package]"
0 commit comments