ctx.actions
का इस्तेमाल करके इस मॉड्यूल को ऐक्सेस करें.
सदस्य
- आर्ग
- declare_directory
- declare_file
- declare_symlink
- do_nothing
- expand_template
- रन
- run_shell
- सिमलिंक
- template_dict
- लिखें
आर्ग्युमेंट
Args actions.args()
declare_directory
File actions.declare_directory(filename, *, sibling=None)
Args.add_all()
की मदद से, ऐक्शन कमांड में बड़ा किया जा सकता है.
पैरामीटर
पैरामीटर | ब्यौरा |
---|---|
filename
|
ज़रूरी है अगर कोई 'सिबलिंग' नहीं है दिया गया, मौजूदा पैकेज से जुड़ी नई डायरेक्ट्री का पाथ. ऐसा न होने पर, फ़ाइल का बेस नाम ('सिबलिंग', डायरेक्ट्री के बारे में बताता है). |
sibling
|
File; or None ;
डिफ़ॉल्ट = कोई नहींऐसी फ़ाइल जो उसी डायरेक्ट्री में मौजूद है जिसमें अभी नई डायरेक्ट्री का एलान किया गया है. फ़ाइल मौजूदा पैकेज में होनी चाहिए. |
declare_file
File actions.declare_file(filename, *, sibling=None)
sibling
तय नहीं किया गया है, तो फ़ाइल का नाम पैकेज डायरेक्ट्री के हिसाब से होगा. अगर ऐसा नहीं है, तो फ़ाइल उसी डायरेक्ट्री में sibling
की गई होगी. फ़ाइलों को मौजूदा पैकेज के बाहर नहीं बनाया जा सकता.याद रखें कि किसी फ़ाइल के बारे में जानकारी देने के अलावा, आपको अलग से ऐसी कार्रवाई बनानी होगी जिससे फ़ाइल में कार्बन का उत्सर्जन होता हो. इस कार्रवाई को करने के लिए, लौटाए गए File
ऑब्जेक्ट को कार्रवाई के कंस्ट्रक्शन फ़ंक्शन में पास करना होगा.
ध्यान दें कि पहले से तय की गई आउटपुट फ़ाइलों का एलान, इस फ़ंक्शन का इस्तेमाल करके नहीं किया जा सकता. साथ ही, इनका एलान भी नहीं किया जा सकता. इसके बजाय, ctx.outputs
से उनके File
ऑब्जेक्ट हासिल किए जा सकते हैं. इस्तेमाल का उदाहरण देखें.
पैरामीटर
पैरामीटर | ब्यौरा |
---|---|
filename
|
ज़रूरी है अगर कोई 'सिबलिंग' नहीं है दिया गया, मौजूदा पैकेज से जुड़ी नई फ़ाइल का पाथ. ऐसा नहीं होने पर, किसी फ़ाइल का बेस नाम ('सिबलिंग', डायरेक्ट्री तय करता है). |
sibling
|
File; or None ;
डिफ़ॉल्ट = कोई नहींऐसी फ़ाइल जो उसी डायरेक्ट्री में मौजूद है जिसमें नई फ़ाइल बनाई गई है. फ़ाइल मौजूदा पैकेज में होनी चाहिए. |
declare_symlink
File actions.declare_symlink(filename, *, sibling=None)
प्रयोग के तौर पर. इस पैरामीटर को अभी आज़माया जा रहा है और इसमें किसी भी समय बदलाव किया जा सकता है. कृपया इस पर निर्भर न रहें. इसे --experimental_allow_unresolved_symlinks
सेट करके प्रयोग के तौर पर चालू किया जा सकता है
यह एलान करता है कि नियम या पहलू, मौजूदा पैकेज में दिए गए नाम के साथ सिमलिंक बनाता है. आपको इस सिमलिंक को जनरेट करने वाली कोई कार्रवाई बनानी होगी. Baज़ल, इस सिमलिंक को कभी नज़रअंदाज़ नहीं करेगा और इसे सैंडबॉक्स या रिमोट एक्ज़िक्यूटर के साथ शेयर करेगा.
पैरामीटर
पैरामीटर | ब्यौरा |
---|---|
filename
|
ज़रूरी है अगर कोई 'सिबलिंग' नहीं है दिया गया, नए सिमलिंक का पाथ, जो मौजूदा पैकेज से मिलता-जुलता हो. ऐसा न होने पर, फ़ाइल का बेस नाम ('सिबलिंग', डायरेक्ट्री के बारे में बताता है). |
sibling
|
File; or None ;
डिफ़ॉल्ट = कोई नहींऐसी फ़ाइल जो उसी डायरेक्ट्री में मौजूद है जिसमें नया सिमलिंक है. |
do_nothing
None actions.do_nothing(mnemonic, inputs=[])
पैरामीटर
पैरामीटर | ब्यौरा |
---|---|
mnemonic
|
ज़रूरी है कार्रवाई के बारे में एक शब्द में जानकारी, उदाहरण के लिए, CppCompile या GoLink. |
inputs
|
sequence of Files; or depset ;
डिफ़ॉल्ट = []कार्रवाई की इनपुट फ़ाइलों की सूची. |
expand_template
None actions.expand_template(template, output, substitutions={}, is_executable=False, computed_substitutions=unbound)
substitutions
डिक्शनरी का इस्तेमाल करके बदल दिया जाएगा. यह उसी क्रम में होगा जिस क्रम में बदलावों को तय किया गया है. जब भी टेंप्लेट में शब्दकोश की कोई कुंजी दिखती है (या पिछले बदलाव की वजह से), तो इसे संबंधित वैल्यू से बदल दिया जाता है. कुंजियों के लिए कोई खास सिंटैक्स नहीं है. उदाहरण के लिए, टकरावों से बचने के लिए, कर्ली ब्रैकेट इस्तेमाल किए जा सकते हैं. जैसे, {KEY}
. इस्तेमाल का उदाहरण देखें.
पैरामीटर
पैरामीटर | ब्यौरा |
---|---|
template
|
ज़रूरी है टेंप्लेट फ़ाइल, जो UTF-8 कोड में बदली गई टेक्स्ट फ़ाइल होती है. |
output
|
ज़रूरी है आउटपुट फ़ाइल, जो UTF-8 कोड में बदली गई टेक्स्ट फ़ाइल होती है. |
substitutions
|
default = {} टेंप्लेट को बड़ा करते समय किए जाने वाले विकल्प. |
is_executable
|
डिफ़ॉल्ट = गलत आउटपुट फ़ाइल एक्ज़ीक्यूटेबल होनी चाहिए या नहीं. |
computed_substitutions
|
TemplateDict ;
डिफ़ॉल्ट = अनबाउंडप्रयोग के तौर पर उपलब्ध. इस पैरामीटर को अभी आज़माया जा रहा है और इसमें किसी भी समय बदलाव किया जा सकता है. कृपया इस पर निर्भर न रहें. इसे --+experimental_lazy_template_expansion प्रयोग के तौर पर: ऐसे विकल्प को सेट करके प्रयोग के तौर पर चालू किया जा सकता है जिन्हें टेंप्लेट को बड़ा करते समय इस्तेमाल किया जाना चाहिए. |
रन
None actions.run(outputs, inputs=[], unused_inputs_list=None, executable, tools=unbound, arguments=[], mnemonic=None, progress_message=None, use_default_shell_env=False, env=None, execution_requirements=None, input_manifests=None, exec_group=None, shadowed_action=None, resource_set=None, toolchain=None)
पैरामीटर
पैरामीटर | ब्यौरा |
---|---|
outputs
|
sequence of Files ;
ज़रूरी हैकार्रवाई की आउटपुट फ़ाइलों की सूची. |
inputs
|
sequence of Files; or depset ;
डिफ़ॉल्ट = []कार्रवाई की इनपुट फ़ाइलों की सूची या सूची. |
unused_inputs_list
|
File; or None ;
डिफ़ॉल्ट = कोई नहींऐसी फ़ाइल जिसमें इनपुट की ऐसी सूची दी गई है जिसका इस्तेमाल ऐसी कार्रवाई के लिए नहीं किया गया है. इस फ़ाइल का कॉन्टेंट (आम तौर पर, कार्रवाई के आउटपुट में से एक) उन इनपुट फ़ाइलों की सूची के मुताबिक होता है जिनका इस्तेमाल पूरी कार्रवाई के दौरान नहीं किया गया था. उन फ़ाइलों में कोई भी बदलाव करने से, कार्रवाई के आउटपुट पर कोई असर नहीं पड़ना चाहिए. |
executable
|
File; or string; or FilesToRunProvider ;
ज़रूरी हैकार्रवाई से कॉल की जाने वाली एक्ज़ीक्यूटेबल फ़ाइल. |
tools
|
sequence; or depset ;
डिफ़ॉल्ट = अनबाउंडकार्रवाई के लिए ज़रूरी सभी टूल की सूची बनाएं या उन्हें हटाएं. टूल, अतिरिक्त रनफ़ाइल वाले इनपुट होते हैं, जो कार्रवाई के लिए अपने-आप उपलब्ध होते हैं. जब सूची दी जाती है, तब यह Files, FilesToRunProvider इंस्टेंस या Files के डिपार्टमेंट का एक विषम संग्रह हो सकता है. जो फ़ाइलें सीधे सूची में हैं और ctx.executable से आती हैं उनकी रनफ़ाइल अपने-आप जुड़ जाएंगी. जब डिप्सेट दिया जाता है, तो उसमें सिर्फ़ Files ही शामिल होना चाहिए. दोनों ही मामलों में, रनफ़ाइल के लिए ctx.executable के साथ डेपसेट में मौजूद फ़ाइलों की क्रॉस-रेफ़रंस नहीं की जाती है. |
arguments
|
sequence ;
डिफ़ॉल्ट = []कार्रवाई के कमांड लाइन आर्ग्युमेंट. यह स्ट्रिंग या actions.args() ऑब्जेक्ट की सूची होनी चाहिए.
|
mnemonic
|
string; or None ;
डिफ़ॉल्ट = कोई नहींकार्रवाई के बारे में एक शब्द में जानकारी, उदाहरण के लिए, CppCompile या GoLink. |
progress_message
|
string; or None ;
डिफ़ॉल्ट = कोई नहींबिल्ड के दौरान उपयोगकर्ता को प्रोग्रेस दिखाने वाला मैसेज. उदाहरण के लिए, "foo.cc को foo.o बनाने के लिए कंपाइल करना". मैसेज में %{label} , %{input} या %{output} पैटर्न हो सकते हैं. इन्हें लेबल स्ट्रिंग, पहले इनपुट या आउटपुट के पाथ से बदल दिया जाता है. स्टैटिक स्ट्रिंग के बजाय पैटर्न का इस्तेमाल करें, क्योंकि पहली स्ट्रिंग ज़्यादा असरदार होती हैं.
|
use_default_shell_env
|
डिफ़ॉल्ट = गलत कार्रवाई में पहले से मौजूद शेल एनवायरमेंट का इस्तेमाल होना चाहिए या नहीं. |
env
|
dict; or None ;
डिफ़ॉल्ट = कोई नहींएनवायरमेंट वैरिएबल की डिक्शनरी को सेट करता है. |
execution_requirements
|
dict; or None ;
डिफ़ॉल्ट = कोई नहींकार्रवाई शेड्यूल करने के बारे में जानकारी. काम की कुंजियों के लिए टैग देखें. |
input_manifests
|
sequence; or None ;
डिफ़ॉल्ट = कोई नहीं(प्रयोग के तौर पर) इनपुट रनफ़ाइल मेटाडेटा सेट करता है; आम तौर पर, ये रिज़ॉल्व_command से जनरेट होती हैं. |
exec_group
|
string; or None ;
डिफ़ॉल्ट = कोई नहींदिए गए exec ग्रुप के एक्ज़ीक्यूशन प्लैटफ़ॉर्म पर कार्रवाई करता है. अगर ऐसा नहीं होता है, तो टारगेट के डिफ़ॉल्ट एक्ज़ीक्यूशन प्लैटफ़ॉर्म का इस्तेमाल करता है. |
shadowed_action
|
Action ;
डिफ़ॉल्ट = कोई नहींशैडो की गई कार्रवाई के इनपुट और कार्रवाई की इनपुट सूची और एनवायरमेंट में जोड़े गए एनवायरमेंट का इस्तेमाल करके कार्रवाई चलाता है. कार्रवाई एनवायरमेंट, शैडो की गई किसी भी कार्रवाई के एनवायरमेंट वैरिएबल को ओवरराइट कर सकता है. अगर इनमें से कोई भी नहीं है, तो सिर्फ़ कार्रवाई के इनपुट और दिए गए एनवायरमेंट का इस्तेमाल किया जाता है. |
resource_set
|
callable; or None ;
डिफ़ॉल्ट = कोई नहींएक कॉलबैक फ़ंक्शन, जो संसाधन सेट डिक्शनरी दिखाता है. अगर इस कार्रवाई को स्थानीय तौर पर चलाया जाता है, तो संसाधन के इस्तेमाल का अनुमान लगाने के लिए इसका इस्तेमाल किया जाता है. फ़ंक्शन में दो पोज़िशनल आर्ग्युमेंट इस्तेमाल किए जा सकते हैं: ओएस का नाम (जैसे कि "osx") दिखाने वाली स्ट्रिंग और ऐक्शन के लिए इनपुट की संख्या दिखाने वाला पूर्णांक. लौटाए गए शब्दकोश में निम्न प्रविष्टियां हो सकती हैं, जिनमें से प्रत्येक फ़्लोट या पूर्णांक हो सकती है:
अगर यह पैरामीटर कॉलबैक टॉप-लेवल का होना चाहिए. लैम्डा और नेस्ट किए गए फ़ंक्शन की अनुमति नहीं है. |
toolchain
|
Label; or string; or None ;
डिफ़ॉल्ट = कोई नहींइस कार्रवाई में इस्तेमाल किए जाने वाले एक्ज़ीक्यूटेबल या टूल का टूलचेन टाइप. पैरामीटर को सेट करना ज़रूरी है, ताकि कार्रवाई सही प्लैटफ़ॉर्म पर पूरी हो सके. फ़िलहाल, इसमें कोई बदलाव नहीं किया जा सकता. हालांकि, हमारा सुझाव है कि जब किसी टूलचेन का इस्तेमाल किया जाए, तब इसे सेट कर लें. ऐसा इसलिए, क्योंकि आने वाले समय में Basel के रिलीज़ होने पर, इसकी ज़रूरत पड़ेगी. ध्यान दें कि यह कार्रवाई बनाने वाले नियम के लिए यह टूलचेन तय करना ज़रूरी है कि यह 'नियम()' के अंदर मौजूद हो फ़ंक्शन का इस्तेमाल करना होगा. जब `toolchain` और `exec_group`, दोनों पैरामीटर सेट होते हैं, तो `exec_group` का इस्तेमाल किया जाएगा. अगर `exec_group` के बारे में साफ़ तौर पर नहीं बताया गया है, तो कोई गड़बड़ी हुई है. |
run_shell
None actions.run_shell(outputs, inputs=[], tools=unbound, arguments=[], mnemonic=None, command, progress_message=None, use_default_shell_env=False, env=None, execution_requirements=None, input_manifests=None, exec_group=None, shadowed_action=None, resource_set=None, toolchain=None)
पैरामीटर
पैरामीटर | ब्यौरा |
---|---|
outputs
|
sequence of Files ;
ज़रूरी हैकार्रवाई की आउटपुट फ़ाइलों की सूची. |
inputs
|
sequence of Files; or depset ;
डिफ़ॉल्ट = []कार्रवाई की इनपुट फ़ाइलों की सूची या सूची. |
tools
|
sequence of Files; or depset ;
डिफ़ॉल्ट = अनबाउंडकार्रवाई के लिए ज़रूरी सभी टूल की सूची बनाएं या उन्हें हटाएं. टूल, अतिरिक्त रनफ़ाइल वाले इनपुट होते हैं, जो कार्रवाई के लिए अपने-आप उपलब्ध होते हैं. इस सूची में Files या FilesToRunProvider के इंस्टेंस शामिल हो सकते हैं. |
arguments
|
sequence ;
डिफ़ॉल्ट = []कार्रवाई के कमांड लाइन आर्ग्युमेंट. यह स्ट्रिंग या actions.args() ऑब्जेक्ट की सूची होनी चाहिए.Basel इस एट्रिब्यूट में एलिमेंट को कमांड के लिए आर्ग्युमेंट के तौर पर पास करता है.कमांड, शेल वैरिएबल सब्सिट्यूशन जैसे कि ऐसे मामले में जहां |
mnemonic
|
string; or None ;
डिफ़ॉल्ट = कोई नहींकार्रवाई के बारे में एक शब्द में जानकारी, उदाहरण के लिए, CppCompile या GoLink. |
command
|
string; or sequence of strings ;
ज़रूरी हैशेल कमांड इस्तेमाल करना है. यह या तो कोई स्ट्रिंग (पसंदीदा) या स्ट्रिंग का कोई क्रम हो सकता है (अब सेवा में नहीं है). अगर (अब काम नहीं करता) अगर बेज़ल, आदेश को अंजाम देने के लिए, उसी शेल का इस्तेमाल करते हैं, जो जेन रूल के लिए करते हैं. |
progress_message
|
string; or None ;
डिफ़ॉल्ट = कोई नहींबिल्ड के दौरान उपयोगकर्ता को प्रोग्रेस दिखाने वाला मैसेज. उदाहरण के लिए, "foo.cc को foo.o बनाने के लिए कंपाइल करना". मैसेज में %{label} , %{input} या %{output} पैटर्न हो सकते हैं. इन्हें लेबल स्ट्रिंग, पहले इनपुट या आउटपुट के पाथ से बदल दिया जाता है. स्टैटिक स्ट्रिंग के बजाय पैटर्न का इस्तेमाल करें, क्योंकि पहली स्ट्रिंग ज़्यादा असरदार होती हैं.
|
use_default_shell_env
|
डिफ़ॉल्ट = गलत कार्रवाई में पहले से मौजूद शेल एनवायरमेंट का इस्तेमाल होना चाहिए या नहीं. |
env
|
dict; or None ;
डिफ़ॉल्ट = कोई नहींएनवायरमेंट वैरिएबल की डिक्शनरी को सेट करता है. |
execution_requirements
|
dict; or None ;
डिफ़ॉल्ट = कोई नहींकार्रवाई शेड्यूल करने के बारे में जानकारी. काम की कुंजियों के लिए टैग देखें. |
input_manifests
|
sequence; or None ;
डिफ़ॉल्ट = कोई नहीं(प्रयोग के तौर पर) इनपुट रनफ़ाइल मेटाडेटा सेट करता है; आम तौर पर, ये रिज़ॉल्व_command से जनरेट होती हैं. |
exec_group
|
string; or None ;
डिफ़ॉल्ट = कोई नहींदिए गए exec ग्रुप के एक्ज़ीक्यूशन प्लैटफ़ॉर्म पर कार्रवाई करता है. अगर ऐसा नहीं होता है, तो टारगेट के डिफ़ॉल्ट एक्ज़ीक्यूशन प्लैटफ़ॉर्म का इस्तेमाल करता है. |
shadowed_action
|
Action ;
डिफ़ॉल्ट = कोई नहींशैडो की गई कार्रवाई के खोजे गए इनपुट को कार्रवाई की इनपुट सूची में जोड़े गए इनपुट का इस्तेमाल करके कार्रवाई चलाता है. अगर इनमें से कोई नहीं है, तो सिर्फ़ कार्रवाई के इनपुट का इस्तेमाल करता है. |
resource_set
|
callable; or None ;
डिफ़ॉल्ट = कोई नहींअगर स्थानीय तौर पर चलाया जाता है, तो संसाधन के इस्तेमाल का अनुमान लगाने के लिए कॉलबैक फ़ंक्शन. ctx.actions.run() देखें.
|
toolchain
|
Label; or string; or None ;
डिफ़ॉल्ट = कोई नहींइस कार्रवाई में इस्तेमाल किए जाने वाले एक्ज़ीक्यूटेबल या टूल का टूलचेन टाइप. पैरामीटर को सेट करना ज़रूरी है, ताकि कार्रवाई सही प्लैटफ़ॉर्म पर पूरी हो सके. फ़िलहाल, इसमें कोई बदलाव नहीं किया जा सकता. हालांकि, हमारा सुझाव है कि जब किसी टूलचेन का इस्तेमाल किया जाए, तब इसे सेट कर लें. ऐसा इसलिए, क्योंकि आने वाले समय में Basel के रिलीज़ होने पर, इसकी ज़रूरत पड़ेगी. ध्यान दें कि यह कार्रवाई बनाने वाले नियम के लिए यह टूलचेन तय करना ज़रूरी है कि यह 'नियम()' के अंदर मौजूद हो फ़ंक्शन का इस्तेमाल करना होगा. जब `toolchain` और `exec_group`, दोनों पैरामीटर सेट होते हैं, तो `exec_group` का इस्तेमाल किया जाएगा. अगर `exec_group` के बारे में साफ़ तौर पर नहीं बताया गया है, तो कोई गड़बड़ी हुई है. टूलचेन. |
सिमलिंक
None actions.symlink(output, target_file=None, target_path=None, is_executable=False, progress_message=None)
इस फ़ंक्शन को बताए गए target_file
या target_path
में से किसी एक के साथ ही कॉल किया जाना चाहिए.
target_file
का इस्तेमाल करते समय, output
को declare_file()
या declare_directory()
के साथ बताएं और target_file
टाइप से मैच करें. इससे सिमलिंक पॉइंट, target_file
पर सेट हो जाता है. जब भी सिमलिंक का टारगेट या इसके कॉन्टेंट में बदलाव होता है, तब Baज़ल, इस ऐक्शन के आउटपुट को अमान्य कर देता है.
अगर ऐसा नहीं है, तो target_path
का इस्तेमाल करने पर, declare_symlink()
के साथ output
के बारे में बताएं. इस मामले में, सिमलिंक target_path
पर ले जाता है. Basel, सिमलिंक को कभी ठीक नहीं करता है. इस ऐक्शन का आउटपुट अमान्य होता है. ऐसा सिर्फ़ तब होता है, जब सिमलिंक के टेक्स्ट कॉन्टेंट (यानी, readlink()
की वैल्यू) में बदलाव होता है. खास तौर पर, इसका इस्तेमाल डैंगलिंग सिमलिंक बनाने के लिए किया जा सकता है.
पैरामीटर
पैरामीटर | ब्यौरा |
---|---|
output
|
ज़रूरी है इस कार्रवाई का आउटपुट. |
target_file
|
File; or None ;
डिफ़ॉल्ट = कोई नहींवह फ़ाइल जिस पर आउटपुट सिमलिंक को ले जाया जाएगा. |
target_path
|
string; or None ;
डिफ़ॉल्ट = कोई नहीं(प्रयोग के तौर पर उपलब्ध) वह सटीक पाथ जिस पर आउटपुट सिमलिंक ले जाएगा. कोई नॉर्मलाइज़ेशन या अन्य प्रोसेसिंग लागू नहीं की जाती. इस सुविधा को ऐक्सेस करने के लिए, --experimental_allow_unresolved_symlinks सेटिंग चालू करनी होगी.
|
is_executable
|
डिफ़ॉल्ट = गलत इसे सिर्फ़ target_file के साथ इस्तेमाल किया जा सकता है, target_path के साथ नहीं. अगर सही है, तो कार्रवाई के लागू होने पर, target_file के पाथ की जांच करके यह पुष्टि की जाती है कि उसे एक्ज़ीक्यूट किया जा सकता है. अगर ऐसा नहीं है, तो उसे गड़बड़ी की सूचना दी जाती है. is_executable को 'गलत है' पर सेट करने का मतलब यह नहीं है कि टारगेट को एक्ज़ीक्यूट नहीं किया जा सकता. इसका मतलब सिर्फ़ यह नहीं है कि कोई पुष्टि नहीं हुई है.
|
progress_message
|
string; or None ;
डिफ़ॉल्ट = कोई नहींबिल्ड के दौरान उपयोगकर्ता को दिखाया जाने वाला प्रोग्रेस मैसेज. |
template_dict
TemplateDict actions.template_dict()
--+experimental_lazy_template_expansion
सेट करके प्रयोग के तौर पर चालू किया जा सकता है प्रयोग के तौर पर: यह विकल्प मेमोरी कम करने वाले टेंप्लेट का एक्सपैंशन करने के लिए, templateDict ऑब्जेक्ट दिखाता है.
लिखें
None actions.write(output, content, is_executable=False)
expand_template
का इस्तेमाल करें.
पैरामीटर
पैरामीटर | ब्यौरा |
---|---|
output
|
ज़रूरी है आउटपुट फ़ाइल. |
content
|
string; or Args ;
ज़रूरी हैफ़ाइल की सामग्री. यह एक स्ट्रिंग या actions.args() ऑब्जेक्ट हो सकता है.
|
is_executable
|
डिफ़ॉल्ट = गलत आउटपुट फ़ाइल एक्ज़ीक्यूटेबल होनी चाहिए या नहीं. |