日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

aos make 配置环境

發布時間:2025/4/5 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 aos make 配置环境 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在一臺 Ubuntu 14.04 LTS 64-bit PC 上

?

sudo apt-get install -y python sudo apt-get install -y gcc-multilib sudo apt-get install -y libssl-dev libssl-dev:i386 sudo apt-get install -y libncurses5-dev libncurses5-dev:i386 sudo apt-get install -y libreadline-dev libreadline-dev:i386 sudo apt-get install -y python-pip sudo apt-get install -y minicom

2.2安裝 aos-cube

首先, 用 python 包管理器 pip 來安裝 aos-cube 和相關的依賴包在全局環境,以便于后續使用 AliOS Things Studio 進行開發。

?

$ pip install setuptools $ pip install wheel $ pip install aos-cube

請確認pip環境是基于 Python 2.7 的。如果遇到權限問題,可能需要 sudo 來執行。
如果在線安裝aos-cube失敗,可以下載源碼安裝,方法如下:

  • 先下載你要安裝的包,并解壓(aos-cube-0.2.46.tar.gz)
  • $ cd aos-cube-0.2.46
  • $ python setup.py build
  • $ python setup.py install

2.3下載代碼并編譯運行

?

git clone https://github.com/alibaba/AliOS-Things.git cd AliOS-Things aos make helloworld@linuxhost ./out/helloworld@linuxhost/binary/helloworld@linuxhost.elf

2.4效果

可以看見 app_delayed_action 在1秒時啟動,每5秒觸發一次。

?

