2015-07-13 79 views
2

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

| pam_radius-1.4.0 -- Linux-PAM-1.2.0

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

我的化妆文件如下

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 [email protected] 
md5.o: src/md5.c src/md5.h 
    $(CC) $(CFLAGS) -c $< -o [email protected] 
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,我得到一个错误,如果我发表评论,那么它会说:`Linux-PAM-1.2.0'是最新的。

+0

尝试移动 '的mkdir $(SUBDIR)/安装/' 线后 '$(SUBDIR):' –

+0

累出来还是同样的问题 – Manu

+0

你不不会构建源代码(以某种方式生成的C或C++代码不是源代码!)。您可以从源代码构建程序。 –

回答

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 [email protected] 

md5.o: src/md5.c src/md5.h 
    $(CC) $(CFLAGS) -c $< -o [email protected] 

clean: 
    rm -f *.o *.so 
0
  1. all配方移到所有其他配方之上。这只是惯例,称它为all - Makefile中的默认目标始终是第一个目标。

  2. 使all取决于您的subdir规则的结果。一个常见的技巧是使用一个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. 试着了解Makefiles是如何工作的。他们不是脚本。你不能只是把一个命令的任何地方....它总是

    <target>: <dependencies> 
         <commands to build target> 
    
  4. 这就是说,这个概念是一种有缺陷的。您的$(SUBDIR)/install/stamp规则必须依赖于该子目录的任何输入文件,以便根据需要使依赖性正常工作和重建。现在你可以通过删除邮票文件来强制它。

+0

谢谢你。正如你所说,我通过make file并告诉你所要求的改变。在我做了一个make后,make:'Linux-PAM-1.2.0'是最新的。但我已经完成了清洁工作。 – Manu

+0

扩展“干净”的规则来做类似'rm -f $(SUBDIR)/ install/stamp;使-C $(SUBDIR)干净“ –

相关问题