How to get a shell environment variable in a makefile?

ShellMakefile

Shell Problem Overview


In shell when I enter

echo $demoPath

it prints

/usr/local/demo

How can I get the value of this variable $demoPath in a makefile?

Shell Solutions


Solution 1 - Shell

If you've exported the environment variable:

export demoPath=/usr/local/demo

you can simply refer to it by name in the makefile (make imports all the environment variables you have set):

DEMOPATH = ${demoPath}    # Or $(demoPath) if you prefer.

If you've not exported the environment variable, it is not accessible until you do export it, or unless you pass it explicitly on the command line:

make DEMOPATH="${demoPath}"

If you are using a C shell derivative, substitute setenv demoPath /usr/local/demo for the export command.

Solution 2 - Shell

all:
    echo ${PATH}

Or change PATH just for one command:

all:
    PATH=/my/path:${PATH} cmd

Solution 3 - Shell

for those who want some official document to confirm the behavior

> Variables in make can come from the environment in which make is run. > Every environment variable that make sees when it starts up is > transformed into a make variable with the same name and value. > However, an explicit assignment in the makefile, or with a command > argument, overrides the environment. (If the ‘-e’ flag is specified, > then values from the environment override assignments in the makefile.

https://www.gnu.org/software/make/manual/html_node/Environment.html

Solution 4 - Shell

if you export the variable in the same script you will need to use two $$ instead of $, if your Makefile is looking Something like this:

target:
    	. ./init.sh; \
    	echo ${HOMEPATH}:$${FOO};

in init.sh script you export the variable FOO

$ cat ./init.sh
#!/bin/bash
export FOO=foo:

this way when you run make target the env variable HOMEPATH that were defined before the script runs will be displayed only using one $, but the env variable FOO that is exported in same script will need $$ in order to be shown

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJialinView Question on Stackoverflow
Solution 1 - ShellJonathan LefflerView Answer on Stackoverflow
Solution 2 - Shellg10guangView Answer on Stackoverflow
Solution 3 - ShellDyno FuView Answer on Stackoverflow
Solution 4 - ShellAliView Answer on Stackoverflow