更新Makefile以适应当今的标准

Updating Makefile to fit today standards

本文关键字:标准 Makefile 更新      更新时间:2023-10-16

我收到了以下Makefile。我应该编译一个有点复杂的项目,但Makefile本身并没有做到这一点,尽管我正在尝试修改它以使其工作。我正在学习GNU手册,但我的Makefile是用一种非常古老的风格编写的,我无法修复它。有人能帮我在维护功能的同时将其翻译成今天的标准吗?

线路:

$(EXE):    $(OBJS)
        bla=;
        for file in $(OBJS); do bla="$$bla ` $$file`"; done; 
        $(CXX) $(CXXLINKFLAGS) $(CXXFLAGS) -o $@ $$bla $(ADDLIBS) $(LIBS)

是我主要感兴趣的。

这是完整的Makefile:

# //////////////// NOMBRE DEL PROYECTO /////////////////// 
    #
    P=project
    #
    EXE=$(P)
    OBJS=main.o model.o param.o head.h
    ADDLIBS=-D.
    ADDINCFLAGS=-I.
    SRCDIR=/root/projects/project
    ########## 

    CXX=g++
    CXXFLAGS=-O3 -fomit-frame-pointer -pipe -DNDEBUG -pedantic-errors -Wparentheses -Wreturn-type -Wcast-qual -Wall -Wpointer-arith -Wwrite-strings -Wconversion -I$(COININCDIR)
    CXXLINKFLAGS=-Wl,--rpath -Wl,/installed/CoinAll/lib

    CC=gcc
    CFLAGS=-03 -fomit-frame-pointer -pipe -DNDEBUG -pedantic-errors -Wimplicit -Wparentheses -Wsequence-point -Wreturn-type -Wcast-qual -Wall

    COININCDIR=/installed/CoinAll/include/coin
    COINLIBDIR=/installed/CoinAll/lib

    LIBS=-L$(COINLIBDIR) -lCbc -lCgl -lOsiClp -lOsi -lClp -lCoinUtils -lm 
    `cat $(COINLIBDIR)/cgl_addlibs.txt` 
    `cat $(COINLIBDIR)/clp_addlibs.txt` 
    `cat $(COINLIBDIR)/coinutils_addlibs.txt` 
    # LIBS=-L$(COINLIBDIR) -lClp -lCoinUtils 
    # -lm `cat $(COINLIBDIR)/coinutils_addlibs.txt`
    INCL=-I`$(COININCDIR)`$(ADDINCFLAGS)

    all: $(EXE)
    .SUFFIXES: .cpp .c .o .obj
    $(EXE): $(OBJS)
        bla=;
        for file in $(OBJS); do bla="$$bla ` $$file`"; done; 
        $(CXX) $(CXXLINKFLAGS) $(CXXFLAGS) -o $@ $$bla $(ADDLIBS) $(LIBS)   

    .cpp.o:
        $(CXX) $(CXXFLAGS) $(INCL) -c -o $@ `test -f '$<' || echo '$(SRCDIR)/'`$<
    .cpp.obj:
        $(CXX) $(CXXFLAGS) $(INCL) -c -o $@ `if test -f '$<'; then  '$<'; else '$(SRCDIR)/$<'; fi`
    .c.o:
        $(CC) $(CFLAGS) $(INCL) -c -o $@ `test -f '$<' || echo '$(SRCDIR)/'`$<
    .c.obj:
        $(CC) $(CFLAGS) $(INCL) -c -o $@ `if test -f '$<'; then '$<'; else '$(SRCDIR)/$<'; fi`

第一个问题是`$(OBJS)中的条目是否真的是要为其输出运行的命令,然后在链接行中使用其输出?

因为如果没有,那么反勾号是不正确的,整个循环可以被丢弃,并且主体被替换为:

$(CXX) $(CXXLINKFLAGS) $(CXXFLAGS) -o $@ $(OBJS) $(ADDLIBS) $(LIBS)

假设$(OBJS)的值是main.o model.o param.o head.h(忽略在对象列表中有一个.h文件这一事实是奇怪的),我认为以上可能是正确的。

但是,为了完整性,让我们假设它不是,并且这些对象确实希望执行以获得输出。在这种情况下,机身可以替换为:

$(CXX) $(CXXLINKFLAGS) $(CXXFLAGS) -o $@ $(patsubst %,`%`,$(OBJS)) $(ADDLIBS) $(LIBS)

最后两条评论。没有理由在的backticks中有的空格(假设它们一开始是正确的),也可能没有理由像那样预先声明$bla=