Makefile使用单个make文件构建两个源代码

时间:2015-07-13 07:36:56

标签: c linux makefile

我正在尝试使用单个makefile构建两个源代码。我想首先构建Linux-PAM-1.2.0然后是pam_radius-1.4.0。 pam_radius-1.4.0是最外层目录,Linux-PAM-1.2.0是内部目录。

| pam_radius-1.4.0 -- Linux-PAM-1.2.0

每个都有自己的make文件。我需要先编译Linux-PAM-1.2.0,然后我需要编译pam_radius-1.4.0,因为我需要提供Linux-PAM-1.2.0的路径来编译pam_radius-1.4.0。

我在pam_radius-1.4.0 makefile中做了一些修改。我需要先编译Linux-PAM-1.2.0,然后我需要编译pam_radius-1.4.0,因为我需要提供Linux-PAM-1.2.0的路径来编译pam_radius-1.4.0 makefile。我的make文件失败了。在做make之前我需要创建一个安装目录。已对pam_radius-1.4.0 Makefile进行了如下更改。我在Makefile中启用mkdir mkdir $(SUBDIR)/install/并让我收到错误。如果我禁用mkdir,我会收到一条消息make: Linux-PAM-1.2.0' is up to date.。我已经在make中做了make clean:`Linux-PAM-1.2.0'是最新的。

我的make文件如下

SUBDIR = Linux-PAM-1.2.0
CC = arc-linux-uclibc-gcc
INSTALL_PATH = $(shell pwd)
LINUX_PAM_PATH = $(shell pwd)/$(SUBDIR)/
mkdir $(SUBDIR)/install/

$(SUBDIR):
    $(MAKE) -C $(LINUX_PAM_PATH)
    $(MAKE) -C install
CFLAGS = -Wall -fPIC -I $(INSTALL_PATH)/$(LINUX_PAM)/install/include/
LDFLAGS = -L $(INSTALL_PATH)/$(LINUX_PAM)/install/lib/
all:pam_radius_auth.so
pam_radius_auth.o: src/pam_radius_auth.c src/pam_radius_auth.h
    $(CC) $(CFLAGS) -c $< -o $@
md5.o: src/md5.c src/md5.h
    $(CC) $(CFLAGS) -c $< -o $@
pam_radius_auth.so: pam_radius_auth.o md5.o
pam_radius_auth.so: pam_radius_auth.o md5.o
    $(CC) $(CFLAGS) $(LDFLAGS) -shared pam_radius_auth.o md5.o -lpam -o pam_radius_auth.so
你可以告诉我这里我做错了什么。如果我取消评论mkdir我得到一个错误,如果我评论然后它说make:`Linux-PAM-1.2.0'是最新的。

2 个答案:

答案 0 :(得分:0)

  1. all食谱移至所有其他食谱之上。调用它all只是惯例 - Makefile中的默认目标始终是第一个目标。

  2. 使all取决于您的子规则的结果。一个常见的技巧是使用stamp file,例如

    all: pam_radius_auth.so $(SUBDIR)/install/stamp
    
    $(SUBDIR)/install/stamp:
            mkdir -p $(SUBDIR)/install/
            $(MAKE) -C $(LINUX_PAM_PATH)
            $(MAKE) -C $(LINUX_PAM_PATH) install
            touch $(SUBDIR)/install/stamp
    
  3. 尝试了解Makefile的工作原理。它们不是脚本。你不能只是把命令放在任何地方....它总是

    <target>: <dependencies>
            <commands to build target>
    
  4. 那就是说,这个概念有点瑕疵。您的$(SUBDIR)/install/stamp规则必须依赖于该子目录的任何输入文件,以便使依赖项工作并根据需要重建。现在您可以通过删除戳记文件来强制它。

答案 1 :(得分:0)

您的Makefile应如下所示:

SUBDIR = Linux-PAM-1.2.0
CC = arc-linux-uclibc-gcc
INSTALL_PATH = $(shell pwd)
LINUX_PAM_PATH = $(shell pwd)/$(SUBDIR)/

CFLAGS = -Wall -fPIC -I $(INSTALL_PATH)/$(LINUX_PAM)/install/include/
LDFLAGS = -L $(INSTALL_PATH)/$(LINUX_PAM)/install/lib/

all: pam_radius_auth.so
    mkdir -p $(SUBDIR)/install/
    $(MAKE) -C $(LINUX_PAM_PATH)
    $(MAKE) -C install

pam_radius_auth.so: pam_radius_auth.o md5.o
    $(CC) $(CFLAGS) $(LDFLAGS) -shared pam_radius_auth.o md5.o -lpam -o pam_radius_auth.so

pam_radius_auth.o: src/pam_radius_auth.c src/pam_radius_auth.h
    $(CC) $(CFLAGS) -c $< -o $@

md5.o: src/md5.c src/md5.h
    $(CC) $(CFLAGS) -c $< -o $@

clean:
    rm -f *.o *.so