• make


    //makefile1
    myapp: main.o 2.o 3.o
        gcc -o myapp main.o 2.o 3.o
    main.o: main.c a.h
        gcc -c main.c
    2.o: 2.c a.h b.h
        gcc -c 2.c
    3.o: 3.c b.h c.h
        gcc -c 3.c

    // make -f Makefile1


    //makefile2
    //A Makefile with Macros
    all: myapp
    # Which compiler
    CC = gcc
    # Where are include files kept
    INCLUDE = .
    # Options for development
    CFLAGS = -g -Wall -ansi
    # Options for release
    # CFLAGS = -O -Wall -ansi
    myapp: main.o 2.o 3.o
        $(CC) -o myapp main.o 2.o 3.o
    main.o: main.c a.h
        $(CC) -I$(INCLUDE) $(CFLAGS) -c main.c
    2.o: 2.c a.h b.h
        $(CC) -I$(INCLUDE) $(CFLAGS) -c 2.c
    3.o: 3.c b.h c.h
        $(CC) -I$(INCLUDE) $(CFLAGS) -c 3.c
       
    //make -f Makefile2


    //makefile3
    //Multiple Targets
    all: myapp
    # Which compiler
    CC = gcc
    # Where to install
    INSTDIR = /usr/local/bin
    # Where are include files kept
    INCLUDE = .
    # Options for development
    CFLAGS = -g -Wall -ansi
    # Options for release
    # CFLAGS = -O -Wall -ansi
    myapp: main.o 2.o 3.o
        $(CC) -o myapp main.o 2.o 3.o
    main.o: main.c a.h
        $(CC) -I$(INCLUDE) $(CFLAGS) -c main.c
    2.o: 2.c a.h b.h
        $(CC) -I$(INCLUDE) $(CFLAGS) -c 2.c
    3.o: 3.c b.h c.h
        $(CC) -I$(INCLUDE) $(CFLAGS) -c 3.c

    clean:
        -rm main.o 2.o 3.o

    install: myapp
        @if [ -d $(INSTDIR) ]; \
        then \
            cp myapp $(INSTDIR);\
            chmod a+x $(INSTDIR)/myapp;\
            chmod og-w $(INSTDIR)/myapp;\
            echo “Installed in $(INSTDIR)”;\
        else \
            echo “Sorry, $(INSTDIR) does not exist”;\
        fi
       

       
    //We can ask make to print its built-in rules with the  -p option.
    OUTPUT_OPTION = -o $@
    COMPILE.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
    %.o: %.c
    #  commands to execute (built-in):
        $(COMPILE.c) $(OUTPUT_OPTION) $<

       

    #To add a new suffix rule, we first add a line to the makefile telling make about the new suffix;
    #we can then write a rule using this new suffix. make uses the special syntax
    .<old_suffix>.<new_suffix>:

    #Here’s a fragment of our makefile with a new general rule for converting .cpp files to .ofiles:
    .SUFFIXES:      .cpp
    .cpp.o:
        $(CC) -xc++ $(CFLAGS) -I$(INCLUDE) -c $<
       
    #The pattern rule equivalent for the .cpp rule example above would be
    %.cpp: %o
        $(CC) -xc++ $(CFLAGS) -I$(INCLUDE) -c $<
       


    //Managing Libraries with make
    #The syntax is  lib(file.o), which means the object file  file.o, as stored in the library  lib.a .
    #The  make command has a built-in rule for managing libraries that is usually equivalent to something like this:
    .c.a:
        $(CC) -c $(CFLAGS) $<
        $(AR) $(ARFLAGS) $@ $*.o

    //makefile4
    all: myapp
    # Which compiler
    CC=gcc
    # Where to install
    INSTDIR=/usr/local/bin
    # Where are include files kept
    INCLUDE=.
    # Options for development
    CFLAGS=-g -Wall -ansi
    # Options for release
    # CFLAGS=-O -Wall -ansi
    # Local Libraries

    MYLIB=mylib.a
    myapp: main.o $(MYLIB)
        $(CC) -o myapp main.o $(MYLIB)

    $(MYLIB): $(MYLIB)(2.o) $(MYLIB)(3.o)
    main.o: main.c a.h
    2.o: 2.c a.h b.h
    3.o: 3.c b.h c.h

    clean:
        -rm main.o 2.o 3.o $(MYLIB)

    install: myapp
        @if [ -d $(INSTDIR) ]; \
            then \
            cp myapp $(INSTDIR);\
            chmod a+x $(INSTDIR)/myapp;\
            chmod og-w $(INSTDIR)/myapp;\
            echo "Installed in $(INSTDIR)";\
        else \
            echo "Sorry, $(INSTDIR) does not exist";\
        fi

       
    //Makefiles and Subdirectories
    #First, you can have a second makefile in the subdirectory to compile the files, store them in a library, and
    #then copy the library up a level into the main directory. The main makefile in the higher-level directory
    #then has a rule for making the library, which invokes the second makefile like this:
    mylib.a:
        (cd mylibdirectory;$(MAKE))

    #The second way is to use some additional macros in a single makefile. The extra macros are generated by
    #appending a  D for directory or an  F for filename to those macros we’ve already discussed. We could then
    #override the built-in .c.o suffix rule with
    .c.o:
        $(CC) $(CFLAGS) -c $(@D)/$(<F) -o $(@D)/$(@F)


       
    //makefile5
    all: myapp
    .SUFFIXES:      .cpp
    .cpp.o:
            $(CC) -xc++ $(CFLAGS) -I$(INCLUDE) -c $<
    # Which compiler
    CC = gcc
    # Where to install
    INSTDIR = /usr/local/bin
    # Where are include files kept
    INCLUDE = .
    # Options for development
    CFLAGS = -g -Wall -ansi
    # Options for release
    # CFLAGS = -O -Wall -ansi
    myapp: main.o 2.o 3.o
        $(CC) -o myapp main.o 2.o 3.o
    main.o: main.c a.h
        $(CC) -I$(INCLUDE) $(CFLAGS) -c main.c
    2.o: 2.c a.h b.h
        $(CC) -I$(INCLUDE) $(CFLAGS) -c 2.c
    3.o: 3.c b.h c.h
        $(CC) -I$(INCLUDE) $(CFLAGS) -c 3.c
    clean:
        -rm main.o 2.o 3.o
    install: myapp
        @if [ -d $(INSTDIR) ]; \
            then \
            cp myapp $(INSTDIR);\
            chmod a+x $(INSTDIR)/myapp;\
            chmod og-w $(INSTDIR)/myapp;\
            echo "Installed in $(INSTDIR)";\
        else \
            echo "Sorry, $(INSTDIR) does not exist";\
        fi

    tanhao2013@foxmail.com || http://weibo.com/buttonwood
  • 相关阅读:
    shell基础知识8-xargs命令
    shell基础知识7-字段分隔符与迭代器
    shell基础知识6-在不按回车键的情况下读入N个字符
    DevOps
    DevOps
    Jenkins
    Jenkins
    Jenkins
    Jenkins
    Gerrit
  • 原文地址:https://www.cnblogs.com/buttonwood/p/2613817.html
Copyright © 2020-2023  润新知