
ç§ã¯éçºè
ã§ãããããæ°å¹ŽãPythonãã¡ã€ã³èšèªãšããŠäœ¿çšããŠããŸãã ãã ããC / C ++ã§èšè¿°ããå¿
èŠãããã¿ã¹ã¯ãæã
ãããŸãã ãã®ãããªãããžã§ã¯ããåéã§ããããŸããŸãªã·ã¹ãã ããããŸãã ã¯ã©ã·ãã¯ã¯makeãšautotoolsã§ãã
SConsã
Wafãªã©ã®ä»£æ¿ã«çŠç¹ãåœãŠãããšæããŸãã æçš¿ã®ç®çã¯ãmakeãããè¯ããæªããã蚌æããããšã§ã¯ãããŸããã ç§ã¯ããããäœã§ããã®ããããããªãã§ãããã©ã®ããã«ããã䜿ãå§ããã®ããããããæ確ã«ããããã«ãçãé 足ããããã ãã§ãã
äŒè©±ãå®è³ªçã«ããããã«ãå®éã«ã·ã¹ãã ãæ€èšããããšãææ¡ããŸãã ç§ã¯ãå
žåçã§ã¯ãããåžžã«äºçŽ°ãªã¢ã»ã³ããªã¿ã¹ã¯ãå¿
èŠãªåçŽãªãããžã§ã¯ãã䜿çšããããšã«ããŸããã åçŽãªWebãµãŒããŒãäœæããŸãããã®ç®çã¯ãå¥ã®htmlãã¡ã€ã«ã«æºåãããéçããŒãžãäœæããããšã§ãããæçµçã«ã¯å®è¡å¯èœãã¡ã€ã«ã«åã蟌ãå¿
èŠããããŸãã ã€ãŸããã¢ã»ã³ããªæ®µéã§ãcã³ãŒããå«ããœãŒã¹ã³ãŒããhtmlã³ãŒãã䜿çšããŠã¢ã»ã³ãã«ããå¿
èŠããããŸãã ãµãŒããŒã©ã€ãã©ãªãšããŠ
mongooseã䜿çšããŸãããã®ãœãŒã¹ã¯ãããžã§ã¯ãå
ã«é
眮ãããéçã©ã€ãã©ãªã«åéãããŸããéçã©ã€ãã©ãªã¯ãåŸã§å®è¡å¯èœãã¡ã€ã«ã«ãªã³ã¯ããŸãã ã¿ã¹ã¯ã¯æ確ã ãšæããŸãã
ã§ã¯ããªãããã2ã€ã®ã·ã¹ãã ãçµéšã®ããã«éžã°ããã®ã§ããããïŒ çµå±ã®ãšããããŸã
Rake ã
CMake ãAnt / NAntãªã©ããããŸãã çãã¯æåã®æã«ãããŸãïŒãããã¯Pythonã«åºã¥ããŠãããç§ã¯åœŒãããç¥ã£ãŠããŠæããŠããã®ã§ãç§ã«ãšã£ãŠãšã³ããªãŒã®ãããå€ã¯ããªãäœãã¯ãã§ãã ããå§ããŸããã...
æºåãã
SConsãä»ããŠãããžã§ã¯ããã¢ã»ã³ãã«ããã«ã¯ãã·ã¹ãã ã«ã€ã³ã¹ããŒã«ããå¿
èŠãããããããžã§ã¯ãã®ã«ãŒãã«SConsturctã¹ã¯ãªãããå¿
èŠã§ãã å°ãªããšãUbuntuã§ã¯ãSConsããã±ãŒãžã¯æšæºãªããžããªã«ååšããã€ã³ã¹ããŒã«ã«ã¯åé¡ããããŸããïŒ `apt-get install scons`ã
Wafãä»ããŠãããžã§ã¯ãããã«ãããã«ã¯ãWafèªäœãå¿
èŠã§ããããã¯åäžã®ãã¡ã€ã«ãšããŠæäŸããããããžã§ã¯ãã®ã«ãŒãã«é
眮ãããŸãã ã€ãŸããã·ã¹ãã ã«Wafãã€ã³ã¹ããŒã«ããå¿
èŠã¯ãªããã³ãŒããŠãŒã¶ãŒã¯ããŒãžã§ã³ç®¡çã·ã¹ãã ãããããããªãŒããå«ããããžã§ã¯ããååŸããŸãã ããã«ãwscriptãšåŒã°ããã¢ã»ã³ããªã¹ã¯ãªããèªäœãå¿
èŠã§ãã
ãããžã§ã¯ãããªãŒã¯æ¬¡ã®ããã«ãªããŸãã
~/devel/stupid-server$ tree
.
|-- external
| `-- mongoose
| |-- mongoose.c
| `-- mongoose.h
|-- html
| `-- index.html
|-- html2c
|-- SConscript
|-- SConstruct
|-- src
| `-- main.cpp
|-- waf
`-- wscript
説æãããã¡ã€ã«ã«å ããŠãhtml2cãšSConscriptã®2ã€ã®ãã¡ã€ã«ããããŸãã ãããã«ã€ããŠããã«èª¬æããŸãã
ã³ã³ãã€ã«ãšãªã³ã¯
Scons
ãšãããããhtmlå€æãå
éãã«ããŠãµãŒããŒãæ§ç¯ããŸãã 圌ãç§ãã¡ã®main.cppã«çµã¿èŸŒãŸããŠããçããäžããŠããéã«ããŸãããã
以äžãå¿
èŠã§ããã·ã¹ãã ã¯ãmongooseãéçã©ã€ãã©ãªã«ã³ã³ãã€ã«ããŠãããsrc / main.cppãã³ã³ãã€ã«ããããããã¹ãŠãåäžã®å®è¡å¯èœãã¡ã€ã«ã«ãªã³ã¯ããå¿
èŠããããŸãã åæã«ããã¹ãŠã®ã¢ãŒãã£ãã¡ã¯ããå¥ã®ãã£ã¬ã¯ããªã«å
¥ããŠãããšããã§ããããããããã°ãæ¯ãè¿ããã«åé€ã§ããŸãã
SConsããå§ããŸãããã ãã®ããã®SConstructã¹ã¯ãªããã¯æ¬¡ã®ããã«ãªããŸãã
env = Environment(
CPPPATH = 'external/mongoose',
CFLAGS = '-O2',
)
mongoose = env.StaticLibrary(Glob('external/mongoose/*.c'))
env.Program(Glob('src/*.cpp') + [mongoose], LIBS=['dl', 'pthread'])
ããã§ãæåã®è¡ã§ã¯ãç°å¢-SConsã·ã¹ãã ã®äžå¿ãã«ããå®çŸ©ããŸããSConsã·ã¹ãã ã§ã¯ãå¿
èŠãªããŒã«ãæ§æããŸãã ä»åã®å Žåãincludeãã¹ãmongooseã«è¿œå ããæé©åã䜿çšããŠã¢ã»ã³ããªã«ãã©ã°ãè¿œå ããŸãã 次ã®è¡ã§ã¯ããã³ã°ãŒã¹ã®æ§ç¯
æ¹æ³ã
決å®ããŸã ã ããã¯éçã©ã€ãã©ãªã§ãããexternal / mongooseãã£ã¬ã¯ããªå
ã®ãã¹ãŠã®.cãã¡ã€ã«ãã³ã³ãã€ã«ããããšèšããŸãã ç§ãã¡ã®å Žåããã¡ã€ã«ã¯1ã€ã§ãããå€æ°ããå ŽåãGlobã¯ãããããªã¹ãããå¿
èŠããªãããŸãã æåŸã«ã3è¡ç®ã§å®è¡å¯èœãã¡ã€ã«ã®ã¢ã»ã³ãã«
æ¹æ³ã
決å®ããŸãã srcãã£ã¬ã¯ããªå
ã®ãã¹ãŠã®.cppãšäºåå®çŸ©ãããmongooseã§æ§æãããŠããããšã«å ããæšæºã®dlããã³pthreadã©ã€ãã©ãªããªã³ã¯ããå¿
èŠããããŸãã
åé
æ¹æ³ãš
決å®æ¹æ³ã«éç¹ã眮ããŠããŸãã ã¹ã¯ãªããã§èª¬æãããŠããããã«ãSConsã§ã®ã¢ã»ã³ããªã¯è¡ããšã«è¡ãããŸããã 代ããã«ãã·ã¹ãã ã¯å®£èšã䜿çšããŠã·ãŒã±ã³ã¹èªäœã決å®ããç®æšéã®äŸåé¢ä¿ãšãã·ã£ããã«ã¿ã¹ã¯ã«ããè€æ°ã®ã¹ã¬ããã§ã®ã¢ã»ã³ããªã®é«éåã®å¯èœæ§ãèæ
®ããŸãã
äžè¬ã«ãäž¡æ¹ã®ã·ã¹ãã ã®èª¬æã§ã¯ãPythonãç¥ã£ãŠããã°ãã¢ã»ã³ããªã¹ã¯ãªãããèšè¿°ãããŠããããããã¹ãŠãåçŽã«ãªãããšã瀺åãããŠããŸãã æ§æçã«ã¯Pythonã§ãããããå®éã«ã¯ããã¯cã«ãªããŸãããå®éã®äœæ¥ã«ã¯ãããã®ã·ã¹ãã ã®ã€ããªãã®ãŒãšäœæ¥ã¹ããŒã ãæ確ã«ç解ããå¿
èŠããããŸãã
SConsã«æ»ããŸãã ããã§ããããžã§ã¯ãããã«ãããããã«ãã¿ãŒããã«ã§ãsconsããšå
¥åããã ãã§æ®ããŸãïŒWebãµãŒããŒãçµã¿ç«ãŠãããŸãïŒ ãã ããmakeã®æè¯ã®äŒçµ±ã§ã¯ãã¢ã»ã³ããªã¢ãŒãã£ãã¡ã¯ãã¯ãœãŒã¹ã®ããé£ã«è¡šç€ºãããæ§é ãè©°ãŸãããŸãã ãã®åé¡ã解決ããã«ã¯ããŽãŒã«å®£èšã®è»¢éå
ãšãªãè¿œå ã®SConscriptãã¡ã€ã«ãäœæããå¿
èŠããããŸãã ã¡ã€ã³ã®SConstructãããããã®ãã£ã¬ã¯ããªã§ãã®SConscriptãåéããŸãããšèšãå¿
èŠããããŸãã æ®å¿µãªããããããå¯äžã®æ¹æ³ã§ãããããã¥ã¡ã³ãã®æ©èœãšããŠä¿è·ãããŠããŸãã ã¹ã¯ãªããã¯æ¬¡ã®ããã«ãªããŸãã
# SConstruct
env = Environment(
CPPPATH = 'external/mongoose',
CFLAGS = '-O2',
)
SConscript('SConscript', variant_dir='build-scons', exports=['env'])
# SConscript
Import('env')
mongoose = env.StaticLibrary(Glob('external/mongoose/*.c'))
env.Program(Glob('src/*.cpp') + [mongoose], LIBS=['dl', 'pthread'])
ããã§ããã¹ãŠã®Gibletsãåå¥ã®build-sconsãã£ã¬ã¯ããªã«ãã¡ããšæããããŸããŸãã
ããã¯è¯ãç¿æ
£ã§ããããã芪ãã¡ã€ã«ã«ç°å¢å®çŸ©ãæ®ããŸãããå€ãã®åã¹ã¯ãªãããšå
±éã®ç°å¢ãååšããå¯èœæ§ãããããã§ãã ãã¡ã€ã«éã®è»¢éã¯ãç°¡åã§æ²ãã£ãã¡ã«ããºã ã«ãã£ãŠå®è¡ãããŸãããããããexportsãã©ã¡ãŒã¿ãŒãšImportã³ã³ã¹ãã©ã¯ãã䜿çšããŸãã
ã¯ã
Wafã§ãåãããã«ãªããŸããïŒ
top = '.'
out = 'build-waf'
def set_options(opt):
opt.tool_options('compiler_cc')
opt.tool_options('compiler_cxx')
def configure(conf):
conf.check_tool('compiler_cc')
conf.check_tool('compiler_cxx')
conf.env.append_unique('CCFLAGS', '-O2')
conf.env.append_unique('CXXFLAGS', '-O2')
def build(bld):
bld(
target = 'mongoose',
features = 'cc cstaticlib',
source = bld.path.ant_glob('external/mongoose/**/*.c'),
export_incdirs = 'external/mongoose',
)
bld(
features = 'cxx cprogram',
source = bld.path.ant_glob('src/**/*.cpp'),
target = 'stupid-server',
lib = ['dl', 'pthread'],
uselib_local = ['mongoose'],
)
æåã®2è¡ã¯ããããžã§ã¯ãã®ã«ãŒããšèŠãªããããã®ãšãã¢ãŒãã£ãã¡ã¯ããé
眮ããå Žæã決å®ããŸãã
ã芧ã®ãšãããããã¯Wafã§ã¯ããè«ççã§ãã 以äžã¯set_optionsé¢æ°ã§ãã æ¢åã®æšæºã³ãã³ãã©ã€ã³ãªãã·ã§ã³ãã«ã¹ã¿ã ãªãã·ã§ã³ã§è£å®ããããã«ãWafã«ãã£ãŠåŒã³åºãããŸãã ãã®å ŽåãCããã³C ++ã³ã³ãã€ã©ã®åäœã«åœ±é¿ãäžããããšãã§ããããã«ãæšæºã®ãã©ã¡ãŒã¿ãŒã»ãããè¿œå ãããŸãã
以äžã¯èšå®æ©èœã§ãã `./waf configure`ãšèšããšãã«åŒã³åºããããã¹ãŠã®ç°å¢å€æ°ãèšå®ãã` ./waf build`ã³ãã³ãã§ãã«ãã§äœ¿çšããããã¹ãŠã®ããŒã«ãèŠã€ããããšãç®çãšããŠããŸãã 2ã€ã®æ®µéãžã®åå²ïŒæ§æãšã¢ã»ã³ããªã¯ãautotoolsã§äœ¿çšããããã®ãšé¡äŒŒããŠãããé«éåã«åœ¹ç«ã¡ãŸãã æ¥åžžã®äœ¿çšã§ã¯ãæ§æã¯ã»ãšãã©å¿
èŠãªããã¢ã»ã³ããªã¯æ°žç¶çã§ãã ããã«ããã枬å®å¯èœãªæéãç¯çŽã§ããŸãã ç§ãã¡ã®å Žåãæ§æã§ã¯ããã·ã³ã«Cããã³C ++ã³ã³ãã€ã©ããããã©ããã確èªãããããã®å ŽæãèŠããŠãããèšå®ã«æé©åãã©ã°ãè¿œå ããŸãã
次ã«ãç¹å®ã®ãã«ãã³ã³ããã¹ãïŒWafã·ã¹ãã ã®äžå¿ãã«ãïŒããã©ã¡ãŒã¿ãŒãšããŠåãåããã«ãé¢æ°ããããŸãã ãã®ã³ã³ããã¹ãã¯é¢æ°ãšããŠåŒã³åºãããšãã§ãããããåé
ããæ¹æ³ãšå¯Ÿè±¡ã
決å®ã§ããŸãã ããã2ååŒã³åºããŸããmongooseããã«ãããå®è¡å¯èœãã¡ã€ã«èªäœããã«ãããŸãã ååŒã³åºãã§ããœãŒã¹ãã¿ãŒã²ããåãããã³æ©èœã»ãããå®çŸ©ãããŸãã ãã®ã»ããã¯ããœãŒã¹ãçµæã«å€æããããã«äœ¿çšããããŒã«ãWafã«æ瀺ããŸãã åè
ã®å ŽåãCã³ã³ãã€ã©ïŒccïŒãšã¢ãŒã«ã€ãïŒcstaticlibïŒã䜿çšããåŸè
ã®å Žå-c ++-ã³ã³ãã€ã©ïŒcxxïŒãšãªã³ã«ãŒïŒcprogramïŒã䜿çšããŸãã ããã«ãå®è¡å¯èœãã¡ã€ã«ã«ã€ããŠã¯ãlibåŒæ°ã䜿çšããŠãå¿
èŠãªæšæºã©ã€ãã©ãªãæå®ããŸãã ãŸããuselib_localåŒæ°ã䜿çšããŠãããŒã«ã«ãã³ã°ãŒã¹ãžã®ãªã³ã¯ã«ã€ããŠèª¬æããŠããŸãã
ç¬èªã®ã¢ãŒãã£ãã¡ã¯ããšãªã³ã¯ããããã«ãWafã«ã¯ãSConsã§è¡ãããŠããããã«ãã¿ãŒã²ãããªã¹ãããœãŒã¹ãªã¹ãã«è¿œå ããã®ã§ã¯ãªããuselib_localã®ãããªæŸèæãããããããã®ã¯éåžžã«å¥åŠã§ãã ãããããã®ãŸãŸãããŸãã äžæ¹ãçŽ æŽãããå©ç¹ã¯ãmongooseãžã®ã€ã³ã¯ã«ãŒããã¹ãmongooseã¿ãŒã²ããèªäœã«ã«ãã»ã«åããããããã¬ãã«ã®ã©ããã§å®£èšãããªãããšã§ãã mongooseã«äŸåããã¿ãŒã²ããã®ã¿ããã³ã³ãã€ã©ãŒãžã®ãã£ã¬ã¯ãã£ããšããŠãã®è¿œå ã®ãã¹ãåãåããŸãã
ããŠããã®ãããªã¹ã¯ãªãããããã°ããã«ãããã«ã¯ `./waf configure build`ãåŒã³åºãã ãã§ååã§ãã ãããŠåŸã§ããœãŒã¹ã§äœæ¥ãããšãã«ã `ã/ waf build`ã«å¶éããããšãã§ããŸãã
HTMLã¢ã»ã³ããª
htmlããs-codeãååŸããäžè¬çã«åãå
¥ããããŠããæ¹æ³ãããããªãããããã®ãããªHTMLãäœæããå°ããªhtml2cã¹ã¯ãªãããäœæããŸããã
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/1999/xhtml">
<html>
<body>
<h1>Hello world from stupid server!</h1>
</body>
</html>
ãã®ãããª.cïŒ
// Autogenerated by html2c. Think before edit
const char htmlString[] =
"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/1999/xhtml\">\n"
"<html>\n"
" <body>\n"
" <h1>Hello world from stupid server!</h1>\n"
" </body>\n"
"</html>\n"
;
ã¡ã€ã³ãã¡ã€ã«ãããã®è¡ã䜿çšããã«ã¯ãç°¡åãªææ³ã䜿çšããŸãã
extern "C" const char htmlString[];
ããã°ã©ãã³ã°ã®èŠ³ç¹ããèŠããšãããã»ã©ãšã¬ã¬ã³ãã§ã¯ãããŸããããç§ãã¡ã®ç®çã«ãšã£ãŠã¯æé«ã§ãã
Scons
SConsã1ã€ã®ã¿ã€ãã®å¥åŠãªãã¡ã€ã«ããä»ã®ãã¡ã€ã«ãååŸããæ¹æ³ãç解ããã«ã¯ãããããBuilderãå®çŸ©ããå¿
èŠããããŸãã ãããã£ãŠãç°å¢ã¯StaticLibraryãProgramãªã©ã®è¿œå ã¡ãœãããååŸããŸãããããã«ããåé¡ã解決ã§ããŸãã
# SConstruct
env['BUILDERS']['Html2c'] = Builder(
action = './html2c $SOURCES > $TARGET',
src_suffix = '.html',
suffix = '.c',
)
ããã§ãSConscriptã§äœ¿çšããenv.Html2cãã§ããŸããã
html_c = env.Html2c('html/index.html')
mongoose = env.StaticLibrary(Glob('external/mongoose/*.c'))
env.Program(Glob('src/*.cpp') + [html_c, mongoose], LIBS=['dl', 'pthread'])
ãã®ã¡ãœããã¯ãã¿ãŒã²ãããªããžã§ã¯ãã®å®£èšãè¿ãããããçŽæçã«ã¡ã€ã³ããã°ã©ã ã®ãœãŒã¹ã³ãŒãã«è¿œå ããŸãã
ã¯ã
ãŸããæ§æ段éã§ãhtml2cãŠãŒãã£ãªãã£ãèŠã€ããŠãå°æ¥ã®äœ¿çšã«åããŠç°å¢å€æ°ã«ãã®ãã¹ãä¿åããå¿
èŠããããŸãã
def configure(conf):
# ...
conf.find_program('html2c', var='HTML2C', mandatory=True, path_list=[conf.srcdir])
次ã«ãããããæ°ããå€æãå®çŸ©ããå¿
èŠããããŸã ãã§ãŒã³ãWafã«.htmlãã.cãååŸããæ¹æ³ãæ瀺ããŸãã
import TaskGen
TaskGen.declare_chain(name='html2c', rule='${HTML2C} ${SRC} > ${TGT}', ext_in='.html', ext_out='.c', before='cc')
ããã§ã¯ã以åã«æ§ææé ã§èšå®ãããå€æ°$ {HTML2C}ã䜿çšããŸããã
å¬ããããšã«ãSConsã®ããã«ãWafã¯ã€ã³ããŒãã«éæ³ãè¿œå ããŸããã èãã©ãããæé·ãããããã®å Žåã¯TaskGenã¢ãžã¥ãŒã«ãããåžžã«ã»ãŒæ確ã§ãã ãããã£ãŠãå¿
èŠã«å¿ããŠãã·ã¹ãã ã®ãœãŒã¹ã³ãŒãã§é¢å¿ã®ããå Žæããã€ã§ãèŠã€ããããšãã§ããŸãã
Wafãå€æã®æ¹æ³ãç¥ã£ãã®ã§ãã¡ã€ã³ããã°ã©ã ã®ãœãŒã¹ããã°ã©ã ãªã¹ãã«htmlãè¿œå ããã ãã§ãã
def build(bld):
#...
bld(
features = 'cc cxx cprogram',
source = bld.path.ant_glob('src/**/*.cpp') + ' html/index.html',
# ...
)
泚ææ·±ãèªè
ã¯ãæ°ããå€æã§ã¯æ©èœã«äœãè¿œå ããªãã£ãããšã«æ°ä»ãããããããŸããã ããã¯ã `TaskGen.declare_chain`ã¡ã«ããºã ãWafãæ¡åŒµããããã®åçŽåããããæ®éçãªé«ã¬ãã«ã®æ¹æ³ã§ãããšããäºå®ã«ãããã®ã§ãã ããã«ã¯éåžžã«äžå©ãªæ¬ ç¹ããããŸãããã®ãããªå®£èšã®åŸããœãŒã¹ã§wafãèŠããã¹ãŠã®.htmlã¯ããŸãäœããã.cã«å€æãããŸãã ã€ãŸããå¥ã®ç®æšãšããŠftp htmlãäœããã®ãµãŒããŒã«ã¢ããããŒããããå Žåã§ããã·ã¹ãã ã¯èŠªåã«ãããã.cã«äºåå€æããããããããŒãããŸãã
æ©èœãèæ
®ããå®å
šãªãœãªã¥ãŒã·ã§ã³ã¯é©ãã»ã©è€éã§ãããWafãæ·±ãç解ããå¿
èŠããããŸãã ããªããç ãããªãããã«ãç§ã¯åœŒãããã«é£ããŠããªãããšã«ããŸããã
çŽ æµãªããã
äž¡æ¹ã®ã·ã¹ãã ã«ã¯ãC / C ++ãœãŒã¹çšã®çµã¿èŸŒã¿äŸåé¢ä¿ã¹ãã£ããŒããããŸãã ã€ãŸãã.hãã¡ã€ã«ã®äŸåé¢ä¿ã®å®£èšãå¿ããããšãã§ããŸãã
ã©ã¡ãã®ã·ã¹ãã ã«ãçµ±åãããã¯ãªãŒã³ã·ã¹ãã ããããŸãã `scons -c`ãåŒã³åºããšãã¹ãŠã®ã¢ãŒãã£ãã¡ã¯ããåé€ããã` ./waf clean`ãš `./waf distclean`ã¯ããããã¢ã»ã³ããªã¢ãŒãã£ãã¡ã¯ããšæ§æãã£ãã·ã¥ãã¡ã€ã«ãåé€ããŸãã
äž¡æ¹ã®ã·ã¹ãã ã¯ã¯ãã¹ãã©ãããã©ãŒã ã§ãã
SConsã¯WafãããåªããŠããŸã
SConsã«ã¯è±ããªæŽå²ããããã³ãã¥ããã£å
ã®äººã
ãå€ããããå€ãã®åºçç©ã§èšåãããããå€ãã®ãããžã§ã¯ãã§äœ¿çšãããŠããŸãã
SConsã®ããã¥ã¡ã³ãã¯ãWafã®ããã¥ã¡ã³ããã1ã¬ãã«äžã§ãã ã©ã¡ãã®ã·ã¹ãã ã«ãé»åæžç±ããããŸãããWafã®å Žåããã®å
容ã¯20åç®ããæããã«ãªããŸãã
SConsã¹ã¯ãªããã®ã€ããªãã®ãŒã¯ãéåžžãããç解å¯èœã§çŽæçã§ãã å€ãã®å Žåãäœããã©ã®ããã«è¡ãããŠããã®ãããããããªããšãã¯ãé¡æšã«ãã£ãŠãããããããšããŸããããã¹ãŠããŸããããŸãã Wafã§ã¯ãå€ãã®ã¿ã¹ã¯ã®ããã«ãæŸèæãæ¢ããå°çšã®ã€ã³ã¿ãŒãã§ã€ã¹ãæ±ãå¿
èŠããããŸãã
SConsã§ã¯ãéåžžãåãããšã1ã€ãããããŸãã¯ããã€ãã®åæ§ã®æ¹æ³ã§è¡ãããšãã§ããŸãã æ²çã«å€ããããšãããWafã®æè»æ§ã«ããã1000éãã®æ¹æ³ã§äœããéæã§ããŸããããã®ãã¡ã®1ã€ã ãããæ£ããããã®ã§ãããä»ã®ãã¹ãŠã¯ãããªããµããŒããšäœæ¥ã䌎ããŸãã
Wafã¯SConsããåªããŠããŸã
Wafã¯ãSConsã®èµ·æºã«ç«ã£ãç·æ§ã«ãã£ãŠæ¯èŒçæè¿äœæãããŸããã ãããã£ãŠãSConsã®å€§èŠæš¡ãªæŠå¿µäžã®é害ãèæ
®ããŠåé¿ããŸãããããã¯ã倧èŠæš¡ã§è€éãªãããžã§ã¯ãã§ã¯ãçç£æ§ãä¿å®ã®å®¹æããã¯ãã¹ãã©ãããã©ãŒã ãªã©ã«åæ ãããŠããŸããã
Wafã¯SConsãããã¯ããã«é«éã§ãã ç§ã¯ãã§ãã¯ããŸããã§ããããå€æ°ã®äŸåé¢ä¿ãæã€æ°åã®ãœãŒã¹ãã¡ã€ã«ããããããžã§ã¯ãã§ã¯ãSConsã10ã15åäžåããšèšãããŠããŸãã åå¥ã®æ§æãšã¢ã»ã³ããªãããã³ããã€ã³ããªãžã§ã³ããªäœã¬ãã«ã®ã¿ã¹ã¯åæ£ã·ã¹ãã ã®ãããã§ãã ã¡ãªã¿ã«ãéåžžã®makeãšæ¯èŒãããšããããã¯çã£å
ã«è¡ããŸãïŒPythonã¯é
ãã§ããããµããã£ã¬ã¯ããªå
ã®ããã»ã¹ã®ååž°çãªã¹ããŒã³ã®ããã«ãmakeã¯ãã®å©ç¹ã倱ããŸãã
ã³ã³ãœãŒã«ãžã®Wafã®åºåã¯ãSConsãããæ¯é¡ã®ãªããã®ã§ãæ¥éšãäœããŸãã ããã¯è²ãšèŠèŠã§ããããšã©ãŒãšèŠåã¯éåžžã«èŠãããã§ãã
Waf Mobileã ã·ã¹ãã å
šäœã¯ãã³ãŒãå
ã§çŽæ¥ãµã€ãºã100 KBæªæºã®1ã€ã®ãã¡ã€ã«ã«é
眮ããããããã¢ã»ã³ããªãã·ã³ã«èªåã§ã€ã³ã¹ããŒã«ããå¿
èŠæ§ãå¿ããããšãã§ããŸãã ã»ãšãã©ã®Posixã·ã¹ãã ã«ããPythonã®ã¿ãå¿
èŠã§ãã
Wafã䜿çšãããšããããžã§ã¯ãã®ã«ãŒããã£ã¬ã¯ããªå€ã«ãããœãŒã¹ãæäœã§ããŸãã ããšãã°ãã·ã¹ãã ã«ã€ã³ã¹ããŒã«ãããŠããããœãŒã¹ã³ãŒã圢åŒã§ã®ã¿äœ¿çšå¯èœãªã©ã€ãã©ãªãããå Žåã åæ§ã®åé¡ãSConsã§çºçããå Žåãçªæ¯ãããããªããŸãã
ã©ã¡ããè¯ã
äž¡æ¹ã®ã·ã¹ãã ã®ããã¥ã¡ã³ãã¯ãå€æã®äŸã§ã¯ãããŸããã äž¡æ¹ã®ã·ã¹ãã çšã®é»åæžç±ããããŸãããSConsã ããéåžžã®ãªãã¡ã¬ã³ã¹/ããã¥ã¢ã«ãæã£ãŠããŸãã ãããŠãããã¯1ã€ã®å·šå€§ãªãããã¯ãã¹ã§ãããCtrl + Fã§ã®ã¿æ€çŽ¢ã§ããŸãã Wafãæ¡åŒµããå Žåãè€éãªã·ããªãªã§ããã®äžã«åºãŸã£ãŠããã¢ã¹ãã¯ãæåããã°ã©ãã³ã°ã«é¢ããŠã¯ãã»ãŒç¢ºå®ã«ãœãŒã¹ã«ã¢ã¯ã»ã¹ããŠç®çãèŠã€ããå¿
èŠããããŸãã ããã¥ã¡ã³ãã§ã¯ãååãšããŠããã®ã¬ãã«ã®æ
å ±ã¯ãããŸããã
ãã®ãã«ãã¹ã¯ãªããã¯åãªãPythonïŒduckã§ãã äž¡æ¹ã®å Žåã 詳现ãèæ
®ããŠãã³ãŒãã¯çµéšçã«å®è¡ãããã®ã§ã¯ãªãã1è¡ãã€ã§ã¯ãªããã·ã¹ãã ã決å®ããã©ã³ãã ãªé åºã§å®è¡ãããŸãã ããããã³ãŒãã¯ãã¡ããé çªã«å®è¡ãããŸããããbuild_this_thingããèšè¿°ãããŠããå Žåãããã¯ã¢ã»ã³ããªãä»ããã«å®è¡ãããããšãæå³ããŸããã ããã¯ãã®ãããªãã®ãããããã®ãããªãã®ãããããšãæå³ããã ãã§ããã®å Žåã¯ãããéããå¿
èŠããããŸãã Pythonã®äžçš®ã®XMLãååŸãããŸãã
äž¡æ¹ã®ã·ã¹ãã ã®ãœãŒã¹ã³ãŒããåŽæ°Žã§ã¯ãããŸããã è·å Žã§ãã®ãããªãã®ãæžããå Žåãå°ãªããšãäœããã®åœ¢ã§ååã«è£åãããããã«èŸããã ãã«ãªãããã«æžãããŠãããšããããããŸãã äœæè
ã¯ç解ã§ããŸããããã€ãã£ãç°å¢ã¯C / C ++ã§ãããPythonæåã®è©³çŽ°ã®ã»ãšãã©ãç¥ããªãå ŽåããããŸãã
çŽ æ
ãã®æçš¿ã§è§£æããããã¹ãŠã®ãããžã§ã¯ããã¡ã€ã«ã¯ã
BitBucketãªããžããªã§å©çšã§ããŸãã