Makefile在多个目录和多个源中

时间:2014-02-11 19:13:57

标签: c makefile

我有一个具有以下目录结构的小项目:

src/
  game/
    some srcs...
  platform/
    sdl/
      main.c
      Makefile
  engine.c
  engine.h
Makefile

我打算在平台内部拥有多个目录,其中不同的平台我的目标是我的小项目。根级Makefile只是一个帮手:它允许我从根文件夹中运行诸如" make platform-name"," make platform-name-clean"等等

这是我在平台文件夹中的实际Makefile:

TARGET = sdl-game
SRC_FOLDER = ../..
CC = gcc
CFLAGS = -g -Wall -DPLAT_SDL
LDFLAGS = -lm

OBJECTS = main.o \
        $(SRC_FOLDER)/engine.o \
        $(SRC_FOLDER)/game/game.o \
        $(SRC_FOLDER)/game/components.o

$(TARGET): $(OBJECTS)
    $(CC) -o $(TARGET) $(OBJECTS) $(CFLAGS) $(LDFLAGS)

clean:
    rm -rf $(SRC_FOLDER)/*.o
    rm -rf $(SRC_FOLDER)/game/*.o
    rm -rf $(SRC_FOLDER)/platform/sdl/*.o
    rm -rf $(SRC_FOLDER)/platform/sdl/sdl

问题是:我无法使用我的根级Makefile从platform / sdl文件夹外部运行它:

null:
make -C src/platform/sdl -f Makefile

有什么想法吗?另外,我如何将这些.o对象移动到" build / platform-name"文件夹?

2 个答案:

答案 0 :(得分:0)

永远不要在其他目录中调用Makefile;相反,在每个子目录中放置一个Makefile,并在项目的根目录中添加一个主Makefile,如下所示:

SHELL = /bin/bash

DIRS = subdir1 subdir2 ...

depend all clean ::
    @ for d in $(DIRS) ; do \
        (cd $$d && make $@) ;\
    done

但我不确定回答你的问题?

答案 1 :(得分:0)

如果我理解你的评论(“构建,在root上”),请正确地做到这一点:

...
OBJ_FOLDER = ../../../build
...

OBJECTS = $(OBJ_FOLDER)/main.o \
          $(OBJ_FOLDER)/engine.o \
          $(OBJ_FOLDER)/game.o \
          $(OBJ_FOLDER)/components.o

$(TARGET): $(OBJECTS)
    $(CC) -o $(TARGET) $(OBJECTS) $(CFLAGS) $(LDFLAGS)

vpath %.c $(SRC_FOLDER) $(SRC_FOLDER)/game

$(OBJECTS): $(OBJ_FOLDER/%.o : %.c
    $(CC) -o $@ $< $(CFLAGS)

clean:
    rm -rf $(OBJ_FOLDER)/*.o
    rm -rf sdl