build - cmake-मूल रूप से संकलित करें और समान कोड को क्रॉसकॉम्प करें



cross-compiling ninja (1)

हम एक एम्बेडेड एआरएम / लिनक्स डिवाइस के लिए एक आवेदन पत्र लिख रहे हैं। डेवलपमेंट विंडोज पीसी पर किया जाता है, क्रॉसकंपलर, एक्लिप्स और निन्जा का उपयोग कर। सीएमके वर्तमान में बिल्ड स्क्रिप्ट बना सकता है जो इच्छित उद्देश्य के लिए अच्छी तरह से काम करता है

हमारे पास इकाई परीक्षण हैं जो नेट से जुड़ी एम्बेडेड डिवाइस पर चलते हैं, एक बार जब परियोजना को सर्वर पर (git पर) धकेल दिया जाता है

हम यूनिट परीक्षणों को लागू करने की कोशिश कर रहे हैं, जो कि पीसी पर चलेंगे, इससे पहले कि हम डिवाइस पर कोशिश करें। इसका अर्थ मूल रूप से बिल्डिंग, मिनग डब्ल्यू जीसीसी का उपयोग करना - निश्चित तौर पर हम पीसी पर एआरएम लिनक्स एक्जीक्यूटेबल लॉन्च नहीं कर सकते।

यहां तक ​​कि अगर हम टूलकेन को स्विच करते हैं, तो निमंत्रण के लिए नियमसेट को पुनर्निर्माण करने के लिए सेमीकॉम लॉन्च करना या दो निर्माण निर्देशिकाएं, पीसी के लिए एक, एआरएम के लिए एक, समस्या यह बनी हुई है कि CMake एक परीक्षण निष्पादन योग्य चलाने की कोशिश करेगा, और बाद में निर्माण, यूनिट परीक्षणों के दौरान एआरएम बिल्ड पर प्रयास किया जाएगा

पीसी पर क्रॉसकोम्प्लेड लोगों को चलाने का प्रयास न करने के लिए - कैसे हम दोनों को बनाने के लिए (सेंक के माध्यम से) बिल्ड कॉन्फ़िगर कर सकते हैं?


मेरी टिप्पणियों को जवाब में बदलना

मेरी परियोजनाओं में एक समान सेटअप है (एक सिम्युलेटर, इकाई परीक्षण और लक्ष्य बाइनरी स्रोतों से निर्माण) और आप अपने दो उपयोग के मामलों को अलग करने के लिए CMAKE_CROSSCOMPILING जांच कर सकते हैं। बस डाल

if (NOT CMAKE_CROSSCOMPILING)
    ....
endif() 

विशेष आदेशों के आसपास चाल करना चाहिए

और आपको दो बाइनरी आउटपुट निर्देशिकाएं होने की आवश्यकता है। CMake एक उपकरण में टूलचें मिश्रण करने की अनुमति नहीं देता

लेकिन आपको दो आईडीई परियोजनाओं की आवश्यकता नहीं है। मेरी परियोजनाओं में:

  • मैंने सभी स्रोत जोड़ दिए हैं - पुस्तकालय / निष्पादन योग्य लक्ष्य में - "क्रॉस-कंपाइल केवल" फाइलें
    • मैं उन्हें पीसी के लिए "बिल्ड से बाहर रखा गया" के रूप में चिह्नित कर रहा हूँ केवल वेरिएंट
    • इसलिए सभी स्रोत एक आईडीई प्रोजेक्ट में दिखेंगे (उदाहरण के लिए कोड के माध्यम से खोज करने के लिए)
  • मैंने एक कस्टम लक्ष्य के रूप में क्रॉस-कंपाइलिंग कॉल जोड़ा है
    • मैंने इसे डिफ़ॉल्ट बिल्ड से हटा दिया है, लेकिन आप इसे अपने आईडीई से स्पष्ट रूप से शुरू कर सकते हैं
    • मेरे मामले में यह एक बाहरी स्क्रिप्ट है, लेकिन आप आवश्यक कॉल सीधे COMMAND पैरामीटर में भी कर सकते हैं
    • आप क्रॉस-कंपाइलिंग के लिए अपनी खुद की प्रोजेक्ट को शामिल करने के लिए एक और ExternalProject_Add() का उपयोग भी कर सकते हैं

इस तरह के दृष्टिकोण के लिए कुछ कोड स्निपेट हैं:

if (NOT CMAKE_CROSSCOMPILING)
    set(PC "ON" CACHE INTERNAL "hw-platform PC")
    unset(MCU CACHE)
else()
    set(MCU "ON" CACHE INTERNAL "hw-platform MCU")
    unset(PC CACHE)
endif()

...

if (PC)
    # Exclude files that only compile/work on MCU
    set_source_files_properties(... PROPERTIES HEADER_FILE_ONLY 1)
endif()

...

if (PC)
    add_test(...)
endif()

...

if (PC AND EXISTS "${CMAKE_SOURCE_DIR}/buildMcu.cmd")
    add_custom_target(
        BUILD_MCU 
        COMMAND buildMcu.cmd 
        WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
    )
    set_target_properties(BUILD_MCU PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD 1)
endif()

संदर्भ





ninja