पर उत्पन्न फ़ाइलों पर स्कैन निर्भरता मैं निर्माण के दौरान स्वचालित रूप से जेनरेट की गई फ़ाइलों पर निर्भरताओं का पालन करने के लिए स्कैन सेट अप करने की कोशिश कर रहा हूं, और बहु-थ्रेडेड बिल्ड के साथ सही ढंग से काम करता हूं।संकलन-समय
मैं जिस परियोजना का निर्माण कर रहा हूं वह एक सीआईएम प्रदाता है, जिसमें एमओएफ फाइलें शामिल हैं जो डेटा संरचनाओं, स्वत: उत्पन्न स्रोत और हेडर फाइलों को परिभाषित करती हैं जो एमओएफ फाइलों से आती हैं, और हस्तलिखित स्रोतों और हेडर फाइलें जो स्वत: जेनरेट की गई फ़ाइलों का संदर्भ देती हैं। निर्माण के सफल होने के लिए, हस्तलिखित चरण को किसी भी हस्तलिखित फाइलों को संकलित करने से पहले पूरा होने के लिए चलना चाहिए, अन्यथा शीर्षलेखों पर हस्तलिखित फाइलें अभी तक मौजूद नहीं होंगी और यह असफल हो जाएगी। स्वत: जनरेशन चरण द्वारा बनाए गए .cpp फ़ाइलें को स्रोत सूची में भी जोड़ा जाना चाहिए और अंतिम निर्माण में संकलित किया जाना चाहिए।
एक थ्रेडेड बिल्ड चलाते समय, सब कुछ ठीक काम करता है, क्योंकि स्वत: जनरेशन चरण संकलन चरण से पहले हमेशा पूरा होता है, इसलिए जेनरेट किए गए हेडर मौजूद होते हैं। हालांकि, जब बहु-थ्रेडेड का निर्माण चल रहा है, तो यह स्वत: जनरेशन चरण समाप्त होने से पहले हस्तलिखित फ़ाइलों को संकलित करने का प्रयास करता है, और निर्माण विफल हो जाता है। मैंने एक स्पष्ट निर्भरता निर्दिष्ट की है लेकिन स्कैन इसका पालन नहीं कर रहा है।
यहां मेरी स्कॉन्स्क्रिप्ट फ़ाइल का प्रासंगिक भाग है, मैंने cim_targets से अलग-अलग फ़ाइल नाम हटा दिए हैं [] क्योंकि सूची बहुत लंबी है, लेकिन संक्षेप में, cim_targets [] स्वत: उत्पादन चरण के लिए लक्ष्य आउटपुट फ़ाइलों की सूची है, प्रदाता_ स्रोत [ ] ऑटोजेन चरण पूर्ण होने के बाद स्रोतों की लौटाई गई सूची है, स्रोत [] हस्तलिखित स्रोत फ़ाइलों की सूची है, जेनप्रोवाइडर() एक कमांड निर्माता है जो बाहरी रूप से परिभाषित किया जाता है जो स्वत: जनरेशन चरण निष्पादित करता है, और साझा लाइब्रेरी() एक बाहरी परिभाषित निर्माता है जो करता है यह कैसा लगता है, कुछ एक्सटेंशन
# Define directory paths for the CIM schema
cim_dir = 'cim-schema-2.26.0'
var_smis_dir = Dir('.').abspath # src/lib/XXX in variant
cim_sources = [
Glob(os.path.join(cim_dir, '*qualifiers*.mof')),
Glob(os.path.join(cim_dir, 'Core') + '/CIM_*.mof'),
Glob(os.path.join(cim_dir, 'Device') + '/CIM_*.mof'),
Glob(os.path.join(cim_dir, 'Event') + '/CIM_*.mof'),
Glob(os.path.join(cim_dir, 'XXXXXX') + '/XXX_*.mof'),
Glob(os.path.join(cim_dir, 'Interop') + '/CIM_*.mof'),
Glob(os.path.join(cim_dir, 'Physical') + '/CIM_*.mof'),
Glob(os.path.join(cim_dir, 'System') + '/CIM_*.mof'),
]
cim_sources_flat = []
for cim in cim_sources:
for src in cim:
cim_sources_flat.append(src)
cim_targets = [
......
]
sources = [
'driver.cpp',
'device.cpp',
'cim_static_data.cpp',
'module.cpp',
'diag_log.cpp',
'profile_element.cpp',
]
staticlibs = [
......
]
dynamiclibs = [
.....
]
var_cim_sources = this_env.Install(var_smis_dir, cim_sources_flat)
cim_mof = 'cimv226.mof'
cim_linux_mof = os.path.join(cim_dir, 'cimv226-gen-flat.mof')
var_cim_sources.extend(this_env.Command(cim_mof, cim_linux_mof, Copy('$TARGET', '$SOURCE')))
# first generate the provider infrastructure using cimple
provider_sources = this_env.GenProvider(cim_targets, var_cim_sources, name, var_smis_dir)
# make sure these files don't build until AFTER the provider files have been created
this_env.Depends(sources, provider_sources)
sources_full = provider_sources + sources
# now we can compile the provider
this_env.SharedLibrary(libname, source=sources_full, staticlibs=staticlibs, dynamiclibs=dynamiclibs, installpath=install_dir)
मैंने स्पष्ट निर्भरता स्थापित करने की कोशिश की ताकि हस्तलिखित स्रोत जब तक सभी जेनरेट किए गए स्रोत नहीं बनाए जाते तब तक संकलित नहीं किया जाएगा (this_env.Depends (स्रोत, प्रदाता_ स्रोत)) लेकिन बहु-थ्रेडेड चलाते समय, स्कैन इस निर्भरता को अनदेखा करते हैं और स्वत: जनरेशन चरण पूर्ण होने से पहले हस्तलिखित फ़ाइलों को संकलित करने का प्रयास करते हैं।
स्वत: जनरेशन चरण एक मेनिफेस्ट फ़ाइल बनाता है, इसलिए मैंने इसे साइडएफ़ेक्ट लक्ष्य के रूप में उपयोग करने का प्रयास किया: लेकिन दुर्भाग्य से समस्या बनी रहती है, हालांकि सुझाव के लिए धन्यवाद – rdowell