Arcones
Arcones

Reputation: 4632

Discover inside Makefile the python interpreter to call

I am delivering a Makefile to some people to run some python steps, example:

build:
    pip install -r requirements.txt

package:
    python3 -m build

The assumption here is that some of the people running the Makefile will have python 3 responding by calling python while some other will have it responding at python3 (some of them will even have an alias that will make both respond). Same happens for pip/pip3 command.

How can I discover which is the name of the interpreters to invoke programmatically through the same Makefile?

I don't want to tell them to change the Makefile manually to fit their system, I want it simply to work.

Upvotes: 0

Views: 292

Answers (1)

Andreas
Andreas

Reputation: 5301

You can figure out what version of python (or pip?) it is by parsing the output of shell command asking for the version string:

# Variable for the python command (later overwritten if not working)
PYTHON_COMMAND := python

# Get version string (e.g. Python 3.4.5)
PYTHON_VERSION_STRING := $(shell $(PYTHON_COMMAND) -V)

# If PYTHON_VERSION_STRING is empty there probably isn't any 'python'
# on PATH, and you should try set it using 'python3' (or python2) instead.
ifeq $(PYTHON_VERSION_STRING),
    PYTHON_COMMAND := python3
    PYTHON_VERSION_STRING := $(shell $(PYTHON_COMMAND) -V)
    ifeq $(PYTHON_VERSION_STRING),
        $(error No Python 3 interpreter found on PATH)
    endif
endif

# Split components (changing "." into " ")
PYTHON_VERSION_TOKENS := $(subst ., ,$(PYTHON_VERSION_STRING)) # Python 3 4 5
PYTHON_MAJOR_VERSION := $(word 2,$(PYTHON_VERSION_TOKENS)) # 3
PYTHON_MINOR_VERSION := $(word 3,$(PYTHON_VERSION_TOKENS)) # 4

# What python version pip targets is a little more difficult figuring out from pip
# version, having python version at the end of a string containing a path.
# Better call pip through the python command instead.
PIP_COMMAND := $(PYTHON_COMMAND) -m pip

Upvotes: 1

Related Questions