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

原文链接: https://www.cnblogs.com/buttonwood/archive/2012/07/29/2613817.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    make

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/57255

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 上午8:06
下一篇 2023年2月9日 上午8:06

相关推荐