2012-03-16 37 views
7

Tôi có file đối tượng đến với con đường mà có thể trông như thế này:Makefile - loại bỏ ../ từ đường

'../../src/foo/bar.c' 

Tôi muốn họ được đầu ra để

'build/src/foo/bar.o' 

Hiện đang sử dụng :

COBJS  := $(notdir $(CFILES)) 
COBJS  := $(patsubst %,$(BUILD)%.o,$(COBJS)) 

tôi có thể đạt được

'build/bar.o' 

Đây là vấn đề nếu có hai thư viện/dự án có cùng tên lớp.

Vì vậy, câu hỏi đặt ra là làm thế nào một người có thể xóa nhiều '../' khỏi đường dẫn trong Tạo. Tôi đã thử các cách tiếp cận rõ ràng và ngây thơ không có kết quả.

Cập nhật, thông tin sau sẽ khớp chính xác ../../ và thay thế bằng phần còn lại. Điều này hoàn hảo ngoại trừ việc nó cụ thể cho ../../. Chỉ cần để làm cho nó phù hợp với bất kỳ số lượng ../../

COBJS  := $(CFILES:../../%=%) 

Update,

SOLVED, chỉ cần ba danh tiếng nhút nhát của đăng câu trả lời của riêng tôi.

COBJS  := $(subst ../,,$(CFILES)) 
+0

Có gì sai với 'COBJS: = $ (subst ../.., xây dựng, $ (CFILES))'? – Beta

+0

Một số tệp không phải lúc nào cũng có hai đường dẫn tương đối ngược. – Halsafar

Trả lời

2

Như được đăng trong câu hỏi ban đầu của tôi và tôi đã quên trả lời cuối cùng.

Giải pháp cho việc này và có khả năng thay thế nhiều Make chuỗi khác là như sau:

COBJS  := $(subst ../,,$(CFILES)) 

'subst' mất 3 tham số. $ toMatch, $ replaceWith, $ string.

Trong trường hợp này $ (CFILES) là danh sách tất cả các tệp .c cần biên dịch. Tôi thay thế '../' bằng không có gì.

1

Hãy thử abspath.

COBJS := $(foreach file,${CFILES},$(abspath ${file})) 
0

Một giải pháp đơn giản cho vấn đề của bạn có thể như sau. Hãy xem xét một Makefile đơn giản

path_to_remove := batch1/test2 
path_to_add := earth/planet 

my_paths := \ 
batch1/test2/p/a3.c \ 
batch1/test2/p/a2.c \ 
batch1/test2/p/a1.c \ 
batch1/test2/q/b3.c \ 
batch1/test2/q/b2.c \ 
batch1/test2/q/b1.c 

$(info [Original] [$(my_paths)]) 
my_paths := $(my_paths:$(path_to_remove)/%=$(path_to_add)/%) 
$(info [New Changed] [$(my_paths)]) 

all: 
    @echo "Hi Universe" 

Khi bạn chạy lệnh thực hiện.

make 

Bạn sẽ nhận được ouput như:

[Original] [batch1/test2/p/a3.c batch1/test2/p/a2.c batch1/test2/p/a1.c batch1/test2/q/b3.c batch1/test2/q/b2.c batch1/test2/q/b1.c] 
[New Changed] [earth/planet/p/a3.c earth/planet/p/a2.c earth/planet/p/a1.c earth/planet/q/b3.c earth/planet/q/b2.c earth/planet/q/b1.c] 
Các vấn đề liên quan