How to define global shell functions in a Makefile?

前端 未结 7 1009
醉酒成梦
醉酒成梦 2021-02-12 12:18

I want to define a shell function

#!/bin/sh

test ()
{
  do_some_complicated_tests $1 $2;
  if something; then
    build_thisway $1 $2;
  else
    build_otherway         


        
7条回答
  •  佛祖请我去吃肉
    2021-02-12 12:49

    I don't think this qualifies as "elegant", but it seems to do what you want:

    ##
    ## --- Start of ugly hack
    ##
    
    THIS_FILE := $(lastword $(MAKEFILE_LIST))
    
    define shell-functions
    : BEGIN
      # Shell syntax here
      f()
      {
        echo "Here you define your shell function. This is f(): $@"
      }
    
      g()
      {
        echo "Another shell function. This is g(): $@"
      }
    : END
    endef
    
    # Generate the file with function declarations for the shell
    $(shell sed -n '/^: BEGIN/,/^: END/p' $(THIS_FILE) > .functions.sh)
    
    # The -i is necessary to use --init-file
    SHELL := /bin/bash --init-file .functions.sh -i
    
    ##
    ## -- End of ugly hack
    ##
    
    all:
        @f 1 2 3 4
        @g a b c d
    

    Running this produces:

    $ make -f hack.mk
    Here you define your shell function. This if f(): 1 2 3 4
    Another shell function. This is g(): a b c d
    

    Running it with -n produces:

    $ make -f hack.mk -n
    f 1 2 3 4
    g a b c d
    

    This relies on the fact that macros defined between define and endef are not interpreted by make at all until they are actually used, so you can use shell syntax directly and you don't need to end each line with a backslash. Of course, it will bomb if you call the shell-functions macro.

提交回复
热议问题