【问题标题】:How to build multiple targets from one makefile如何从一个 makefile 构建多个目标
【发布时间】:2012-12-04 20:44:43
【问题描述】:

我正在尝试参数化我的 makefile 目标。目前,它有一个

TARGET = main

顶部附近的声明。它从中派生出SRC 列表,并执行许多其他操作。

不过,我已经更改了我的 C 代码,因此我有多个不同的* .c 文件来基本上获得变体版本。所以我想做的基本上就是做

make target1

make target2

改变 TARGET 在 makefile 中的设置。我很困惑如何做到这一点。我想我可能会添加类似的东西

target1: all
    TARGET=target1

不过,这似乎并没有很好地工作。是否有一个如何做到这一点的一般模式?

【问题讨论】:

    标签: c makefile


    【解决方案1】:

    我建议在 makefile 中将您的目标简单地拼写为单独的目标:

    all: target1 target2
    
    OTHER_OBJS = misca.o miscb.o miscc.o
    
    target1: target1.o $(OTHER_OBJS)
    
    target2: target2.o $(OTHER_OBJS)
    

    那么makemake target1make target2等等都会为所欲为。

    您说您的 makefile “从 [$(TARGET)] 导出 SRC 列表”以某种可能是高科技的方式,但尝试以低技术方式显式列出目标文件可能会很有趣,因为更多。使用不同的 make 目标可以说是 Make 产生不同结果的一般模式。

    【讨论】:

    • 这太不可思议了,但是all: 记录在哪里?我在section 4.3 of the GNU Make Manual 的示例中看到第一次使用它,但没有讨论。
    • 这真的很普通……默认情况下,Make 会重建列出的第一个目标(例如,参见GNU Make §9.2),all 是该目标的常规名称。
    【解决方案2】:

    参数化变量名称和特定于目标的变量可以做你想做的事,因为特定于目标的变量的值通常由该目标的先决条件“继承”(假设你使用的是 GNU make):

    target1_SRC=123 456
    target2_SRC=abc def
    
    target1: TARGET=target1
    target2: TARGET=target2
    
    target1: all
    target2: all
    
    all: ; @echo $($(TARGET)_SRC)
    

    然后你可以运行make target1make target2,例如:

    $ make target1
    123 456
    $ make target2
    abc def
    

    【讨论】:

      【解决方案3】:

      嗯...使用 pmake 我们可以做到这一点:(如果使用 gmake 我们可以将 $(.THINGS) 替换为等价 $@ $

      .PHONY: clean run
      
      PROGRAMS = progrname_one progrname_two... and so
      
      all: $(PROGRAMS)
      
      $(PROGRAMS): $(PROGRAM=$(.TARGET))
      
      CC = clang -I.
      
      CFLAGS = -O0 -g -std=gnu11 
      
      OBJS = 
      
      LIBS = 
      
      CPATH = .
      
      $(PROGRAM): $(PROGRAM).c $(OBJS)
          $(CC) $(CFLAGS) -o $(.TARGET) $(.IMPSRC) $(OBJS) $(LIBS) 
      
      $(PROGRAM).o: $(PROGRAM).c
      
      clean:
          rm -f *~
          rm -f *.core
          rm -f $(PROGRAMS) $(PROGRAMS).o
      
      run:
          ./$(PROGRAM)
      
      dbg:
          lldb ./$(PROGRAM)
      

      【讨论】:

        最近更新 更多