मान लीजिए मैं एक SConstruct
फ़ाइल है कि इस तरह दिखता है:कैसे हल करने के लिए "SCons: चेतावनी: दो विभिन्न वातावरण लक्ष्य के लिए निर्दिष्ट किया गया"
env = Environment()
env.Program("a", ["a.c", "util.c"])
env.Program("b", ["b.c", "util.c"])
यह निर्माण चेतावनी संदेश नहीं SCons के साथ ठीक से काम करता है। हालांकि, अगर मैं इस प्रत्येक Program
निर्माण के लिए अलग पुस्तकालयों निर्दिष्ट करने के लिए संशोधित (वास्तविक पुस्तकालयों नहीं प्रासंगिक हैं):
scons: warning: Two different environments were specified for target util.o, but they appear to have the same action: $CC -o $TARGET -c $CFLAGS $CCFLAGS $_CCCOMCOM $SOURCES
इस वजह से प्रतीत होता है:
env.Program("a", ["a.c", "util.c"], LIBS="m")
env.Program("b", ["b.c", "util.c"], LIBS="c")
तो मैं चेतावनी मिलती है Program
बिल्डर द्वारा स्वचालित रूप से स्रोत बनाने के लिए एक नया वातावरण बना रहा है, भले ही यह केवल LIBS
चर है जो अलग है (और इसलिए केवल लिंक चरण में एक अलग वातावरण होना चाहिए)। मैं इस के आसपास की तरह कुछ करने से काम कर सकते हैं:
util = env.Object("util.c")
env.Program("a", ["a.c"] + util, LIBS="m")
env.Program("b", ["b.c"] + util, LIBS="c")
यह util.c
निर्माण, तो प्रत्येक Program
निर्माण में precompiled वस्तु फ़ाइल का उपयोग कर, इस प्रकार की चेतावनी से बचने के लिए एक ही Object
बिल्डर का उपयोग करता है। हालांकि, यह वास्तव में आवश्यक नहीं होना चाहिए। क्या इस समस्या के आसपास काम करने का एक और शानदार तरीका है? या यह वास्तव में स्कैन में एक बग है जिसे तय किया जाना चाहिए?
संदर्भ: मेरे पास लगभग 20 पुस्तकालयों और 120 एक्जिक्यूटिव में कई साझा स्रोतों के साथ संकलित लगभग 2000 सी स्रोत फ़ाइलें हैं। मैंने लिखा है कि एक रूपांतरण स्क्रिप्ट का उपयोग कर पिछले मालिकाना निर्माण प्रणाली से SConstruct
फ़ाइल बनाई। मेरे वर्तमान SConstruct
का उपयोग कर पूर्ण निर्माण के लिए स्कैन द्वारा उत्पादित 450 "दो अलग-अलग वातावरण" चेतावनी संदेश हैं।
env.Program("a", ["a.c", env.Object("util.c")], LIBS="m")
env.Program("b", ["b.c", env.Object("util.c")], LIBS="c")
यह एक एकल पर्यावरण के भीतर util.c
के निर्माण को अलग:
मैंने इस समाधान को वोट दिया क्योंकि मुझे यह याद रखने की आवश्यकता नहीं है कि प्रत्येक ऑब्जेक्ट को किस वातावरण में संकलित किया गया है। सभी एक ही वातावरण में संकलित हैं। यह स्कॉन्स्क्रिप्ट फ़ाइल को साफ करने की अनुमति भी देता है। मैंने .cpp प्रत्यय को स्वचालित रूप से संलग्न न करने के लिए create_obj फ़ंक्शन को संशोधित किया –