OpenWrt USE_SOURCE_DIR的作用

一. 前言

        我们都知道,OpenWrt在编译某个package时,默认情况下,会将package的源码拷贝到PKG_BUILD_DIR变量所在的路径下,然后再对package进行编译。这样其实会造成一点麻烦,就是不方便直接调试代码,如下面这种情况:

        比如我在package目录下有helloworld的package,下面有个src目录下有许多文件,并且已经建立好了代码工程,如下:

package
    |__helloworld
            |__src
            |   |__a.c
            |   |__b.c
            |   |__c.c
            |   .......
            |
            |__Makefile

          我们每次make package/helloworld/compile时,PKG_BUILD_DIR将会是这个代码的副本,当我们想要修改代码时,必须clean后,再运行compile,这样很麻烦,降低了调试的效率。

        于是USE_SOURCE_DIR就产生了,USE_SOURCE_DIR表示源代码的路径,这个例子就是openwrt/package/helloworld,PKG_BUILD_DIR会直接软链接到USE_SOURCE_DIR,这样编辑和编译使用的都是一套代码了。

二. Makefile分析

        看一下定义了USB_SOURCE_DIR后,处理会有什么不同,看include/package.mk文件,如下:

ifdef USE_SOURCE_DIR
  define Build/Prepare/Default
	rm -rf $(PKG_BUILD_DIR)
	$(if $(wildcard $(USE_SOURCE_DIR)/*),,@echo "Error: USE_SOURCE_DIR=$(USE_SOURCE_DIR) path not found"; false)
	ln -snf $(USE_SOURCE_DIR) $(PKG_BUILD_DIR)
	touch $(PKG_BUILD_DIR)/.source_dir
  endef
endif

        可以看到Build/Prepare/Default的定义改变了,首先,删除PKG_SOURCE_DIR目录,然后判断USB_SOURCE_DIR下是否有文件,没有则报错,有则将PKG_SOURCE_DIR链接到USB_SOURCE_DIR,最后创建$(PKG_BUILD_DIR)/.source_dir文件。

注意:使用了USB_SOURCE_DIR变量,Makefile中就不需要再定义Build/Prepare了,尤其是在其中定义了拷贝文件的命令,这样可能造成冲突。

三. 总结

        本文解释了USB_SOURCE_DIR的作用:方便对package源码的修改和调试。并对其机制进行了简单的分析。

你可能感兴趣的:(openwrt,linux)