2012-03-07 24 views
11

परियोजना मैं संकलन CMake, जो loves absolute pathnames का उपयोग करता हूँ में रिश्तेदार फ़ाइल नाम डाल दिया।मेक जीसीसी डिबग जानकारी

जब मैं डिबगिंग जानकारी सक्षम करता हूं, तो gcc उन लंबे नामों को .debug_str अनुभागों में रखता है, जो डिबगिंग के लिए खराब है। मैं इसके बजाय वहां छोटे सापेक्ष-से-प्रोजेक्ट-रूट पथनाम रखना चाहता हूं।

वहाँ डीबग डेटा उत्सर्जन से पहले पथ नाम का कुछ हिस्सा पट्टी जीसीसी बताने के लिए कुछ विकल्प है? या, शायद, कुछ उपकरण है जो संकलित बाइनरी पर ऐसा कर सकता है?

मैंने SET(CMAKE_USE_RELATIVE_PATHS ON) (जो frowned upon देवताओं द्वारा उपयोग किया जाता है) का उपयोग करने का प्रयास किया है, लेकिन जैसा कि मैं आउट-ऑफ-सोर्स बिल्ड का उपयोग कर रहा हूं, पथनाम अभी भी उस रूप में नहीं हैं, जिसे मैं चाहता हूं। अर्थात। वे mod_foo/foo.c के बजाय ./../src/mod_foo/foo.c हैं।

+1

'./../ src/mod_foo/foo.c' एक ** सापेक्ष ** पथ है ... –

+0

हाँ, लेकिन प्रोजेक्ट रूट * के सापेक्ष * नहीं, हालांकि (जो' ./ है ../ src') – drdaeman

+0

आपके पास सीएमके के साथ समस्या है, जीसीसी के साथ नहीं। जीसीसी'debug_str' में डालता है ठीक है कि यह कमांड लाइन तर्क के रूप में मिलता है। – sirgeorge

उत्तर

5

आप CMake एक खोल स्क्रिप्ट जो जीसीसी लागू करने से पहले एक परियोजना रिश्तेदार पथ के लिए स्रोत फ़ाइल पथ बदल देती आह्वान करने के लिए एक CMake लक्ष्य की RULE_LAUNCH_COMPILE गुण सेट कर सकते हैं। अपनी परियोजना के PROJECT_SOURCE_DIR और PROJECT_BINARY_DIR के बारे में एक शेल स्क्रिप्ट उत्पन्न करने के लिए सीएमके फ़ंक्शन configure_file का उपयोग करें।

अपने सबसे बाहरी CMakeLists.txt जोड़ने के लिए निम्न कोड में:

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") 

निम्नलिखित टेम्पलेट खोल स्क्रिप्ट gcc_debug_fix.sh.in 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}" 

खोल स्क्रिप्ट का उपयोग करता है स्रोत फ़ाइल के पथ को प्रोजेक्ट रूट के सापेक्ष पथ और ऑब्जेक्ट फ़ाइल के पथ को पूर्ण पथ पर बदलने के लिए चर PROJECT_BINARY_DIR और PROJECT_SOURCE_DIR से जानकारी। चूंकि जीसीसी अब एक परियोजना सापेक्ष पथ पारित कर देता है, .debug_str भी उस पथ का उपयोग करना चाहिए।

निम्न चेतावनियां लागू होते हैं:

  • gcc_debug_fix.sh.in के निष्पादन योग्य बिट सेट करने के लिए सुनिश्चित करें।
  • स्क्रिप्ट के लिए CMAKE_USE_RELATIVE_PATHS को OFF पर सेट करना होगा।
  • स्क्रिप्ट कमांड लाइन पर फ़ाइल पथ के स्थान के बारे में धारणा बनाता है। यह काम नहीं कर सकता अगर सीएमके संकलक का आह्वान करने के लिए एक अलग नियम का उपयोग करता है। -o और -c झंडे के लिए स्क्रिप्ट तर्कों को स्कैन करना एक और मजबूत समाधान होगा।
+0

भयानक उत्तर के लिए धन्यवाद! – drdaeman

1

मैं वास्तव में इस को ठीक से करने के लिए कर फ़ाइल/उपकरण को ठीक नहीं कर सकता है, मुझे लगता है कि निरपेक्ष pathnames पहचानता है और रिश्तेदार वालों के लिए तो धर्मान्तरित जीसीसी के लिए एक आवरण स्क्रिप्ट लिखने होगा।

यह बैश में कुछ इस तरह दिख सकता है:

#!/bin/bash 

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

exec gcc "${out[@]}" 

अपने स्रोत निर्देशिका उपनिर्देशिका है तो आप उन ध्यान से प्रबंधित करना होगा, लेकिन इसके बाद के संस्करण एक फ्लैट स्रोत निर्देशिका के लिए काम करना चाहिए। मैंने इसका परीक्षण नहीं किया है, और अगर मुझे उद्धरण गलत हो गया है, तो मुझे आश्चर्य नहीं होगा, लेकिन यदि आपके पास रिक्त स्थान के साथ पथनाम हैं तो यह केवल एक समस्या होगी। यह -I/whatever/include जैसे पैरामीटर को भी संभाल नहीं पाता है, लेकिन आप इसे ठीक कर सकते हैं।

10

आप डिबगिंग जानकारी रास्तों को पुन: मैप करने के लिए -fdebug-उपसर्ग मानचित्र का उपयोग कर सकते झंडा। उदाहरण के लिए, निर्माण स्थान के सापेक्ष पथ बनाने के लिए: -fdebug-prefix-map =/full/build/path =।

संबंधित मुद्दे