2016-03-23 9 views
11

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

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

+0

आप के रूप में कहा, जीएनयू शब्दावली में आप होस्ट आर्किटेक्चर निर्दिष्ट करने के लिए 'कॉन्फ़िगरेशन' कमांड का उपयोग करेंगे। और यदि आप दो अलग-अलग होस्ट वातावरण के लिए बनाना चाहते हैं तो आपको दो बार 'कॉन्फ़िगरेशन' चलाना होगा। तो मुझे सीएमके के साथ दो संभावनाएं दिखाई देती हैं: एक निर्माण स्क्रिप्ट का उपयोग करें जो आवश्यक दो वातावरण बनाता है और निष्पादित करता है (देखें [यहां] (http://stackoverflow.com/questions/30999130/cmake-build-multiple-targets-in- अलग- बिल्ड-निर्देशिका)) या [ExternalProject_Add()] (https://cmake.org/cmake/help/v3.2/module/ExternalProject.html) का उपयोग करें और अपने 'CMakeLists.txt' को समर्पित उपप्रोजेक्ट में विभाजित करें। – Florian

+0

नहीं, autotools के साथ आप बस 'CC_FOR_BUILD' का उपयोग करते हैं। 'Ax_cc_for_build' देखें। – Helmut

+0

ठीक है, उसे नहीं पता था। अगर मैं सही ढंग से समझता हूं तो हम [सीएमके क्रॉस कंपाइलिंग - निर्माण के दौरान बनाए गए निर्माण में निष्पादन योग्य का उपयोग करके वर्णित उपयोग के मामले के बारे में बात कर रहे हैं] (https://cmake.org/Wiki/CMake_Cross_Compiling#Using_executables_in_the_build_created_during_the_build)? – Florian

उत्तर

7

एक जवाब

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

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

  1. एक प्रारंभिक बिंदु के रूप CMake पन्नों से उदाहरण "CMake Cross Compiling - Using executables in the build created during the build?" ले रहा है मैं मिल जाएगा:

    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()/include() मैं कहाँ के उत्पादन में पथ पता की जगह मेरी निर्माण उपकरण उदाहरण के लिए 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) 
    

    निर्माण।श

    #!/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 
    

संदर्भ

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

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