Usando o script python incorporado no Makefile

3

Estou tentando executar um fragmento de Python dentro de um destino do Make, mas estou tendo problemas para tentar descobrir como essas coisas funcionam no Make.

Aqui está minha tentativa até agora:

define BROWSER_PYSCRIPT
import os, webbrowser, sys
try:
    from urllib import pathname2url
except:
    from urllib.request import pathname2url

webbrowser.open("file://" + pathname2url(os.path.abspath(sys.argv[1])))
endef
BROWSER := $(shell python -c '$(BROWSER_PYSCRIPT)')

Eu queria usar $ (BROWSER) em um alvo como:

docs:
    #.. compile docs
    $(BROWSER) docs/index.html

Esta é realmente uma má ideia?

    
por elias 13.08.2015 / 05:57

2 respostas

2

Relacionados: link

Você não pode se lembrar de uma variável de várias linhas como em uma única receita; ela é expandida para várias receitas e causa um erro de sintaxe.

Uma solução possível seria:

export BROWSER_PYSCRIPT
BROWSER := python -c "$$BROWSER_PYSCRIPT"

docs:
        #.. compile docs
        $(BROWSER) docs/index.html
    
por 13.08.2015 / 07:20
1

A abordagem de Yaegashi funcionará, mas não será fácil dar valores imediatos. O comando 'export' é avaliado enquanto o Makefile está sendo analisado e define uma variável de ambiente do shell para a receita. Em seguida, a variável de ambiente é avaliada durante a execução da receita 'docs'.

Se o seu snippet precisar ter alguma variável dependente de alvo preenchida, eu recomendaria uma abordagem como essa:

Aproximação rápida

Se você precisar executar apenas algumas linhas, esse padrão funcionará muito bem.

run_script = python -c \
"import time ;\
print 'Hello world!' ;\
print '%d + %d = %d' %($1,$2,$1+$2) ;\
print 'Running target \'%s\' at time %s' %('$3', time.ctime())"

test:
    $(call run_script,4,3,$@)

Abordagem de fantasia

Se você quiser usar caracteres e funções estranhas, for-loops ou outras construções de várias linhas, aqui está um padrão sofisticado que funcionará lindamente.

#--------------------------- Python Script Runner ----------------------------#

define \n


endef

escape_shellstring = \
$(subst ',\',\
$(subst ",\",\
$(subst $$,\$$,\
$(subst \,\,\
$1))))

escape_printf = \
$(subst \,\,\
$(subst %,%%,\
$1))

create_string = \
$(subst $(\n),\n,\
$(call escape_shellstring,\
$(call escape_printf,\
$1)))

python_script = printf "$(call create_string,$($(1)))" | python

#------------------------------- User Scripts --------------------------------#

define my_script

def good_times():
    print "good times!"

import time
print 'Hello world!'
print '%d + %d = %d' %($2,$3,$2+$3)
print 'Runni'ng $$BEEF \ttarget \t\n\n"%s" at time %s' %('$4', time.ctime())
good_times()

endef

#--------------------------------- Recipes -----------------------------------#

test:
    $(call python_script,my_script,1,2,$@)
    
por 14.08.2015 / 00:58

Tags