Введение
Все мы знаем, что когда OpenWrt компилирует пакет, по умолчанию он копирует исходный код пакета в путь, где находится переменная PKG_BUILD_DIR, а затем компилирует пакет. На самом деле это вызовет небольшие проблемы, то есть неудобно отлаживать код напрямую, например, в следующей ситуации:
Например, у меня есть пакет helloworld в каталоге пакета. В каталоге src ниже находится много файлов, и проект кода был установлен следующим образом:
package
|__helloworld
|__src
| |__a.c
| |__b.c
| |__c.c
| .......
|
|__Makefile
Каждый раз, когда мы делаем package/helloworld/compile, PKG_BUILD_DIR будет копией этого кода. Когда мы хотим изменить код, мы должны очистить его, а затем запустить компиляцию. Это очень хлопотно и снижает эффективность отладки.
Таким образом генерируется USE_SOURCE_DIR. USE_SOURCE_DIR представляет путь к исходному коду. Этот пример — openwrt/package/helloworld. PKG_BUILD_DIR будет напрямую связан с USE_SOURCE_DIR, так что редактирование и компиляция используют один набор кодов.
2. Анализ 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, нет необходимости определять Build/Prepare в Makefile, особенно если в нем определена команда копирования файлов, что может вызвать конфликты.
3. Резюме
В этой статье объясняется роль USB_SOURCE_DIR: облегчить модификацию и отладку исходного кода пакета. И был проведен простой анализ его механизма.