Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I have problems with using pkg-config in a Makefile, while running in sudo mode. I need to have PKG_CONFIG_PATH set for pkg-config to find geany.pc file that is held in /usr/local/lib/pkgconfig.

If I run:


If I run with sudo:

$ sudo echo $PKG_CONFIG_PATH

So I try running my Makefile that looks like this:

PLUGIN_DIR=`pkg-config --variable=libdir geany`/geany

all: pyflakes.o
    gcc pyflakes.o -o geanypyflakes.so -shared `pkg-config --libs geany`

pyflakes.o: pyflakes.c
    gcc -Wall -c pyflakes.c -fPIC `pkg-config --cflags geany` 

    echo ${PKG_CONFIG_PATH}
    cp geanypyflakes.so ${PLUGIN_DIR} --verbose

    rm geanypyflakes.so pyflakes.o

sudo make install

and I get following ouput:


cp geanypyflakes.so `pkg-config --variable=libdir geany`/geany --verbose
`geanypyflakes.so' -> `/geany'

Why suddenly PKG_CONFIG_PATH is not set? I can run sudo -E and then it works, but I would like to understand why it suddenly is not working.


Running export before didn't help:

$ export PKG_CONFIG_PATH='/usr/local/lib/pkconfig' && sudo make install

cp geanypyflakes.so `pkg-config --variable=libdir geany`/geany --verbose
`geanypyflakes.so' -> `/geany'
share|improve this question
may be you could try this export PKG_CONFIG_PATH='/usr/local/lib/pkgconfig' && sudo make install – greenmang0 Sep 2 '11 at 13:04
It didn't help. Please see my edit. – gruszczy Sep 2 '11 at 13:10
up vote 3 down vote accepted


sudo echo $PKG_CONFIG_PATH

command is not doing what you expect. The shell variable is expanded on the commandline before sudo is run. Try using single quotes around $PKG_CONFIG_PATH to stop the expansion on the sudo commandline and you will stop the shell expansion before sudo runs

richm@royalcounty:~$ export PKG_CONFIG_PATH=hello
richm@royalcounty:~$ sudo echo $PKG_CONFIG_PATH
richm@royalcounty:~$ sudo echo '$PKG_CONFIG_PATH'

In actual fact your original command is wrong because the echo inside sudo will do no variable expansion. You can force that by running the shell explicitly

richm@royalcounty:~$ sudo -E echo '$PKG_CONFIG_PATH'
richm@royalcounty:~$ sudo sh -c 'echo $PKG_CONFIG_PATH'

richm@royalcounty:~$ sudo -E sh -c 'echo $PKG_CONFIG_PATH'

That demonstrates why your sudo make install does not work without the -E argument to sudo

share|improve this answer
The short version of this is "use sudo -E make install instead". – bahamat Sep 2 '11 at 15:47
I understand now. Thanks a lot. – gruszczy Sep 2 '11 at 16:38

To answer the question of why make install environment variables are not passed...

By default sudo cleans out the environment before it executes your command. This is a security feature to stop bad guys influencing the operation of commands that are allowed via sudo.

You can specify the -E flag to preserve the environment but you might need to tweak the contents of your sudoers file to give yourself permission.

From man sudoers

   -E          The -E (preserve environment) option will override the
               env_reset option in sudoers(5)).  It is only available when
               either the matching command has the SETENV tag or the
               setenv option is set in sudoers(5).
share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.