2015-10-07 10 views
0

Я использую Makefile для проекта Python. Существуют некоторые переменные конфигурации Python, которые мне нужно включить в каждый Makefile, а Make-файлы могут находиться в разных подкаталогах в корне проекта (хотя и не более одного уровня).Включить путь для выполнения включенных Makefile

В корневом каталоге проекта, я создал Makefile.inc с, например, следующего содержания:

define PYSCRIPT 
from lib.custommodule import VAR1 
print(VAR1) 
endef 
VAR1 := $(shell python -c '$(PYSCRIPT)') 

«custommodule» живет внутри Python Lib корневой директории проекта, и все Makefiles на верхнем уровне, которые включают Makefile.inc без ошибок.

В 'подкаталоге/Makefile', у меня есть:

include ../Makefile.inc 
echo $(VAR1) 

Когда я cd subdirectory && make, я получаю сообщение об ошибке:

ImportError: No module named custommodule 

Я пытался добавить путь Python в «Makefile.inc '(в блоке define PYSCRIPT), чтобы включить родительский каталог, считая, что' subdirectory/Makefile 'выполнял' ../Makefile.inc 'в своем собственном пути по сравнению с родительским путем, но это тоже не сработало.

Я пропустил что-то, что мешает этому работать? Или есть лучший способ добиться того, что я пытаюсь?

ответ

0

Как насчет Makefile.inc с:

ROOTDIR ?= . 

define PYSCRIPT 
from lib.custommodule import VAR1 
print(VAR1) 
endef 
export PYSCRIPT 

VAR1 := $(shell PYTHONPATH=$(ROOTDIR) python -c "$$PYSCRIPT") 

и subdirectory/Makefile с:

ROOTDIR = .. 
include $(ROOTDIR)/Makefile.inc 

all: 
    echo $(VAR1) 

Не тестировалось.

+0

Это не сработает: вы пытаетесь добавить назначение переменной переменной в скрипт python. – MadScientist

+0

Не совсем. Я добавляю к скрипту python, который будет выполняться с помощью '$ (shell ...)' вызывает назначение переменной python. Расширение make произойдет, прежде чем передать скрипт на python. Если у вас есть четкие доказательства того, что он не может работать, объясните, почему. –

+0

Несомненно, '$ (ROOTDIR)' будет расширен до запуска python. Но _assignment_ будет интерпретироваться с помощью python, а не make, потому что вы передаете весь скрипт 'python -c'. Вы просто устанавливаете переменную Python с именем 'PYTHONPATH' либо' .', либо '..', что является синтаксической ошибкой в ​​Python и не будет делать то, что вы хотели в любом случае. Вы можете сделать это: '$ (shell PYTHONPATH = $ (ROOTDIR) python -c '$ (PYSCRIPT)')' (и вывести его из скрипта). Для получения очевидных доказательств просто запустите 'python -c 'PYTHONPATH =.'' И посмотрите, как он сработал ... – MadScientist

Смежные вопросы