लक्ष्य मैं कई लक्ष्यों को परिभाषित करना चाहता हूं:

  • एमएसएन बनाएं: मेमोरी सैनिटाइजर के साथ कोड को संकलित करें
  • tsan बनाना: कोड को थ्रेड सेनिटाइज़र के साथ संकलित करता है
  • make: कोड को gcc के साथ संकलित करता है

और आसानी से उनके बीच स्विच करने में सक्षम हो। उदाहरण के लिए, मैं नहीं चाहता कि हर बार जब मैं अपनी सभी वस्तुओं का पुनर्निर्माण करूं, (मुझे यह पहली बार करना होगा, लेकिन बाद में अगर मैं किसी फ़ाइल को संशोधित करता हूं और मैं करता हूं और फिर आसन करता हूं तो केवल इस फाइल को फिर से जमा करना चाहिए प्रत्येक लक्ष्य के लिए)

मैंने अब तक क्या किया है

मैं इन लक्ष्यों को बनाने में कामयाब रहा हूं और रूट डायरेक्टरी से, लेकिन हर बार मुझे एक मेक क्लीन और रीकैपाइल करना पड़ता है।

option(CLANG_MSAN "Enable Clang memory sanitizer" OFF)
if (CLANG_MSAN)
    set (CMAKE_CXX_FLAGS "-g -fsanitize=address -fno-omit-frame-pointer")
endif()

add_custom_target(asan
    COMMAND ${CMAKE_COMMAND}
    -DCLANG_MSAN=ON
    -DCMAKE_CXX_COMPILER=clang++
    -DCMAKE_C_COMPILER=clang)

क्या सीएमके साथ ऐसा करना संभव है?

3
moeryn 19 नवम्बर 2015, 12:27

2 जवाब

सबसे बढ़िया उत्तर

हां, लेकिन कई बिल्ड निर्देशिकाओं का उपयोग करें:

  • प्रति कॉन्फ़िगरेशन एक बिल्ड निर्देशिका बनाएँ।
  • अपनी बिल्ड निर्देशिकाओं में अपनी परियोजना को उन मापदंडों के साथ कॉन्फ़िगर करें जिनकी आपको आवश्यकता है। जैसे cmake -DCMAKE_COMPILER=clang -DCMAKE_C_FLAGS="-fsanitize=thread" .. या आपके प्रश्न से सामान।
  • यदि आप निर्माण निर्देशिका को स्विच करते हैं, तो आपने अपना सेटअप बदल दिया।

इसका तात्पर्य आउट-ऑफ-सोर्स बिल्डिंग्स से है, जिन्हें सीएमके द्वारा वैसे भी प्रोत्साहित किया जाता है।

6
usr1234567 19 नवम्बर 2015, 11:51

मेरा मानना है कि आपको ExternalProject मॉड्यूल के साथ इसे प्राप्त करने में सक्षम होना चाहिए । आप तीन बाहरी परियोजनाओं को जोड़ सकते हैं, एक msan के लिए, एक tsan के लिए, और एक बुनियादी GCC निर्माण के लिए। दो सैनिटाइटर बिल्ड को EXCLUDE_FROM_ALL 1 के रूप में चिह्नित किया जाएगा।

तीनों के लिए CMakeLists include() के माध्यम से साझा कर सकते हैं।

कुछ इस तरह:

रूट CMakeLists.txt

ExternalProject_Add(msan
  EXCLUDE_FROM_ALL 1
  SOURCE_DIR msan
  CMAKE_GENERATOR ...
)

ExternalProject_Add(tsan
  EXCLUDE_FROM_ALL 1
  SOURCE_DIR tsan
  CMAKE_GENERATOR ...
)

ExternalProject_Add(normal
  SOURCE_DIR src
  CMAKE_GENERATOR ...
)

src / CMakeLists.txt

include(common.cmake)

src / common.cmake

# Normal CMake code for your project
add_library(...)

msan / CMakeLists.txt

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -fsanitize=address -fno-omit-frame-pointer")

include(../src/common.cmake)
1
Angew is no longer proud of SO 19 नवम्बर 2015, 09:41