2010-03-09 15 views
5

के लिए एक कंपाइलर एक्शन कैसे बनाएं I जीसीजे संकलन को स्वचालित करने के लिए एक क्रिया बनाना चाहते हैं। I couldn't make it work with Ant के बाद से, मैंने एसबीटी को आजमाने का फैसला किया। दस्तावेज़ कहते हैं कि एक क्रिया कैसे बनाएं और बाहरी प्रक्रिया को कैसे चलाएं। जो मैंने अभी तक नहीं देखा है वह है कि निर्देशिका पेड़ ट्रैवर्सल का पुन: उपयोग कैसे करें जो जावा और स्कैला कंपाइलर क्रियाओं के लिए मौजूद है। इस मामले में मेरी इनपुट फ़ाइलें एक निश्चित रूट फ़ोल्डर के तहत सभी .class फ़ाइलें होंगी। मुझे जीसीजे के लिए एक विशिष्ट क्लासपाथ निर्दिष्ट करने की भी आवश्यकता होगी। इसके लिए किसी भी पॉइंटर्स की भी सराहना की जाएगी।एसबीटी

उत्तर

4

मैंने जीसीजे का बहुत कुछ उपयोग नहीं किया है और मैं अभी भी एसबीटी में बहुत नया हूं, लेकिन इस तरह मेरा मानना ​​है कि आप एसबीटी 0.7.1 के साथ जो कुछ भी ढूंढ रहे हैं, उसे करने के लिए आप एक त्वरित कार्य लिख सकते हैं। तुम इतनी तरह वर्ग फ़ाइलों के सभी हड़पने के लिए एक PathFinder उपयोग कर सकते हैं:

val allClasses = (outputPath ##) ** "*.class" 

कि पाथफाइंडर और "compileClasspath" का उपयोग शीर्ष स्तर विधि, आप एक काम यह जो वर्तमान परियोजना के classpath का उपयोग कर gcj चलेंगे तरह का निर्माण कर सकते और सभी .class फ़ाइलों को एक gcj फ़ाइल में लिखें:

val gcj = "/usr/local/bin/gcj" 
val gcjFile = "target/my_executable.o" 

val allClasses = (outputPath ##) ** "*.class" 

lazy val gcjCompile = execTask { 
    <x>{gcj} --classpath={compileClasspath.get.map(_.absolutePath).mkString(":")} -c {allClasses.get.map(_.absolutePath).mkString("-c ")} -o {gcjFile}</x> 
} dependsOn(compile) describedAs("Create a GCJ executable object") 
+0

मैं यह कोशिश करूंगा ... एक और सवाल, क्या यह स्काला संकलन के लिए कक्षाबद्ध परिभाषित हो रहा है? मैं जीसीजे के लिए एक विशिष्ट का उपयोग करना चाहता हूँ। –

+0

यह स्कैला संकलन के लिए परिभाषित क्लासपाथ का उपयोग करता है। यदि आप एक अलग का उपयोग करना चाहते हैं, तो आप या तो हार्ड कोड कर सकते हैं या आप सभी जेएआर को एक निश्चित निर्देशिका में डाल सकते हैं और उन सभी को खींचने के लिए पथफिंडर का उपयोग कर सकते हैं। – Aaron

+0

ग्रेट। मुझे काम करने के लिए एक्सएमएल रूपांतरण के लिए Process._ आयात करने की आवश्यकता थी, और मैंने कुछ और tweaked। जवाब बहुत मददगार था, धन्यवाद। –