If conditions in a Makefile, inside a target

后端 未结 2 1498
北荒
北荒 2021-01-31 07:13

I\'m trying to setup a Makefile that will search and copy some files (if-else condition) and I can\'t figure out what exactly is wrong with it? (thou I\'m pretty sure it\'s beca

相关标签:
2条回答
  • 2021-01-31 07:36

    You can simply use shell commands. If you want to suppress echoing the output, use the "@" sign. For example:

    clean:
        @if [ "test" = "test" ]; then\
            echo "Hello world";\
        fi
    

    Note that the closing ";" and "\" are necessary.

    0 讨论(0)
  • 2021-01-31 07:53

    There are several problems here, so I'll start with my usual high-level advice: Start small and simple, add complexity a little at a time, test at every step, and never add to code that doesn't work. (I really ought to have that hotkeyed.)

    You're mixing Make syntax and shell syntax in a way that is just dizzying. You should never have let it get this big without testing. Let's start from the outside and work inward.

    UNAME := $(shell uname -m)
    
    all:
        $(info Checking if custom header is needed)
        ifeq ($(UNAME), x86_64)
        ... do some things to build unistd_32.h
        endif
    
        @make -C $(KDIR) M=$(PWD) modules
    

    So you want unistd_32.h built (maybe) before you invoke the second make, you can make it a prerequisite. And since you want that only in a certain case, you can put it in a conditional:

    ifeq ($(UNAME), x86_64)
    all: unistd_32.h
    endif
    
    all:
        @make -C $(KDIR) M=$(PWD) modules
    
    unistd_32.h:
        ... do some things to build unistd_32.h
    

    Now for building unistd_32.h:

    F1_EXISTS=$(shell [ -e /usr/include/asm/unistd_32.h ] && echo 1 || echo 0 )
    ifeq ($(F1_EXISTS), 1)
        $(info Copying custom header)
        $(shell sed -e 's/__NR_/__NR32_/g' /usr/include/asm/unistd_32.h > unistd_32.h)
    else    
        F2_EXISTS=$(shell [[ -e /usr/include/asm-i386/unistd.h ]] && echo 1 || echo 0 )
        ifeq ($(F2_EXISTS), 1)
            $(info Copying custom header)
            $(shell sed -e 's/__NR_/__NR32_/g' /usr/include/asm-i386/unistd.h > unistd_32.h)
        else
            $(error asm/unistd_32.h and asm-386/unistd.h does not exist)
        endif
    endif
    

    You are trying to build unistd.h from unistd_32.h; the only trick is that unistd_32.h could be in either of two places. The simplest way to clean this up is to use a vpath directive:

    vpath unistd.h /usr/include/asm /usr/include/asm-i386
    
    unistd_32.h: unistd.h
        sed -e 's/__NR_/__NR32_/g' $< > $@
    
    0 讨论(0)
提交回复
热议问题