AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 79024108
Accepted
Chris
Chris
Asked: 2024-09-26 01:17:48 +0800 CST2024-09-26 01:17:48 +0800 CST 2024-09-26 01:17:48 +0800 CST

Como imprimo uma variável make multilinha diretamente em um pipeline?

  • 772

Considere um makefileitem multilinha:

define ITEM
line $$ONE
line $$TWO
endef

item:
  echo '$(ITEM)' | ... > $@

O problema é que, à medida que o ITEM fica complexo, corro o risco de obter erros de cotação e outros problemas ao repetir o item.

Eu também poderia executar com uma exportação:

export ITEM
item:
  print "%s\n" '$${ITEM}' | ...

Mas não tenho certeza se haverá os mesmos bugs.

Existe alguma função make que injetará o conteúdo de uma variável diretamente no shell, como se fosse enviado para /dev/stdin?

# e.g. something like:
$(info $ITEM) | ...

Entendo que posso escrever o valor diretamente em um arquivo, que poderei processar via shell. Mas ser capaz de escrevê-lo diretamente em um pipeline causaria um curto-circuito nisso.

  • isso terá uma série de comandos ou introduzirá requisitos comosponge
  • isso também pode fazer com que eu tenha que mudar de coisas simples envsubstpara coisas mais pesadas, como sedpermitir modificações no local (para evitar a instalação de esponjas)

Também entendo que posso exportar o valor para todos os subshells:

  • isso pode ser problemático se minha extensão estiver incluída em um projeto make recursivo ou em um projeto make com uma grande quantidade de sobrecarga de exportação (por exemplo, parameter?=varsaquele padrão para valores env introduz uma grande quantidade de sobrecarga quando .SECONDEXPANSIONestá habilitado)
  • em particular, exportar muito pode prejudicar o desempenho da zshconclusão de tabulação para make, que é um requisito básico para usuários de Mac

Mas não tenho provas de exportação e echo "$$ITEM"ou print("%s/\n") "$$ITEM"terei escapes adequados. Então terei que testar.


O que não é "uma maneira", mas a melhor prática pretendida para fazer isso?

Se a resposta for: use $(file ..)e modifique o arquivo no local a partir daí, então que assim seja; só quero ter certeza de que é o ideal.

makefile
  • 2 2 respostas
  • 27 Views

2 respostas

  • Voted
  1. Best Answer
    White Owl
    2024-09-26T02:25:42+08:002024-09-26T02:25:42+08:00

    A solução usual para uma expansão de variável complexa é apenas escrever um arquivo shell externo. Ou um script (perl/python/awk). Ou mesmo uma ferramenta especial compilada para produzir algo que é necessário para a compilação real. Não é obrigatório que tudo faça parte de makefile.

    A regra geral aqui é: "se você está tendo dificuldades com variáveis, cifrões e aspas, talvez seja hora de pensar em um script externo?"

    • 2
  2. Chris
    2024-09-26T05:19:01+08:002024-09-26T05:19:01+08:00

    Depois de revisar a resposta aceita, vou adaptar a convenção do manual :

    Por exemplo, a função file pode ser útil se seu sistema de build tiver um tamanho de linha de comando limitado e sua receita executar um comando que pode aceitar argumentos de um arquivo também. Muitos comandos usam a convenção de que um argumento prefixado com @ especifica um arquivo contendo mais argumentos. Então você pode escrever sua receita desta forma:

    program: $(OBJECTS)
            $(file >[email protected],$^)
            $(CMD) $(CMDFLAGS) @[email protected]
            @rm [email protected]
    

    E no meu caso, o arquivo intermediário que terei que criar para manter a simplicidadeenvsubst (em vez de ) sedse tornará o análogo para o [email protected]:

    define new-file.sh
    #!/bin/bash
    echo "$$FOO"
    endef
     
    new-file.sh:
      $(file >[email protected],$($@))
      cat [email protected] | ... > $@
      @rm [email protected]
    

    O que será algo que terei grandes chances de fazer da mesma forma na próxima vez.

    • 0

relate perguntas

  • Como colocar arquivos objeto em um diretório diferente usando Makefile?

  • reconstrua apenas quando necessário, mesmo que dependamos de um subprojeto com seu próprio Makefile

  • Makefile para compactar todos os arquivos em um diretório

  • O que é $(OS) em uma condicional Makefile?

  • Por que `make install` está sempre sendo chamado?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle?

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Quando devo usar um std::inplace_vector em vez de um std::vector?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Martin Hope
    Aleksandr Dubinsky Por que a correspondência de padrões com o switch no InetAddress falha com 'não cobre todos os valores de entrada possíveis'? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer Quando devo usar um std::inplace_vector em vez de um std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB Por que o GCC gera código que executa condicionalmente uma implementação SIMD? 2024-02-17 06:17:14 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve