2017-02-15 4 views
5
$ python gencpp.py 

यह आदेश कार्यशील निर्देशिका में एक cpp फ़ाइल foo.cpp उत्पन्न करता है उत्पन्न।उपयोग एक Bazel में कोड का निर्माण

मैं foo.cppcc_binary में की srcs विशेषता शामिल करने के लिए सक्षम होने के लिए निर्माण से पहले bazel में इस आदेश को चलाना चाहते हैं।

मैं क्या कोशिश की है:

genrule(
    name = 'foo', 
    outs = ['foo.cpp'], 
    cmd = 'python gencpp.py', 
) 

cc_library(
    srcs = ['foo.cpp'], # tried also with :foo 
    ... 
) 

घोषित उत्पादन 'बाहरी/somelib/foo.cpp' genrule द्वारा नहीं बनाया गया। ऐसा शायद इसलिए है क्योंकि वास्तविकता ने वास्तव में इस आउटपुट को नहीं बनाया है, या क्योंकि आउटपुट एक निर्देशिका थी और जनरेट दूरस्थ रूप से चलाया गया था (ध्यान दें कि केवल घोषित फ़ाइल आउटपुट की सामग्री को दूरस्थ रूप से चलाए गए जीनरल से कॉपी किया गया है)।

मुझे पता है कि एक समाधान है जिसके लिए gencpp.py को थोड़ा संशोधित करने की आवश्यकता है, लेकिन यह वह नहीं है जिसे मैं ढूंढ रहा हूं।

+0

मुझे काफी समान समस्या थी [स्टैक ओवरफ्लो/बेज़ेल-स्वचालित रूप से जेनरेट-सीपीपी-एचपीपी-फाइल] (https://stackoverflow.com/questions/44312549/bazel-automatically-generated-cpp-hpp-files)। दिए गए उत्तर यहां दिए गए लोगों को पूरा कर सकते हैं। –

उत्तर

4

the answer के लिए @ क्रिस्टीना का धन्यवाद।

मुझे इसे उत्पन्न होने के बाद foo.cppouts निर्देशिका की प्रतिलिपि बनाना है।

genrule(
    name = 'foo', 
    outs = ['foo.cpp'], 
    cmd = """ 
      python gencpp.py 
      cp foo.cpp [email protected] 
    """, 

) 
+0

कॉपी चाल भी मेरे लिए काम करती है।सावधान रहें कि जब आपके पास कई बहिष्कार होते हैं (मेरी स्क्रिप्ट सी ++ कोड, एक एचपीपी फ़ाइल और एक सीपीपी फ़ाइल उत्पन्न करती है) तो आपको इसका उपयोग करना होगा: cp file.hpp $ (@ D); सीपी file.cpp $ (@ डी); –

2

यह आदेश कार्यशील निर्देशिका में एक cpp फ़ाइल foo.cpp उत्पन्न करता है।

मुझे लगता है कि अगर आप इसे परिवर्तित, की सिफारिश करेंगे ताकि या तो:

  • आप एक आदेश-पंक्ति ध्वज
  • आप मानक आउटपुट में उत्पादन लिखना द्वारा निर्दिष्ट किसी फ़ाइल के लिए उत्पादन में लिखें।

    python gencpp.py [email protected] 
    

    या

    python gencpp.py > [email protected] 
    

    क्रमश:

फिर अपने genrule आदेश या तो हो सकता है।

Ulf Adams के रूप में बताते हैं:

Bazel समानांतर में अनेक कार्रवाइयों को चलाता है, और अगर एक ही नियम के रूप में अच्छी तरह से एक एप्लिकेशन के रूप में एक उपकरण का एक निर्भरता है, यह एक ही समय में दोनों को चलाने के लिए कोशिश कर सकते हैं , और वे संभावित रूप से बहुत खराब परिणामों के साथ एक दूसरे को ओवरराइट करेंगे।

तो, आउटपुट फ़ाइलों को लिखना जो बेज़ल सीधे नहीं जानते हैं, सबसे अच्छा बचा है।

+1

यह वास्तव में बदतर है। बैज़ेल समानांतर में कई क्रियाएं चलाता है, और यदि एक ही नियम एक उपकरण के साथ-साथ एक ऐप की निर्भरता है, तो यह एक ही समय में दोनों को चलाने की कोशिश कर सकता है, और वे संभावित रूप से बहुत खराब परिणामों के साथ एक दूसरे को ओवरराइट करेंगे। (हालांकि सैंडबॉक्सिंग सक्षम नहीं है।) –

+0

@UlfAdams "यह वास्तव में बदतर है" जैसा कि "मेरा सुझाव खराब है", या जैसा कि "लिखने और प्रतिलिपि के परिणाम मेरे सुझाव से भी बदतर हैं"? बाद में –

+0

। वर्तमान निर्देशिका को लिखने के परिणाम और फिर गंतव्य पर प्रतिलिपि बनाने या स्थानांतरित करने के परिणाम चुप टूटने का कारण बन सकते हैं। –

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