3

I want to use the variables from another Makefile under the directory ~/kernelbuild/linux-3.14.37 in my own shell script.

Following is the variables that I need:

VERSION = 3
PATCHLEVEL = 14
SUBLEVEL = 37

The problem is that I am not allowed to change the Makefile, so export variable is not an option here.

Also, I have seen people saying to have a separate file that contains all the common variables need. This is practical but I need to put everything just in my single shell script.

I tried to include . ~/kernelbuild/linux-3.14.37/Makefile in my shell script and I thought I should be able to use those variables, but it gives me following errors:

/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 1: VERSION: command not found
/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 2: PATCHLEVEL: command not found
/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 3: SUBLEVEL: command not found
/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 4: EXTRAVERSION: command not found
/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 5: NAME: command not found
/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 17: MAKEFLAGS: command not found
/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 20: unexport: command not found
/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 26: unexport: command not found
/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 47: syntax error near unexpected token `"$(origin V)",'
/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 47: `ifeq ("$(origin V)", "command line")'

I think that's because the Makefile is not following the syntax rules for shell script. How can I do that then?

Thanks in advance!

3 Answers 3

5

If you need just simple things like your example, just grep them out of the Makefile.

For more complicated things, GNU Make has a -p option which prints the database after running Make, which includes all the variable definitions (and a lot more). You can use it together with -n, which causes the actions to not actually run (so nothing gets built). You can grep the variables out of the -p output.

3

You may try to extract the values with grep and sed. For example:

filename="$HOME/kernelbuild/linux-3.14.37/Makefile"
version=$(grep -m 1 VERSION $filename | sed 's/^.*= //g')

This greps for first occurrence of "VERSION" in Makefile

2
  • I tried your way, but it gives error like grep: ~/kernelbuild/linux-3.14.37/Makefile: No such file or directory, and I am sure I use the right path. Why is that?
    – Jialun Liu
    Commented Mar 29, 2015 at 19:12
  • Sorry, tilde is not expanded when quoted. You can substitute it with $HOME variable or expand to full path. I corrected my answer.
    – baf
    Commented Mar 29, 2015 at 19:22
3

Make can read a makefile from stdin, so you can give it a here document that is a makefile. The following is a makefile that includes your kernel makefile and adds a new wildcard target, %.var, whose recipe will output the value of the given make variable. (This assumes you don't have any files or other targets that end in .var, of course).

showvar() {
make -f - ${1}.var <<'EOF'
include $(HOME)/kernelbuild/linux-3.14.37/Makefile

%.var:
    @echo $($*)
EOF
}

my_version=$(showvar VERSION)
patchlevel=$(showvar PATCHLEVEL)
the_sublevel=$(showvar SUBLEVEL)

Make will replace $* with the stem of the %.var target.

The @echo recipe line begins with an actual TAB character.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .