2015-07-23 4 views
5

मेरे पास रूट में एक CMakeLists.txt फ़ाइलों के साथ एक प्रोजेक्ट है और प्रोजेक्ट लिनक्स और ओएसएक्स पर ठीक है। अब मैं इसे एमआईपीएस ओपनडब्लूआरटी के लिए संकलित करना चाहता हूं। मैं इसे के रूप में ज्यादा संभव के रूप में स्वचालित करने के लिए चाहते हैं, तो मैं और toolchain डाउनलोड करने के लिए कोड निम्न का उपयोग कम्पाइलर वेरिएबल सेट होगा:अलग फ़ाइल से सेमेक में क्रॉस संकलन के लिए टूलचैन कैसे डाउनलोड करें?

ExternalProject_Add(ar71xx-toolchain 
    PREFIX "${PROJECT_BINARY_DIR}/external/openwrt" 
    URL "http://downloads.openwrt.org/barrier_breaker/14.07/ar71xx/generic/OpenWrt-Toolchain-ar71xx-for-mips_34kc-gcc-4.8-linaro_uClibc-0.9.33.2.tar.bz2" 
    UPDATE_COMMAND "" 
    PATCH_COMMAND "" 
    BUILD_COMMAND "" 
    CONFIGURE_COMMAND "" 
    INSTALL_COMMAND "" 
) 
ExternalProject_Get_Property(ar71xx-toolchain SOURCE_DIR) 
SET(CMAKE_C_COMPILER ${SOURCE_DIR}/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mips-openwrt-linux-gcc) 
SET(CMAKE_CXX_COMPILER ${SOURCE_DIR}/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mips-openwrt-linux-g++) 
SET(CMAKE_STRIP ${SOURCE_DIR}/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mips-openwrt-linux-strip) 

मैंने सोचा था कि मैं इसे एक अलग toolchain फ़ाइल में डाल दिया और इसे पारित कर सकते हैं -DCMAKE_TOOLCHAIN_FILE के साथ, लेकिन ऐसा लगता है कि ExternalProject_Add टूलचैन फ़ाइल के अंदर निष्पादित नहीं किया गया है। मैं टूलमेन डाउनलोड चरण को मुख्य CMakeLists.txt में डालने से बचना चाहता हूं क्योंकि यह वास्तव में प्रोजेक्ट के लिए आवश्यक नहीं है और प्रत्येक लक्ष्य प्लेटफ़ॉर्म के लिए ऐसा करने की आवश्यकता होगी ... तो वैकल्पिक चरणों को परिभाषित करने का कोई तरीका है एक मौजूदा क्रॉस संकलन निर्माण और मुख्य परियोजना निर्माण से पहले इसे कमांड लाइन पैरामीटर निष्पादित करने के रूप में किसी भी तरह से पास?

अद्यतन: Tsyvarev के जवाब यह है कि toolchain फ़ाइल में मेरे लिए काम करता के आधार पर:

set(CMAKE_SYSTEM_NAME Linux) 
set(TOOLCHAIN_DIR ${PROJECT_BINARY_DIR}/external/openwrt/toolchain) 

if(NOT EXISTS ${TOOLCHAIN_DIR}) 
    file(DOWNLOAD http://downloads.openwrt.org/barrier_breaker/14.07/ar71xx/generic/OpenWrt-Toolchain-ar71xx-for-mips_34kc-gcc-4.8-linaro_uClibc-0.9.33.2.tar.bz2 ${TOOLCHAIN_DIR}/toolchain.tar.bz2 SHOW_PROGRESS) 
    execute_process(COMMAND tar --strip-components=2 -xjf ${TOOLCHAIN_DIR}/toolchain.tar.bz2 WORKING_DIRECTORY ${TOOLCHAIN_DIR}) 
    execute_process(COMMAND rm ${TOOLCHAIN_DIR}/toolchain.tar.bz2) 
endif() 

SET(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/bin/mips-openwrt-linux-gcc) 
SET(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/bin/mips-openwrt-linux-g++) 
SET(CMAKE_STRIP ${TOOLCHAIN_DIR}/bin/mips-openwrt-linux-strip) 
SET(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_DIR}) 
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) 
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) 
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) 

वहाँ एक मुद्दा जब ExternalProject_Add के साथ जोड़ा अन्य परियोजनाओं के लिए CMake पैरामीटर के रूप में -DCMAKE_TOOLCHAIN_FILE गुजर रहा है। अपने स्वयं के $ {PROJECT_BINARY_DIR} की वजह से यह टूलचैन फिर से डाउनलोड करेगा। लेकिन इस एक और समस्या है ...

+0

मेरे लिए यह आपके मुख्य CMakeLists.txt खेलने में आने से पहले टूलचैन से संबंधित मशीनरी को उस स्क्रिप्ट पर ले जाने के लिए एक क्लीनर दृष्टिकोण होगा जो निर्माण को नियंत्रित करता है। –

+0

आप सही हैं, लेकिन मैं चाहता हूं कि उपयोगकर्ता "cmake -DCMAKE_TOOLCHAIN_FILE = ../प्लेटफॉर्म/openwrt_ar71xx/mips.toolchain.cmake .." बिल्ड निर्देशिका से "cmake .." के बजाय "क्रॉस संकलन करने का निर्णय लेता है उसे एक और cmake फ़ाइल बनाने के तरीके के बारे में बताने के बजाय ... – Gamadril

उत्तर

3

ExternalProject_add पर निर्माण समय सभी चरणों को निष्पादित करता है, विन्यास समय में नहीं।

डाउनलोड फ़ाइल के लिए आप file(DOWNLOAD ...) कमांड का उपयोग कर सकते हैं। Arhive से फ़ाइलों को निकालने के लिए उचित आदेश के साथ execute_process का उपयोग करें।

+0

वह टूलचैन फ़ाइल में काम करता है। – Gamadril

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