cmake - सीएमके को बिल्ड आर्किटेक्चर कंपाइलर का उपयोग करने का निर्देश कैसे दें



cross-compiling (1)

क्रॉस कंपाइलिंग के लिए CMAKE_TOOLCHAIN_FILE का उपयोग करते समय, आमतौर पर एक CMAKE_TOOLCHAIN_FILE फ़ाइल को CMAKE_TOOLCHAIN_FILE विकल्प के माध्यम से निर्दिष्ट किया CMAKE_TOOLCHAIN_FILE है। GNU शब्दावली में , कोई इस फ़ाइल का उपयोग करके होस्ट आर्किटेक्चर टूलसेट निर्दिष्ट कर सकता है। हालांकि, एक आम तौर पर इस टूलकिन के साथ निर्मित कुछ भी निष्पादित करने में सक्षम होने की उम्मीद नहीं कर सकता है। तो अक्सर पर्याप्त, कुछ बिल्ड टूल को बिल्ड आर्किटेक्चर के लिए संकलित करने की आवश्यकता होती है।

निम्नलिखित सेटअप पर विचार करें। मेरे पास दो स्रोत फाइलें हैं genfoo.c और genfoo.c निर्माण के दौरान, genfoo.c को संकलित करने और चलाने की आवश्यकता होती है। इसके आउटपुट को foo.h लिखा जाना foo.h । फिर मैं bar.c को संकलित कर सकता हूं, जो कि #include "foo.h" । चूंकि CMake होस्ट आर्किटेक्चर टूलचैन का उपयोग करने में चूक करता है, इसलिए bar.c लिए निर्देश आसान हैं। लेकिन मैं इसे genfoo.c को संकलित करने के लिए बिल्ड आर्किटेक्चर genfoo.c का उपयोग कैसे करूं? केवल यह कहते हुए कि add_executable(genfoo genfoo.c) गलत कंपाइलर का उपयोग करेगा।


CMake एक समय में केवल एक कंपाइलर को संभाल सकता है। इसलिए - यदि आप दूसरे संकलक को एक नई भाषा के रूप में स्थापित करने के लिए लंबा रास्ता तय नहीं करते हैं - तो आप दो कॉन्फ़िगरेशन चक्रों के साथ समाप्त हो जाएंगे।

मैं इस प्रक्रिया को स्वचालित करने के लिए निम्नलिखित दृष्टिकोण देखता हूं:

  1. उदाहरण लेते हुए "सीमेक क्रॉस संकलन - निर्माण के दौरान निर्मित निष्पादन में उपयोग करना?" एक शुरुआती बिंदु के रूप में सीएमके पृष्ठों से मुझे मिलेगा:

    CMakeLists.txt

    cmake_minimum_required(VERSION 3.0)
    project(FooBarTest)
    
    # When crosscompiling import the executable targets
    if (CMAKE_CROSSCOMPILING)
        set(IMPORT_PATH "IMPORTFILE-NOTFOUND" CACHE FILEPATH "Point it to the export file path from a native build")
        file(TO_CMAKE_PATH "${IMPORT_PATH}" IMPORT_PATH_CMAKE)
        include(${IMPORT_PATH_CMAKE}/genfooTargets.cmake)
    
        # Then use the target name as COMMAND, CMake >= 2.6 knows how to handle this
        add_custom_command(
            OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/foo.h
            COMMAND genfoo
        )
    
        add_executable(bar bar.cpp ${CMAKE_CURRENT_BINARY_DIR}/foo.h)
        target_include_directories(bar PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
    endif()
    
    # Only build the generator if not crosscompiling
    if (NOT CMAKE_CROSSCOMPILING)
        add_executable(genfoo genfoo.cpp)
        export(TARGETS genfoo FILE "${CMAKE_CURRENT_BINARY_DIR}/genfooTargets.cmake")
    endif()
    

    फिर जैसे स्क्रिप्ट का उपयोग करना:

    build.sh

    #!/bin/bash
    
    if [ ! -d hostBuild ]; then
        cmake -E make_directory hostBuild
        cmake -E chdir hostBuild cmake ..
    fi
    cmake --build hostBuild
    
    if [ ! -d crossBuild ]; then
        cmake -E make_directory crossBuild
        cmake -E chdir crossBuild cmake .. -DIMPORT_PATH=${PWD}/hostBuild -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake
    fi
    cmake --build crossBuild
    

    मुझे कॉल करके वांछित परिणाम ./build.sh

  2. CMakeLists.txt विभाजित करना और हो सकता है कि export() प्रतिस्थापित भी करें export() / include() कुछ ऐसा है जहाँ मैं अपने बिल्ड टूल के आउटपुट पथ को जानता हूँ जैसे कि CMAKE_RUNTIME_OUTPUT_DIRECTORY का उपयोग करके CMAKE_RUNTIME_OUTPUT_DIRECTORY को सरल CMAKE_RUNTIME_OUTPUT_DIRECTORY जाएगा:

    CMakeLists.txt

    cmake_minimum_required(VERSION 3.0)
    project(FooBarTest)
    
    # Then use the target name as COMMAND. CMake >= 2.6 knows how to handle this
    add_custom_command(
        OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/foo.h
        COMMAND genfoo
    )
    
    add_executable(bar bar.cpp ${CMAKE_CURRENT_BINARY_DIR}/foo.h)
    target_include_directories(bar PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
    

    buildTools / CMakeLists.txt

    cmake_minimum_required(VERSION 3.0)
    project(BuildTools)
    
    add_executable(genfoo genfoo.cpp)
    

    build.sh

    #!/bin/bash
    
    if [ ! -d crossBuild ]; then
        cmake -E make_directory crossBuild
        cmake -E chdir crossBuild cmake .. -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake
    fi
    if [ ! -d hostBuild ]; then
        cmake -E make_directory hostBuild
        cmake -E chdir hostBuild cmake ../buildTools -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:PATH=${PWD}/crossBuild
    fi
    cmake --build hostBuild
    cmake --build crossBuild
    

संदर्भ





cross-compiling