±¾ÖܳÉÅÖ×ÓÿÖÜÒ»²©µ½Á˵ÚËÄÖÜ^_^
Ç°ÑÔ
ǰһƪ,ÎÒÃÇ´ó¸ÅÃèÊöÁËÕû¸ö¾µÏñÎļþµÄÉú³É¹ý³Ì.±¾ÖÜÎÒÃÇÀ´½âÎöÖ÷Makefile,¿´¿´Ö÷Òª±àÒë¹ý³ÌÊÇÔõô²úÉúµÄ.
Ö÷Makefile½á¹¹
ÎÒÃÇÒÔchaos calmer
µÄ´úÂëΪÀý,Õû¸ö±àÒëµÄÈë¿ÚÊÇÔÚÔ´Âë¸ùĿ¼ÏµÄMakefile.±àÒëµÄ¸÷ÖÖÃüÁӦ¸ÃÔÚÔ´Âë¸ùĿ¼Ï¼üÈë.
Õû¸öÖ÷MakefileµÄ½á¹¹ÈçÏÂ:
world:
ifneq ($(OPENWRT_BUILD),1)
¶¥²ã
else
µÚ¶þ²ã
endif
¿ªÊ¼²¿·ÖÊÇһЩעÊͺͱäÁ¿¶¨Ò弰·¾¶¼ì²é.
¸ù¾ÝMakefileµÄ¹æÔò,ÔÚûÓÐÖ¸¶¨±àÒëÄ¿±êµÄʱºò,MakefileÖеĵÚÒ»¸öÄ¿±ê½«×÷ΪĬÈÏÄ¿±ê.
»»¾ä»°Ëµ,µ±ÎÒÃÇÖ´ÐÐmake V=s
ʱ,Õâ¸öʱºò±àÒëµÄÄ¿±ê¾ÍÊÇworld
.ºÍÎÒÃÇÖ´ÐÐmake world V=s
Ч¹ûÊÇÒ»ÑùµÄ.
¶¥²ã
ͨ³£ÔÚ±àÒëʱ,ÎÒÃDz»»á¶¨Òå±äÁ¿OPENWRT_BUILD
µÄÖµ,ËùÒÔͨ³£ÎÒÃÇÊÇ»á×ßµ½¶¥²ãµÄ.
¶¥²ã´úÂëÈçÏÂ:
_SINGLE=export MAKEFLAGS=$(space);
override OPENWRT_BUILD=1
export OPENWRT_BUILD
GREP_OPTIONS=
export GREP_OPTIONS
include $(TOPDIR)/include/debug.mk
include $(TOPDIR)/include/depends.mk
include $(TOPDIR)/include/toplevel.mk
ÕâÀïÎÒÃÇ¿´µ½±äÁ¿OPENWRT_BUILD
±»ÖÃΪ1.È»ºó°üº¬ÁË3¸ö.mk
Îļþ.
ÕâÀïÉÔ΢½âÊÍÏÂ.mk
Îļþ.ËüÃÇÒ»°ãûÓÐʲôִÐж¯×÷,¶¼ÊÇһЩ±äÁ¿µÄ¶¨Ò廹ÓÐÒÀÀµ¹ØϵµÄ˵Ã÷.¿ÉÒÔÀà±ÈÓÚCÓïÑÔµÄÍ·ÎļþÀ´Àí½â.
debug.mk:
¿ÉÒÔͨ¹ý¶¨ÒåDEBUGµÄÖµÀ´¿ØÖƱàÒë¹ý³Ì
depends.mk
Ö÷Òª¶¨ÒåÁËrdepÕâ¸ö±äÁ¿
toplevel.mk
Õâ¸öÊÇÎÒÃǸú×Ù±àÒë¹ý³ÌµÄÖØÒªµÄÎļþ.Õâ¸öÎļþÔÚÔ´Âë¸ùĿ¼ÏµÄinclude
Îļþ¼ÐÏÂ.
ºËÐÄ´úÂëÈçÏÂ:
%::
@+$(PREP_MK) $(NO_TRACE_MAKE) -r -s prereq
@( \
cp .config tmp/.config; \
./scripts/config/conf --defconfig=tmp/.config -w tmp/.config Config.in > /dev/null 2>&1; \
if ./scripts/kconfig.pl '>' .config tmp/.config | grep -q CONFIG; then \
printf "$(_R)WARNING: your configuration is out of sync. Please run make menuconfig, oldconfig or defconfig!$(_N)\n" >&2; \
fi \
)
@+$(ULIMIT_FIX) $(SUBMAKE) -r $@ $(if $(WARN_PARALLEL_ERROR), || { \
printf "$(_R)Build failed - please re-run with -j1 to see the real error message$(_N)\n" >&2; \
false; \
} )
³ýÁËÉÙÊýÔÚtoplevelÖỶ¨ÒåµÄÄ¿±êÍâ,ÆäËû±àÒëÄ¿±ê¶¼»á×ßµ½ÕâÀï.½«Ö®¼ò»¯ºó:
%::
make prereq
make $@
Ê×ÏÈÖ´ÐÐprereq
,È»ºóÔÙÖ´ÐÐÎÒÃÇÖ¸¶¨µÄÄ¿±ê»òÕßĬÈÏÄ¿±êworld
.
prereqÕûÀíºóµÄÒÀÀµ¹ØϵÈçÏÂ:
ÆäÖÐ
staging_dir/host/.prereq-build:
½«»áÖ´ÐÐһϵÁÐÖ÷»ú¼ì²é,ÊÇ·ñ°²×°Á˱ØÒªµÄÈí¼þ.
prepare-tmpinfo:
¸ù¾Ýscan.mk,ɨÃètarget/linux
ºÍpackage
Ŀ¼,Éú³ÉpackageinfoºÍtargetinfo.
×ÜÖ®,¶¥²ãÍê³ÉһϵÁбØÒªµÄ×¼±¸¹¤×÷.¶ÔÓÚ¾ø´ó¶àÊýµÄÄ¿±ê¶øÑÔ,¶¥²ãÊDZؾ֮·.µ±È»,ÔÚtoplevel.mk
ÖÐ,ÎÒÃÇÒ²¿ÉÒÔ¿´µ½Ä¿±êmenuconfig
.Ò²¾ÍÊÇ˵¶ÔÓÚÄ¿±êmenuconfig
¶øÑÔ,½«²»»áÖ´Ðе½µÚ¶þ²ãµÄÂß¼.
µÚ¶þ²ã
ÔÚÉÏÃæÖ´ÐÐÍêmake prereq
Ö®ºó,½«Ö´ÐÐmake world
.
»¹¼ÇµÃÎÒÃǽøÈ붥²ãºóÐÞ¸ÄÁ˱äÁ¿OPENWRT_BUILD
ô?µ±ÔÙ´ÎÖ´ÐÐmake world
µÄʱºò,ÓÉÓÚÌõ¼þ²»Âú×ã,ÎÒÃǽ«Ö±½Ó½øÈëµÚ¶þ²ãÀ´Ö´ÐÐ.
include rules.mk
include $(INCLUDE_DIR)/depends.mk
include $(INCLUDE_DIR)/subdir.mk
include target/Makefile
include package/Makefile
include tools/Makefile
include toolchain/Makefile
rules.mk:
ºÜÖØÒªµÄÒ»¸ömkÎļþ,ÆäÖй涨Á˺ܶàÓÐÓõıäÁ¿,°üÀ¨¸÷ÖÖĿ¼·¾¶µÄ¶¨Òå,½»²æ±àÒëÆ÷µÈµÈ.ÆäÖÐ
ifeq ($(DUMP),)
-include $(TOPDIR)/.config
endif
¾ÍÊÇ°üº¬ÁËÎÒÃǵÄÅäÖÃÎļþ.¶ÔÓÚMakefile
¶øÑÔ,.config
Îļþ¾ÍÊÇÒ»´ó´®±äÁ¿µÄ¶¨Òå.Makefile¿ÉÒÔÖ±½Ó¶ÁÈ¡ÕâЩ¶¨Òå,´Ó¶ø¿ØÖƱàÒë¹ý³Ì.
subdir.mk:
Õâ¸öÊǶÁ¶®ÎÒÃÇÕû¸ö±àÒë¹ý³ÌµÄ¹Ø¼üËùÔÚ,ÆäÖÐÖ÷Òª¶¨ÒåÁËÁ½¸öº¯Êý:subdirºÍstampfile,ÎÒÃÇÉÔºó¼ÓÒÔ½âÊÍ.
½ÓÏÂÀ´,°üº¬ÁË4¸öMakefileÎļþ.ÎÒÃÇÒÔtarget/Makefile
ΪÀý.¸ÃÎļþλÓÚtarget
Ŀ¼ÏÂ.
ºËÐIJ¿·ÖΪ:
$(eva l $(call stampfile,$(curdir),target,prereq,.config))
$(eva l $(call stampfile,$(curdir),target,compile,$(TMP_DIR)/.build))
$(eva l $(call stampfile,$(curdir),target,install,$(TMP_DIR)/.build))
$(eva l $(call subdir,$(curdir)))
ÕâÀïµ÷ÓÃÁËsubdir.mk
Öж¨ÒåµÄstampfile
º¯Êý.½«»áÉú³Étarget/stamp-prereq
,target/stamp-compile
,target/stamp-install
Èý¸ö±äÁ¿.
ÒÔtarget/stamp-prereq
ΪÀý,Ö´Ðв¿·ÖΪmake target/prereq
.ͬÀítarget/stamp-compile
,Ö´Ðв¿·ÖΪmake target/compile
.
×îºóÓÖµ÷ÓÃÁËsbudir
º¯Êý,Õâ¸öº¯Êý¹æ¶¨ÁËÄ¿±êºÍ¸÷×ÓÎļþ¼ÐÖ®¼äµÄÒÀÀµ¹Øϵ.Èç¹ûÓÐÒ»¶¨µÄMakefile»ù´¡¿ÉÒÔÈ¥¶Á¶Ásubdir.mk
Îļþ.
¾ÙÀý¶øÑÔ¾ÍÊÇ:
µ±Ö´ÐÐÄ¿±êΪtarget/compile
,Õâ¸öÄ¿±ê½«ÒÀÀµÓÚtarget/linux/compile
.
µ±Ö´ÐÐÄ¿±êΪpackage/compile
,Õâ¸öÄ¿±ê½«ÒÀÀµÓÚ