1.现有方法存在的问题:
目前ESP32的官方开发框架ESP-IDF更新很快,我的电脑里已经存了好几个版本的ESP-IDF SDK了。尽管新版本的功能更强大,但旧版本的SDK中也有不少可以学习的知识,看到不同的编程优化思路。
每一个版本的SDK都需要配置编译工具所在的路径,以及配置工程路径的环境变量IDF_PATH。设置方法有两种:
1.1使用如下语句,导入SDK的编译工具和配置环境变量:
export PATH="$PATH:$HOME/esp/xtensa-esp32-elf/bin" (配置SDK编译工具所在路径)
export IDF_PATH=~/esp/esp-idf (配置环境变量)
通过语句执行的配置,仅在当前终端有效,退出当前终端或者系统重启后,上述配置就失效了,即不可以执行正常的编译了。
若需继续使用,需再次敲击上述命令完成当前终端的配置。
1.2 上述配置方法的原理
将上述语句,添加到‘~’目录下的.profile文件(这个文件在每次系统启动时就自动运行一次其中的命令),就可以保证上述配置一直有效,不需要每次使用都敲击1.1中的命令,就可以一直使用。(首次配置后,应重启系统,来使配置生效)
但是,当我们下载了多个版本的SDK时,1.2的这种看起来”很方便的“配置,存在很大问题。比如,我下载了v3.17版本的SDK,也下载了v4.01版本的SDK,他们的IDF_PATH,以及编译工具的PATH都需要设置,把他们都写入到.profile文件,会出现如下所示的重名现象:
最终,IDF_PATH,PATH被赋值了两次,将以最后一次赋值为最终的配置(即对v4.01版本的SDK的配置),因此对v3.17的配置将失效,我们将不能完成v3.17的正常编译。
能不能有一种方法,让我们同时快速完成多个版本的SDK的编译环境配置呢?
当然了,这里提供一种还算不错的方法:
2.解决方法:
切换到”~“目录下,运行 ls -al命令,查看该目录下的文件:
若有.bash_aliases文件就打开它,并添加以下内容:
(注意,我的SDK版本为v4.0、v3.22、v3.17,它们的编译工具,以及esp-idf工程目录在对应的esp4,esp322,esp317目录下,你可以依据你下载的SDK版本,以及具体的路径替换下述语句的相关目录路径。)
旧版本的idf 添加下述语句:
新版本的 idf 添加下述语句:
注意:上述截图中第一条语句的 “.”后有一个空格。
若没有,就创建它,并添加上述内容。
添加后,保存该文件,并重新启动系统或者使用命令source /home/xxx/.bashrc(注意使用正确的bashrc路径)刷新系统配置。
下面说一下如何使用:
如图,打开一个终端,输入printenv IDF_PATH,显示当前IDF_PATH的配置。同理,输入printenv PATH,显示当前PATH的配置。然后运行get_esp322命令,再输入printenv IDF_PATH,发现了没,我们/esp322/xtensa-esp32-elf/bin已经添加到PATH环境变量里了。再运行get_e322,输入printenv PATH,发现,IDF_PATH环境变量已经变为v3.2.2对应的/esp322/esp-idf了。
我们再打开一个终端,运行以下命令,并查看对应的环境变量。发现,输入get_esp317\get_e317也能完成对应于v3.17版本的SDK需要的配置。如此,在不同的终端中,我们输入不同的get_esp**命令就可以完成设置了,不用敲击过长的命令,也不必担心环境变量名会重复而导致环境变量被反复设置而被覆盖的问题。
3.上述设置的原理说明
上述设置文件中使用的aliase命令,是linux下给指令起别名的命令行工具,我们通过给export IDF_PATH=****这条长指令起别名来达到节省敲击的字符数的目的,也就是说,起别名后,执行get_esp32,就等效于在命令行输入了:
export PATH="$HOME/esp322/xtensa-esp32-elf/bin:$PATH
因此我们可以通过输入简单的命令,完成环境的配置。
另一方面,在”~“目录下的.bash_aliases是一个特殊的文件,它专门用来存放我们给其他命令起别名的设置。并且,每当新建一个终端,在终端启动时会自动运行一次这个文件里的指令,因此,对于不同版本的SDK,我们只需要新建一个终端,运行对应版本的指令,就可以实现当前终端的环境变量的配置,而不影响其他终端,做到多版本SDK开发的共存。
_.bashrc中有对.bash_aliases的说明:
即允许我们新建一个.bash_aliases文件来专门存放我们的起别名的操作。这正是上面我提到的一点。
在实践中注意修改对应的路径就可以了,该方法也适用于别的开发环境,多版本SDK共存处理的操作。