Tôi có một cấu trúc thư mục sau đây trong dự án của tôi:Thực hành tốt của Makefile
bin/
dist/
include/
├── module_a/
└── module_b/
Makefile
src/
├── module_a/
└── module_b/
Thư mục include/
chứa *.hpp
's trong khi *.cpp
' s là trong src/
. Tôi muốn biên dịch tất cả các nguồn thành bin/
và sau đó liên kết chúng với nhau để dist/
. Có vẻ là một điều ước khá hợp lý đối với tôi.
Tôi muốn biết các phương pháp hay nhất cho Makefile cho trường hợp này. Tất cả tôi có thể tìm thấy là %.o: %.cpp
mục tiêu, nhưng điều đó không thực sự làm việc, vì nguồn khác nhau và thư mục nhị phân.
Tôi đã cố gắng sử dụng một cái gì đó như thế này:
D_SRC = src
D_BIN=bin
F_CPP := $(shell find $(D_SRC) -iname '*.cpp' -type f)
F_OBJ := $(shell echo $(F_CPP) | sed s:\ :\\n:g | sed s:$(D_SRC):$(D_BIN): | sed 's:^\(.*\)\.cpp$$:\1\.o:')
$(F_OBJ): $(F_SRC)
$(foreach file, $(F_SRC), \
$(GXX) $(CXXFLAGS) -c $(file)\
)
mục tiêu này không hoạt động, vì $(F_OBJ)
đường dẫn bắt đầu với bin/
, trong khi foreach
biên dịch nguồn để dir làm việc hiện tại. Tôi có thể làm cho nó biên dịch thành bin/
, nhưng điều đó sẽ xảy ra chỉ với một vài biểu thức sed
và nó đủ xấu xí như nó.
Nó có lẽ khó khăn đối với tôi, bởi vì tôi không biết make
tất cả những gì tốt, nhưng tôi không thể là người duy nhất có thiết lập dự án này. Theo tôi, nó phải là một thứ khá phổ biến. Tôi biết tôi có thể viết một Makefile
cho từng mô-đun riêng biệt, nhưng đó thực sự là lựa chọn tốt nhất ở đây?
EDIT: Tôi đã tự hỏi tôi sẽ đạt được điều gì với một số Makefiles. Nếu một người ở gốc và một người khác ở số src/module_a
, người này sẽ biết như thế nào về số bin/
? Nếu bạn thực hiện nó với make -f src/module_a/Makefile
, nó sẽ giống như thực thi nó từ thư mục gốc, vì thư mục làm việc của nó sẽ là gốc. Một cách khác, tôi đoán, sẽ thay đổi thư mục trước khi thực hiện nó, như vậy: make -C include/module_a
, nhưng trong trường hợp đó, làm thế nào nó sẽ tìm thấy bin/
? Tôi sẽ không muốn có một cái gì đó như D_BIN = ../../bin
trong một Makefile.
Đã cập nhật câu trả lời của tôi ... –