Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to manually call another target from a make target?

Tags:

gnu-make

I would like to have a makefile like this:

cudaLib :
    # Create shared library with nvcc

ocelotLib :
    # Create shared library for gpuocelot

build-cuda : cudaLib
    make build

build-ocelot : ocelotLib
    make build

build :
    # build and link with the shared library

I.e. the *Lib tasks create a library that runs cuda directly on the device, or on gpuocelot respectively.

For both build tasks I need to run the same build steps, only creating the library differs.

Is there an alternative to running make directly?

make build

Kind of a post-requisite?

like image 669
Simon A. Eugster Avatar asked Mar 21 '11 12:03

Simon A. Eugster


People also ask

How do I call a target in makefile?

When you type make or make [target] , the Make will look through your current directory for a Makefile. This file must be called makefile or Makefile . Make will then look for the corresponding target in the makefile. If you don't provide a target, Make will just run the first target it finds.

What is $@ in makefile?

The variable $@ represents the name of the target and $< represents the first prerequisite required to create the output file.

What is $( make in makefile?

And in your scenario, $MAKE is used in commands part (recipe) of makefile. It means whenever there is a change in dependency, make executes the command make --no-print-directory post-build in whichever directory you are on.

What is makefile target?

A simple makefile consists of “rules” with the following shape: target … : prerequisites … recipe … … A target is usually the name of a file that is generated by a program; examples of targets are executable or object files. A target can also be the name of an action to carry out, such as ' clean ' (see Phony Targets).


2 Answers

Note: This answer focuses on the aspect of a robust recursive invocation of a different target in a given makefile.

To complement Jack Kelly's helpful answer, here's a GNU makefile snippet that demonstrates the use of $(MAKE) to robustly invoke a different target in the same makefile (ensuring that the same make binary is called, and that the same makefile is targeted):

# Determine this makefile's path. # Be sure to place this BEFORE `include` directives, if any. THIS_FILE := $(lastword $(MAKEFILE_LIST))  target:     @echo $@  # print target name     @$(MAKE) -f $(THIS_FILE) other-target # invoke other target  other-target:     @echo $@ # print target name 

Output:

$ make target  target other-target 

Using $(lastword $(MAKEFILE_LIST)) and -f ... ensures that the $(MAKE) command uses the same makefile, even if that makefile was passed with an explicit path (-f ...) when make was originally invoked.


Note: While GNU make does have features for recursive invocations - for instance, variable $(MAKE) specifically exists to enable them - their focus is on invoking subordinate makefiles, not on calling a different target in the same makefile.

That said, even though the workaround above is somewhat cumbersome and obscure, it does use regular features and should be robust.

Here is the link to the manual section covering recursive invocations ("sub-makes"):

  • Recursive Use of make
like image 118
mklement0 Avatar answered Sep 27 '22 18:09

mklement0


Most versions of make set a variable $(MAKE) that you can use for recursive invocations.

like image 44
Jack Kelly Avatar answered Sep 27 '22 18:09

Jack Kelly