2012-03-07 20 views
11

Dự án tôi đang biên dịch sử dụng CMake, trong đó loves absolute pathnames.Đặt gcc đặt tên tệp tương đối trong thông tin gỡ lỗi

Khi tôi biên dịch với thông tin gỡ lỗi được bật, gcc đặt những tên dài đó vào các phần .debug_str, điều này không tốt để gỡ lỗi. Thay vào đó, tôi muốn có các tên đường dẫn tương đối ngắn so với dự án gốc.

Có một số tùy chọn để yêu cầu gcc tách một số phần của tên đường dẫn trước khi phát ra dữ liệu gỡ lỗi không? Hoặc, có lẽ, có một số công cụ có thể làm điều đó trên các tệp nhị phân đã biên dịch?

Tôi đã thử sử dụng SET(CMAKE_USE_RELATIVE_PATHS ON) (có vẻ là frowned upon bởi devs), nhưng khi tôi đang sử dụng các bản dựng nguồn ngoài, tên đường dẫn vẫn không ở dạng tôi muốn. I E. chúng là ./../src/mod_foo/foo.c thay vì mod_foo/foo.c.

+1

'./../ src/mod_foo/foo.c' là đường dẫn ** tương đối ** ... –

+0

Có, nhưng không liên quan * đến gốc của dự án *, mặc dù (có tại' ./ ../ src') – drdaeman

+0

Bạn gặp sự cố với CMake, chứ không phải với gcc. GCC đặt vào '.debug_str' chính xác là nó nhận được như một đối số dòng lệnh. – sirgeorge

Trả lời

5

Bạn có thể đặt thuộc tính RULE_LAUNCH_COMPILE của mục tiêu CMake để CMake gọi tập lệnh trình bao biến đổi đường dẫn tệp nguồn thành đường dẫn tương đối dự án trước khi gọi gcc. Sử dụng hàm CMake configure_file để tạo tập lệnh shell biết về số PROJECT_SOURCE_DIRPROJECT_BINARY_DIR của dự án của bạn.

Trong ngoài cùng CMakeLists.txt thêm mã sau đây của bạn:

configure_file(
    "${PROJECT_SOURCE_DIR}/gcc_debug_fix.sh.in" 
    "${PROJECT_BINARY_DIR}/gcc_debug_fix.sh" 
    @ONLY) 

add_executable (MyExecutable ...) 

set_target_properties(MyExecutable PROPERTIES 
    RULE_LAUNCH_COMPILE "${PROJECT_BINARY_DIR}/gcc_debug_fix.sh") 

Các kịch bản shell mẫu sau gcc_debug_fix.sh.in cần phải đi vào thư mục gốc của dự án CMake:

#!/bin/sh 

PROJECT_BINARY_DIR="@[email protected]" 
PROJECT_SOURCE_DIR="@[email protected]" 

# shell script invoked with the following arguments 
# $(CXX) $(CXX_DEFINES) $(CXX_FLAGS) -o OBJECT_FILE -c SOURCE_FILE 

# extract parameters 
SOURCE_FILE="${@: -1:1}" 
OBJECT_FILE="${@: -3:1}" 
COMPILER_AND_FLAGS=${@:1:$#-4} 

# make source file path relative to project source dir 
SOURCE_FILE_RELATIVE="${SOURCE_FILE:${#PROJECT_SOURCE_DIR} + 1}" 

# make object file path absolute 
OBJECT_FILE_ABSOLUTE="$PROJECT_BINARY_DIR/$OBJECT_FILE" 

cd "$PROJECT_SOURCE_DIR" 

# invoke compiler 
exec $COMPILER_AND_FLAGS -c "${SOURCE_FILE_RELATIVE}" -o "${OBJECT_FILE_ABSOLUTE}" 

Các kịch bản shell sử dụng thông tin từ các biến PROJECT_BINARY_DIRPROJECT_SOURCE_DIR để chuyển đổi đường dẫn của tệp nguồn thành đường dẫn liên quan đến gốc của dự án và đường dẫn của tệp đối tượng đến đường dẫn tuyệt đối. Bởi vì gcc được thông qua một đường dẫn tương đối dự án bây giờ, .debug_str cũng nên sử dụng đường dẫn đó.

Các chú ý sau đây được áp dụng:

  • Hãy chắc chắn để thiết lập các bit thực thi của gcc_debug_fix.sh.in.
  • Để tập lệnh hoạt động CMAKE_USE_RELATIVE_PATHS phải đặt lại thành OFF.
  • Kịch bản tạo ra các giả định về vị trí của đường dẫn tệp trên dòng lệnh. Điều này có thể không hoạt động nếu CMake sử dụng một quy tắc khác để gọi trình biên dịch. Một giải pháp mạnh mẽ hơn là quét các đối số tập lệnh cho các cờ -o-c.
+0

Cảm ơn bạn đã có câu trả lời tuyệt vời! – drdaeman

1

Nếu tôi thực sự không thể sửa tệp/công cụ để thực hiện việc này đúng cách, tôi sẽ viết tập lệnh trình bao cho gcc nhận ra tên đường dẫn tuyệt đối và chuyển đổi thành tên tương đối.

Nó có thể trông giống như thế này trong bash:

#!/bin/bash 

out=() 
for arg; do 
    out=("${out[@]}" $(echo "$arg" | sed 's:/my/absolute/directory/:../:')) 
done 

exec gcc "${out[@]}" 

Nếu thư mục nguồn của bạn có thư mục con thì bạn sẽ cần phải xử lý những cẩn thận, nhưng ở trên nên làm việc cho một thư mục nguồn bằng phẳng. Tôi đã không thử nghiệm nó mặc dù, và tôi sẽ không ngạc nhiên nếu tôi đã có những trích dẫn sai, nhưng đó sẽ chỉ là một vấn đề nếu bạn có tên đường dẫn với không gian in Nó cũng không xử lý các thông số như -I/whatever/include, nhưng bạn có thể khắc phục điều đó.

10

Bạn có thể sử dụng cờ -fdebug-prefix-map để remap đường dẫn thông tin gỡ lỗi. Ví dụ: để tạo các đường dẫn liên quan đến vị trí xây dựng sử dụng: -fdebug-prefix-map =/full/build/path =.

Các vấn đề liên quan