2015-07-13 71 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)乾淨「 –

相關問題