[ 0.000]<V> AOS [application_start#15] : application started.[ 1.000]<V> AOS [app_delayed_action#9] : helloworld app_delayed_action:9 app_task[ 6.000]<V> AOS [app_delayed_action#9] : helloworld app_delayed_action:9 app_task[ 11.000]<V> AOS [app_delayed_action#9] : helloworld app_delayed_action:9 app_task[ 16.000]<V> AOS [app_delayed_action#9] : helloworld app_delayed_action:9 app_task[ 21.000]<V> AOS [app_delayed_action#9] : helloworld app_delayed_action:9 app_task

3 編譯過程

3.1 aos

2.2小結安裝了aos-cube,aos-cube封裝了一系列 AliOS Things使用的 Python包。
官方注解如下:

?

aos command line tool for repositories version control, publishing and updating code from remotely hosted repositories, and invoking aos own build system and export functions, among other operations

aos 用法如下:

?

[naiquanhu@naiquanhu-VirtualBox AliOS-Things]$ aos --help usage: aos [-h] [--version] ...Code management tool for aos - https://code.aliyun.com/aos/aos version 0.2.46Use 'aos <command> -h|--help' for detailed help. Online manual and guide available at https://code.aliyun.com/aos/aos-cubeoptional arguments:-h, --help show this help message and exit--version print version number and exitCommands:new Create new aos program or componentls List cube info, default components infoimport Import program from URLadd Add component from AOS_SDK_PATH or URLrm Remove componentdeploy Find and add missing components and source codescodes Import the optional component from the remote repositorypublish Publish program or componentupdate Update to branch, tag, revision or latestsync Synchronize aos component referencesstatus Show version control statusmake Make aos program/componentscons Make aos program/component by sconsmakelib Compile static libraryconfig Tool configurationupload Upload aos imagemonitor Serial port monitordevices List devices on serial portsupgrade Upgrade aos-cube to latesthelp This help screen

看一下aos程序內容:

?

which aos

/usr/local/bin/aos
vi /usr/local/bin/aos

?

#!/usr/bin/python # EASY-INSTALL-ENTRY-SCRIPT: 'aos-cube==0.2.46','console_scripts','aos' __requires__ = 'aos-cube==0.2.46' import sys from pkg_resources import load_entry_pointif __name__ == '__main__':sys.exit(load_entry_point('aos-cube==0.2.46', 'console_scripts', 'aos')())

/usr/local/bin/aos會調用aos-cube-0.2.46/aos/aos.py

3.2 aos調用make過程

?

aos make helloworld@linuxhost

該命令會首先進入aos/aos.py中的main()

?

def _run_make(arg_list):#install dependent toolchains_install_toolchains(sys.argv[2:])# check operating systemhost_os = get_host_os()if host_os == None:error('Unsupported Operating System!')#cd to aos root_dirret, original_dir = cd_aos_root()if ret != 'success':error("not in AliOS-Things source code directory")make_cmds = {'Win32': 'cmd/win32/make.exe','Linux64': 'cmd/linux64/make','Linux32': 'cmd/linux32/make','OSX': 'cmd/osx/make'}tools_dir = os.path.join(os.getcwd(), 'build').replace('\\', '/')make_cmd = os.path.join(tools_dir, make_cmds[host_os])# Run make commandmake_cmd_str = ' '.join([make_cmd, 'HOST_OS=' + host_os, 'TOOLS_ROOT=' + tools_dir] + list(arg_list))popen(make_cmd_str, shell=True, cwd=os.getcwd())if os.path.isdir(original_dir): os.chdir(original_dir)def make_build(make_args):# aos new programif os.path.isfile(os.path.join(os.getcwd(), Cfg.file)):...with cd(os_path):..._run_make(['-e', '-f build/Makefile', make_args, app_dir, build_dir])else:# aos source code_run_make(['-e', '-f build/Makefile', make_args])# Make command @subcommand('make',help='Make aos program/component',description="Make aos program/component.") def make():...args = sys.argv[2:]...make_args = ' '.join(args)for arg in args:if '@' in arg: targets = arg.split('@')...board = targets[1]if board in get_scons_enabled_boards():scons_build(args)else:make_build(make_args)return#aos make clean go heremake_build(make_args)def main():...# Parse/run commandif len(sys.argv) <= 1:help_()sys.exit(1)...pargs, remainder = parser.parse_known_args()status = 1try:...status = pargs.command(pargs)except ProcessException as e:...sys.exit(status or 0)if __name__ == "__main__":main()

簡單來說,調用關系如下:

?

aos make helloworld@linuxhost|-- make()|-- make_build()|-- _run_make(arg_list)|-- popen(make_cmd_str, shell=True, cwd=os.getcwd())

變量的值:
build_dir = 'BUILD_DIR=./out/'
app_dir = 'APPDIR=./'
make_args = helloworld@linuxhost
arg_list = ['-e', '-f build/Makefile', make_args, app_dir, build_dir]
make_cmd = ./build/cmd/linux64/make
make_cmd_str = make_cmd + 'HOST_OS=Linux64' + 'TOOLS_ROOT=./build' + + list(arg_list)

其中,popen是Python的標準庫中的subprocess包的類,用來fork一個子進程并運行一個外部程序,進入 ./build/Makefile

3.3 make入口

build/Makefile是make的主入口,傳入的參數有:
HOST_OS=Linux64
TOOLS_ROOT=./build
BUILD_DIR=./out/
APPDIR=./
make_args = helloworld@linuxhost

我們先來看看build/Makefile中的一些關鍵內容:

?

export SOURCE_ROOT ?= ./ #AliOS-Things 的根目錄 export MAKEFILES_PATH := $(SOURCE_ROOT)/build #MAKEFILES_PATH = ./build export SCRIPTS_PATH := $(SOURCE_ROOT)/build/scripts #SCRIPTS_PATH = ./build/scripts MAKEFILE_TARGETS := clean#define BUILD_STRING, AOS toolchain commands on different hosts include $(MAKEFILES_PATH)/aos_host_cmd.mk #./build/aos_host_cmd.mk

接著看一下文件./build/aos_host_cmd.mk:

?

TOOLS_ROOT ?= $(SOURCE_ROOT)build #TOOLS_ROOT = ./build COMPILER_ROOT ?=$(TOOLS_ROOT)/compiler #COMPILER_ROOT = ./build/compiler OPENOCD_PATH := $(TOOLS_ROOT)/OpenOCD/${HOST_OS}/ #OPENOCD_PATH = ./build/OpenOCD/Linux64/ OPENOCD_CFG_PATH := $(MAKEFILES_PATH)/OpenOCD/${HOST_OS}/ #OPENOCD_CFG_PATH = ./build/OpenOCD/Linux64/ JTAG ?= jlink_swd BUILD_DIR ?= out ... COMMON_TOOLS_PATH := $(TOOLS_ROOT)/cmd/linux64/ #COMMON_TOOLS_PATH = ./build/cmd/linux64/ export SHELL = $(COMMON_TOOLS_PATH)dash #SHELL = ./build/cmd/linux64/dash OPENOCD_FULL_NAME := "$(OPENOCD_PATH)bin/openocd" #OPENOCD_FULL_NAME = ./build/OpenOCD/Linux64/bin/openocd ECHO := echo PERL := $(shell which perl) PYTHON := $(shell which python) CLEAN_COMMAND := "$(COMMON_TOOLS_PATH)rm" -rf $(BUILD_DIR) #CLEAN_COMMAND = "./build/cmd/linux64/rm" -rf out MKDIR = "$(COMMON_TOOLS_PATH)mkdir" -p $1 #MKDIR = "./build/cmd/linux64/mkdir" -p $1 RMDIR = "$(COMMON_TOOLS_PATH)rm" -rf $1 #RMDIR = "./build/cmd/linux64/rm" -rf $1 CPDIR = "$(COMMON_TOOLS_PATH)cp" -rf $1 $2 #CPDIR = "./build/cmd/linux64/cp" -rf $1 $2 TRUE_CMD := true FALSE_CMD := false RM := "$(COMMON_TOOLS_PATH)rm$(EXECUTABLE_SUFFIX)" -f #RM = "./build/cmd/linux64/rm" -f CP := "$(COMMON_TOOLS_PATH)cp$(EXECUTABLE_SUFFIX)" -f #CP = "./build/cmd/linux64/cp" -f MAKE := "$(COMMON_TOOLS_PATH)make$(EXECUTABLE_SUFFIX)" #MAKE = "./build/cmd/linux64/make" BIN2C := "$(COMMON_TOOLS_PATH)bin2c$(EXECUTABLE_SUFFIX)" #BIN2C = "./build/cmd/linux64/bin2c" CURRENT_TIME = $(shell $(DATE) +%Y%m%d.%H%M) SHOULD_I_WAIT_FOR_DOWNLOAD := $(filter download, $(MAKECMDGOALS)) #因為MAKECMDGOALS = helloworld@linuxhost,所以 SHOULD_I_WAIT_FOR_DOWNLOAD = null BUILD_STRING ?= $(strip $(filter-out $(MAKEFILE_TARGETS) download run total, $(MAKECMDGOALS))) #BUILD_STRING = "helloworld@linuxhost" BUILD_STRING_TO_DIR = $(subst .,/,$(1)) #BUILD_STRING_TO_DIR = null DIR_TO_BUILD_STRING = $(subst /,.,$(1)) #DIR_TO_BUILD_STRING = null CLEANED_BUILD_STRING := $(BUILD_STRING) #CLEANED_BUILD_STRING = "helloworld@linuxhost" OUTPUT_DIR := $(BUILD_DIR)/$(CLEANED_BUILD_STRING)$(MBINS) #OUTPUT_DIR = "out/helloworld@linuxhost" AUTO_COMPONENT_DIR := $(OUTPUT_DIR)/auto_component #AUTO_COMPONENT_DIR = "out/helloworld@linuxhost/auto_component"

主要設置了一些和host os相關的參數。
接著build/Makefile文件繼續看,由于IDE = null,則COMPILER = null

?

include $(MAKEFILES_PATH)/aos_toolchain_gcc.mk AUTO_COMPONENT = $(AUTO_COMPONENT_DIR)/auto_component.mk #AUTO_COMPONENT = "out/helloworld@linuxhost/auto_component/auto_component.mk" TEST_COMPONENT_COLLECTION = $(AUTO_COMPONENT_DIR)/test_collection.default #TEST_COMPONENT_COLLECTION = "out/helloworld@linuxhost/auto_component/test_collection.default"$(AUTO_COMPONENT): $(TEST_COMPONENT_COLLECTION)$(QUIET)$(PYTHON) $(MAKEFILES_PATH)/scripts/auto_component.py $(AUTO_COMPONENT_DIR)$(TEST_COMPONENT_COLLECTION):$(QUIET)$(PYTHON) $(MAKEFILES_PATH)/scripts/gen_test_collection.py $(AUTO_COMPONENT_DIR) $(TEST_COMPONENT_COLLECTION)

設置完一些變量的值后,執行2條python指令:

?

python ./build/scripts/gen_test_collection.py ./out/helloworld@linuxhost/auto_component ./out/helloworld@linuxhost/auto_component/test_collection.defaultpython ./build/scripts/auto_component.py ./out/helloworld@linuxhost/auto_component

命令:

?

aos make helloworld@linuxhost

該命令最先調用的targe是main_app:

?

main_app: $(OUTPUT_DIR)/config.mk $(YOS_SDK_PRE_APP_BUILDS) $(MAKEFILES_PATH)/aos_target_build.mk$(if $(BINS_ERROR), $(call BINS_EXIT))$(if $(MBINS_ERROR), $(call MBINS_EXIT))$(QUIET)$(ECHO) Build AOS Now$(QUIET)$(ECHO) TOOLCHAIN_PATH=$(TOOLCHAIN_PATH)$(QUIET)$(call MKDIR, $(OUTPUT_DIR)/binary)$(QUIET)$(call MKDIR, $(OUTPUT_DIR)/modules)$(QUIET)$(call MKDIR, $(OUTPUT_DIR)/libraries)$(QUIET)$(call MKDIR, $(OUTPUT_DIR)/resources)$(QUIET)$(PYTHON) $(MAKEFILES_PATH)/scripts/gen_auto_code.py $(OUTPUT_DIR)/config.mk $(AUTO_COMPONENT_DIR)$(QUIET)$(MAKE) -r $(JOBSNO) $(SILENT) -f $(MAKEFILES_PATH)/aos_target_build.mk $(CLEANED_BUILD_STRING) $(PASSDOWN_TARGETS)$(QUIET)$(ECHO) Build complete

main_app又依賴$(OUTPUT_DIR)/config.mk,即out/helloworld@linuxhost/config.mk,所以先調用build/aos_target_config.mk生成out/helloworld@linuxhost/config.mk,完成后,主要做了兩件事:

  • /usr/bin/python .//build/scripts/gen_auto_code.py out/helloworld@linuxhost/config.mk out/helloworld@linuxhost/auto_component
    根據out/helloworld@linuxhost/config.mk生成out/helloworld@linuxhost/auto_component下的文件。
  • ./build/cmd/linux64/make -r -j4 -f .//build/aos_target_build.mk helloworld@linuxhost
    進入./build/aos_target_build.mk 繼續編譯。



作者:蝴蝶泉nq
鏈接:https://www.jianshu.com/p/5388f6754b59
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

總結

以上是生活随笔為你收集整理的aos make 配置环境的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。