लक्ष्य मैं कई लक्ष्यों को परिभाषित करना चाहता हूं:
- एमएसएन बनाएं: मेमोरी सैनिटाइजर के साथ कोड को संकलित करें
- 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)
क्या सीएमके साथ ऐसा करना संभव है?
2 जवाब
हां, लेकिन कई बिल्ड निर्देशिकाओं का उपयोग करें:
- प्रति कॉन्फ़िगरेशन एक बिल्ड निर्देशिका बनाएँ।
- अपनी बिल्ड निर्देशिकाओं में अपनी परियोजना को उन मापदंडों के साथ कॉन्फ़िगर करें जिनकी आपको आवश्यकता है। जैसे
cmake -DCMAKE_COMPILER=clang -DCMAKE_C_FLAGS="-fsanitize=thread" ..
या आपके प्रश्न से सामान। - यदि आप निर्माण निर्देशिका को स्विच करते हैं, तो आपने अपना सेटअप बदल दिया।
इसका तात्पर्य आउट-ऑफ-सोर्स बिल्डिंग्स से है, जिन्हें सीएमके द्वारा वैसे भी प्रोत्साहित किया जाता है।
मेरा मानना है कि आपको 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)
नए सवाल
cmake
CMake एक क्रॉस-प्लेटफॉर्म, ओपन-सोर्स बिल्ड सिस्टम जनरेटर है। यह कई एकीकृत विकास परिवेशों के लिए देशी मेकफाइल्स, निंजा-बिल्ड और प्रोजेक्ट फ़ाइलों की तरह बिल्ड सिस्टम के लिए फाइलें उत्पन्न करता है।