makefile - variabler till child processes

Elektronikrelaterade (på komponentnivå) frågor och funderingar.
arte
Inlägg: 317
Blev medlem: 13 januari 2006, 01:18:50

makefile - variabler till child processes

Inlägg av arte »

Hej,

Ärver inte en childprocess alla enviroment variabler av sin parent???
Jag får det inte att fungera i följande make exempel.

Makefile:

Kod: Markera allt

VAR1 := jippiedetfunka

def:
        ./a.out VAR1
a.c:

Kod: Markera allt

#include <stdio.h>
#include <stdlib.h>

int main(int argc,char *argv[])
{
 char *descr = getenv(argv[1]);

 if (descr)
        printf("Value %s \n",descr);
 else
        printf("ERROR!!!!!!\n");
  return 0;
}
Resultatet blir:

Kod: Markera allt

>make
./a.out VAR1
ERROR
Sub shellet som make skapar för a.out skall väl innehålla alla variabler som dess parent har?
sodjan
EF Sponsor
Inlägg: 43289
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: makefile - variabler till child processes

Inlägg av sodjan »

Jag fattar inte, försöker du exekvera okompilerad C kod !?
Om koden faktiskt hade körts, skulle det inte bli "ERROR!!!!!!"
och inte "ERROR" ?
Senast redigerad av sodjan 5 september 2013, 21:07:25, redigerad totalt 1 gång.
arte
Inlägg: 317
Blev medlem: 13 januari 2006, 01:18:50

Re: makefile - variabler till child processes

Inlägg av arte »

Nu kom jag på det. Man måste exportera variablerna för att de skall bli synliga i subshellet.

Kod: Markera allt

VAR1 := envar
export VAR1
def:
        ./a.out VAR1
Någon som har någon kommentar? Finns det något bättre sätt?
arte
Inlägg: 317
Blev medlem: 13 januari 2006, 01:18:50

Re: makefile - variabler till child processes

Inlägg av arte »

sodjan skrev:Jag fattar inte, försöker du exekvera okompilerad C kod !?
Kanske lite otydligt.
a.out är bara ett program som läser en envrioment variable och skriver ut dess innehåll.
Någonstans skulle det stå
gcc a.c
sodjan
EF Sponsor
Inlägg: 43289
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: makefile - variabler till child processes

Inlägg av sodjan »

OK, då är jag med... :-)
Om det fungerar nu, varför behöver du en bättre metod?
Jag är igen expert på make, men är det inte detta som
"export" är tänkt till?
arte
Inlägg: 317
Blev medlem: 13 januari 2006, 01:18:50

Re: makefile - variabler till child processes

Inlägg av arte »

Jag är inte vidare duktig på make men har dock jobbet mycket med det, så har sett en hel del make filer.
Kan inte minnas att jag har sett export i en make fil.

Det jag försöker göra är:

makefile:

Kod: Markera allt

RTL_DIR:=/some/path
export RTL_DIR
def:
    vlog -f thefiles.vc 
thefiles.vc

Kod: Markera allt

${RTL_DIR}/file1.v
${RTL_DIR}/file2.v
Altså fil-listan som används av questasim innehåller referenser till en enviroment variablen RTL_DIR.
Men det fungerar nu, vet dock inte om det är det snyggaste sättet.
danwi
Inlägg: 388
Blev medlem: 16 oktober 2008, 17:00:59
Ort: Linköping

Re: makefile - variabler till child processes

Inlägg av danwi »

arte skrev:

Kod: Markera allt

VAR1 := jippiedetfunka

def:
        ./a.out VAR1
Använd inte export i en make-fil - detta är till för skal-variabler! Det finns visserligen alltid undantag men jag har aldrig behövt använda export i en make-fil. Använd variabler som expanderas av make i stället. För att göra det ska du ersätta sista raden med:

Kod: Markera allt

        ./a.out $(VAR1)
Nu skriver du förvisso inte vilken make du kör, men skulle det vara GNU Make så finns en matnyttig sida om variabler!
danwi
Inlägg: 388
Blev medlem: 16 oktober 2008, 17:00:59
Ort: Linköping

Re: makefile - variabler till child processes

Inlägg av danwi »

Hmmm... När jag stod och borstade tänderna så insåg jag vad du faktiskt försöker göra :) Export löser ju iofs det problemet tillräckligt bra men jag skulle nog kollat på om det finns något annat sätt att tota ihop kommandoradsargumenten till vlog innan jag tog till den lösningen.

Kommer thefiles.vc från QuestaSim eller är den egenskriven?
sm5tfx
Inlägg: 114
Blev medlem: 20 juli 2011, 14:28:41
Ort: Gnällbältet

Re: makefile - variabler till child processes

Inlägg av sm5tfx »

Jag har ingen civiliserad dator här just nu, så jag kan inte testa, men det går att sätta omgivnings-variabler för enstaka kommandon (under förutsättning att SHELL är satt till en normal shell i make-filen). Så nåt sånt här bör kunna fungera.

Kod: Markera allt

VAR1 := jippiedetfunka

def:
        VAR1=$(VAR1) ./a.out VAR1
Vilket för all del inte är så lättläst, men man kan ju välja bättre namn...

För den oinvigde:
VAR1 på första raden är make-variabeln som expanderas i $(VAR1) och det värdet sätts i shell-variabeln VAR1 som a.out läser eftersom a.out ges det variabel-namnet som parameter.

Och som sagt, reservation för att jag inte provkört ovanstående.
Skriv svar