1 00:00:00,001 --> 00:00:16,400 Welcome to the CircuitPython Show. I'm your host, Paul Cutler. This episode I'm joined by CircuitPython Core Developer Dan Halbert. Dan first visited the show back in episode 28, which I've linked to in the show notes. Dan, welcome back to the show. 2 00:00:17,060 --> 00:00:22,580 Thank you very much, Paul. It was great to be on last time and I'm really looking forward to this session as well. 3 00:00:23,000 --> 00:00:30,540 In the last episode, I chatted with Brayden Lane about designing a PCB. That's a time when someone might want to build CircuitPython for their new board. 4 00:00:31,360 --> 00:00:33,960 When else would someone want to build CircuitPython from source? 5 00:00:35,140 --> 00:00:41,280 There are a bunch of different reasons why somebody might want to build CircuitPython. I mean, one is just to see how it's done. 6 00:00:42,080 --> 00:00:44,060 But usually somebody has some motivation. 7 00:00:45,160 --> 00:00:48,320 One thing that happens often is that they want to turn a feature on or off. 8 00:00:49,000 --> 00:00:53,640 or they need to make room, they want to turn on a feature and we say oh that feature doesn't fit, 9 00:00:54,380 --> 00:00:59,960 but if you turn on this off this other thing you can turn on this thing and so that's a common 10 00:01:00,160 --> 00:01:05,720 reason to do that. Another common reason is that they've got some new board that they want to 11 00:01:05,840 --> 00:01:12,000 support and so they want to try to make a build for it and test it and then maybe submit it as 12 00:01:12,040 --> 00:01:17,880 a pull request if they think that other people would be interested as well. Another reason is 13 00:01:17,880 --> 00:01:23,280 because they want to add some frozen modules, because they want a build that comes with some 14 00:01:23,920 --> 00:01:27,900 libraries already built in. For instance, they want to distribute a build to some other, to 15 00:01:28,240 --> 00:01:34,920 like users of their software, for instance, something like that. And yet another reason is 16 00:01:35,020 --> 00:01:41,640 that there's a problem and they want to debug it. So there's, it could just be that they want to 17 00:01:42,520 --> 00:01:49,060 run a debugger or put in some logging printouts. We might suggest that if they're having trouble. 18 00:01:50,160 --> 00:01:56,420 Or they might want to do what's called a git bisect, where you take two versions and you like 19 00:01:56,500 --> 00:02:00,860 take some versions, you know, have a version that you know works and to say the latest version 20 00:02:00,940 --> 00:02:05,860 doesn't work. And then you want to find out, well, where was the change that broke it? So what git 21 00:02:05,960 --> 00:02:11,580 bisect does is that it divides things up. It'll go to the middle of that range of commits. 22 00:02:12,280 --> 00:02:16,720 And then you say, it did work or it didn't work. You build it and say it did work or it didn't work. 23 00:02:16,820 --> 00:02:21,620 And then it keeps dividing. It does a divide and conquer thing until you get down to the commit. 24 00:02:22,100 --> 00:02:27,060 So let's dive in. What is the process for building CircuitPython? What are the prerequisites? 25 00:02:27,380 --> 00:02:29,280 What should someone think about before they start? 26 00:02:29,500 --> 00:02:33,860 Sure. Well, first of all, I would say before you start building it, you have to look 27 00:02:33,920 --> 00:02:40,120 at the building CircuitPython guide, which you can find on learn.adafruit.com. And we try to 28 00:02:40,120 --> 00:02:46,140 keep that guide up to date. Just before this podcast, I was reviewing it and I found a bunch 29 00:02:46,200 --> 00:02:51,300 of things that I wanted to update. So if you find something that's broken, tell us. 30 00:02:52,300 --> 00:03:02,060 We do development of CircuitPython on Linux. I use Ubuntu version 24.04. Jeff uses Debian, 31 00:03:02,300 --> 00:03:08,660 but it's very close to that version because Ubuntu is a Debian-based distribution. Scott uses Arch, 32 00:03:09,400 --> 00:03:15,160 which is kind of more up to date, but he also knows how it differs from kind of more vanilla 33 00:03:15,480 --> 00:03:22,840 distributions. So in all cases, it's easiest if you start with a Linux distribution. And that's 34 00:03:22,920 --> 00:03:27,320 what I'd recommend if you're at all familiar with command line stuff, even if you're already 35 00:03:27,480 --> 00:03:33,080 familiar with command line stuff, say on Mac OS, you can build on Mac OS, but there are always 36 00:03:33,220 --> 00:03:39,380 things that change. So I'd say start with Linux. And there's some descriptions about how to do 37 00:03:39,380 --> 00:03:46,120 Then, just go through that build guide. There's a bunch of pages under the introduction page 38 00:03:46,220 --> 00:03:52,320 about how to set up your system to build. You have to install a bunch of packages, both 39 00:03:52,560 --> 00:03:57,880 system packages and also Python packages. There's a page about setting up for Linux. 40 00:03:58,020 --> 00:04:09,360 There's a page for setting up under Mac OS, which details some idiosyncrasies. There's 41 00:04:09,360 --> 00:04:15,520 basically Linux running inside Windows, and it really is pretty much just like using Linux. 42 00:04:15,660 --> 00:04:20,540 So it's kind of a substitute for setting up Linux instead of using a virtual machine. 43 00:04:20,880 --> 00:04:26,460 In many ways, it's somewhat easier. So there's a page for that. And then there's some stuff 44 00:04:26,580 --> 00:04:32,440 about, well, if you had some more idiosyncratic Linux distribution, how you use that. And 45 00:04:32,440 --> 00:04:36,260 I'll also say that there's something that which I haven't tried, but there's a technique 46 00:04:36,260 --> 00:04:42,440 for using GitHub Codespaces, which lets you use kind of a pre-packaged Linux environment, 47 00:04:42,780 --> 00:04:48,360 and there's a link to that. User Bablock B has described how to do that. There are a 48 00:04:48,400 --> 00:04:54,980 whole bunch of steps of getting things set up, and then it's best if you fork CircuitPython. 49 00:04:55,240 --> 00:04:59,300 You could use the Adafruit, you could clone the Adafruit thing, but if you're thinking 50 00:04:59,400 --> 00:05:03,020 of making any pull requests or anything like that, it's probably easier if you fork it. 51 00:05:03,940 --> 00:05:11,180 a branch right away and then just start building and follow the instructions. If you're building 52 00:05:11,360 --> 00:05:16,760 on Espressif, there's a special page for that as well. So what are some of the different things 53 00:05:17,060 --> 00:05:22,020 that someone might want to know between the different ports between a Broadcom build and 54 00:05:22,140 --> 00:05:27,620 an Espressif build? Are there any big gotchas that come to mind? Sure. So many of the ports 55 00:05:27,620 --> 00:05:35,260 are straightforward. We use git submodules a lot which pull in various pieces of third-party 56 00:05:35,620 --> 00:05:43,600 software. So for each port, in most cases, there's some port-specific submodules that you need to add. 57 00:05:44,600 --> 00:05:49,280 There's a description in the build guide of how to fetch submodules. You can fetch all the 58 00:05:49,460 --> 00:05:54,360 submodules for all the ports. That takes a long time, and if you're on a slow network connection, 59 00:05:54,360 --> 00:05:55,480 you might not want to do that. 60 00:05:56,300 --> 00:06:00,060 You can also fetch the sub modules for just a specific port 61 00:06:00,120 --> 00:06:02,340 and that's explained in the guide. 62 00:06:02,540 --> 00:06:04,200 So once you have the sub modules, 63 00:06:05,120 --> 00:06:08,420 then you can just pick a board in that port 64 00:06:08,780 --> 00:06:11,420 and type make capital board equals 65 00:06:11,460 --> 00:06:12,560 and the name of the board. 66 00:06:13,120 --> 00:06:15,460 And it will start building that. 67 00:06:15,800 --> 00:06:18,760 If you typed make in a ports directory without, 68 00:06:19,500 --> 00:06:20,280 without a board name, 69 00:06:20,300 --> 00:06:22,380 but actually will list you all the board names, 70 00:06:22,960 --> 00:06:27,640 Which for say the Espressif port, there can be, there's more than a hundred or 71 00:06:27,780 --> 00:06:29,940 hundreds even, that's an easy way. 72 00:06:30,060 --> 00:06:33,060 If you don't remember the board name, or you could look in the boards directory 73 00:06:33,220 --> 00:06:35,700 and find the directory name, that's the board name. 74 00:06:36,920 --> 00:06:41,000 For example, on the Espressif builds, it actually pulls in its own Python virtual 75 00:06:41,200 --> 00:06:42,740 environment and builds within that. 76 00:06:43,360 --> 00:06:44,600 So the user doesn't have to do that. 77 00:06:44,660 --> 00:06:45,200 Is that correct? 78 00:06:45,960 --> 00:06:50,540 You have to run some scripts to set up what it needs for Python. 79 00:06:51,380 --> 00:06:56,740 I'll back up a little bit to say that we use Python a lot in the build process. 80 00:06:57,880 --> 00:07:03,300 It used to be say in Ubuntu 22.04 that we just install various Python 81 00:07:03,560 --> 00:07:09,380 modules and libraries right into your own user space, okay, where you, and you'd 82 00:07:09,460 --> 00:07:15,400 share that with all your other uses of Python beginning in Ubuntu 24.04. 83 00:07:16,200 --> 00:07:17,400 You can't do that. 84 00:07:17,520 --> 00:07:20,820 You have to create what's called a virtual environment or a VM. 85 00:07:21,160 --> 00:07:44,240 There are directions for how to do that in the build guide. So you're right, Espressif sets up its own VM. And if you have one already set up, you can't set up a VN inside of VN. So the Espressif build tools will complain and say, you can't do that. And so I describe in the Espressif builds page how to get out of your VM and get into their VM that they create. 86 00:07:44,240 --> 00:08:05,040 For the Broadcom ports, those are very unusual. Those are these, they run on bare metal Raspberry Pi, you know, 345 say and Pi Zero. We're not talking about Pi Pico, okay? There are a lot of things named Raspberry Pi, but we're talking about the boards that can run Linux. 87 00:08:05,240 --> 00:08:28,100 And in that case, you need a separate version of the GCC compiler and its associated tools that specialize for that Broadcom chip. Or it's called a Cortex-A chip. It's a kind of ARM chip. Most of the other boards are Cortex-M ARM chips. Not all of them, but many, many of them are. 88 00:08:28,240 --> 00:08:36,340 So, to back up a little bit, one of the things you have to do to do a setup is install the 89 00:08:36,419 --> 00:08:40,380 GCC toolchain that's maintained by ARM in most cases. 90 00:08:41,280 --> 00:08:45,920 The Expressif build tools do that for you, but in most cases you have to do it by hand. 91 00:08:46,000 --> 00:08:49,760 And we describe how to do that and which version to use, because if you use the wrong version 92 00:08:49,840 --> 00:08:53,820 of the compiler, too old or too new, then you're going to get compiler errors. 93 00:08:54,140 --> 00:08:56,100 You're going to get compilation errors when you do a build. 94 00:08:56,760 --> 00:08:59,760 So pay attention to that in the build guide. 95 00:09:00,340 --> 00:09:02,420 It's definitely something that people need to pay attention to. 96 00:09:02,640 --> 00:09:04,940 It's very easy to get the wrong version of GCC. 97 00:09:05,900 --> 00:09:06,700 Yeah, exactly. 98 00:09:07,860 --> 00:09:15,160 And I also would say that this is a detailed, very complicated process, and you're probably 99 00:09:15,280 --> 00:09:16,680 going to get stuck at some point. 100 00:09:17,320 --> 00:09:24,779 And feel free to ask for help in Discord in the CircuitPython dev channel, which is where 101 00:09:24,780 --> 00:09:30,580 the developers hang out and we can help you along and get you over whatever stumbling block that 102 00:09:30,660 --> 00:09:36,460 you're encountering. That's good advice as well. So we've gone through the guide and we've got 103 00:09:36,720 --> 00:09:41,760 CircuitPython building from source and we've got our PCB that we designed in our last episode as 104 00:09:41,780 --> 00:09:48,059 well. What needs to happen next to add that board to CircuitPython? So what you might want to do is 105 00:09:48,060 --> 00:09:55,660 find a board that's kind of like your board. You made a simple SAMD21 board, say. And I think 106 00:09:55,760 --> 00:09:59,720 Bradan Lane's board, I'm not sure which chip it is. I think it's one of the SAMD chips. 107 00:10:00,180 --> 00:10:00,620 >> I believe so. 108 00:10:00,840 --> 00:10:08,060 >> Yeah. So find a board that's like your board, look in the boards directory in the port for your 109 00:10:08,200 --> 00:10:14,120 chip and, or chip family, and just find one that's pretty similar. And in that boards directory, 110 00:10:14,120 --> 00:10:25,080 you'll find a bunch of files. There's mpconfigboard.h, mpconfigboard.mk, pins.c, and board.c. 111 00:10:26,380 --> 00:10:32,780 And those all need to be customized for your particular board. In some cases, you can use the 112 00:10:32,920 --> 00:10:38,560 boilerplate version of those and change just a few things. But the easiest thing to do is create a 113 00:10:38,600 --> 00:10:43,540 directory for your new board, give it a name, put the manufacturer name at the front of the name, 114 00:10:43,540 --> 00:10:51,000 and then the name of the board and separate them with underscores. And then copy some board files 115 00:10:51,100 --> 00:10:56,960 from the most similar board and then start editing them. It's always better to start by 116 00:10:57,580 --> 00:11:02,420 changing an existing thing than starting from scratch. There's also for expressive boards, 117 00:11:02,560 --> 00:11:13,520 there's yet another file called SDK config that you also need to copy and change. So 118 00:11:13,520 --> 00:11:21,560 and its USB identifiers and some other things like how much flash there is, which flash chips 119 00:11:21,660 --> 00:11:29,220 you're using. Pins.c gives the name of the pins and also other things that are in board, 120 00:11:29,940 --> 00:11:39,040 like board.i2c or board.stemi2c if you have a stem connector. And board.c has optionally routines 121 00:11:39,040 --> 00:11:44,880 that set up the board. Like you have an if you have an on board display, then you want to write 122 00:11:44,960 --> 00:11:50,280 some code that runs as soon as the board starts that sets up the display so you can see the REPL 123 00:11:50,340 --> 00:11:58,420 output on the display. On many boards that don't have display, board.c is just empty. It uses some 124 00:11:58,520 --> 00:12:05,680 default routines. So all those things happen and then you can do a build and then try to copy the 125 00:12:05,680 --> 00:12:10,160 the UF2 or the dot bin onto your board and see what happens. 126 00:12:11,180 --> 00:12:14,020 Usually you can just do run make over and over again. 127 00:12:15,240 --> 00:12:17,300 If you make certain kinds of changes, 128 00:12:17,600 --> 00:12:20,960 like you add new strings or new error messages 129 00:12:21,540 --> 00:12:25,380 or a new MPQster, which is a special kind of string name, 130 00:12:25,820 --> 00:12:27,920 then do a make clean first, 131 00:12:28,780 --> 00:12:31,100 because otherwise you'll get weird errors. 132 00:12:32,240 --> 00:12:34,360 And that's also true in Espressif. 133 00:12:34,400 --> 00:12:37,980 if you make some changes to the ESP IDF settings, 134 00:12:38,980 --> 00:12:40,340 then you'll need to do a make clean, 135 00:12:40,520 --> 00:12:44,300 because otherwise it won't rebuild the ESP IDF part 136 00:12:44,400 --> 00:12:46,880 of the base software, rebuild that. 137 00:12:47,860 --> 00:12:50,060 - When you're updating the pins.c file 138 00:12:50,340 --> 00:12:53,120 with the pin information, this is the file 139 00:12:53,240 --> 00:12:54,900 where you want to match the silk screen 140 00:12:55,040 --> 00:12:56,900 to what you put into the pins file, is that correct? 141 00:12:57,880 --> 00:12:59,900 - Yes, there's a guide called, 142 00:13:00,240 --> 00:13:02,340 how to add a new board to CircuitPython, 143 00:13:03,120 --> 00:13:06,320 And that describes in detail about changing these, 144 00:13:07,080 --> 00:13:08,380 copying these files and changing them. 145 00:13:08,460 --> 00:13:11,260 It's not in the main building sort of Python guide, 146 00:13:11,440 --> 00:13:14,540 but it's in the sidebar of that guide. 147 00:13:15,000 --> 00:13:16,540 So that describes how to change all these. 148 00:13:16,580 --> 00:13:19,820 And it describes also kind of the naming conventions 149 00:13:20,100 --> 00:13:20,720 for the pins. 150 00:13:21,220 --> 00:13:23,660 Like you do want to make them match up with the silk. 151 00:13:24,300 --> 00:13:26,160 If they're just numbers, they can't be that. 152 00:13:26,260 --> 00:13:30,080 So it says like put a D or a GP or an IO in front, 153 00:13:30,660 --> 00:13:31,900 depending on the board family. 154 00:13:32,940 --> 00:13:39,180 Look at an existing board and in that board family, there's like a sort of a typical nomenclature. 155 00:13:39,800 --> 00:13:46,380 There are often canonical names for things. So try to copy those names if you can. The best reason 156 00:13:46,480 --> 00:13:51,960 for copying names is that it means that any particular piece of software can run on more 157 00:13:52,040 --> 00:13:56,840 than one board without changes or with easy changes. Oh, that makes sense. I hadn't thought 158 00:13:56,920 --> 00:14:02,300 about that. One of the things you mentioned in passing earlier was that you need to have a vendor 159 00:14:02,300 --> 00:14:10,480 ID and a product ID for the USB device. When and how does someone get a VID and a PID to add to their device? 160 00:14:10,920 --> 00:14:32,280 Yeah, that can be a sticking point. So USB vendor IDs and product IDs are both 16-bit numbers. So a vendor ID comes from the USB organization. Maybe it's a foundation, I can't remember. But it's at usb.org. And in order to get an 161 00:14:32,280 --> 00:14:40,900 one, you have to pay thousands of dollars. All right? So Adafruit got one a long time 162 00:14:41,020 --> 00:14:47,380 ago and most manufacturers of some size got them. But that's a lot of money if you're 163 00:14:47,400 --> 00:14:51,800 just building a hobby board or something like that. So how do you get around that problem? 164 00:14:52,280 --> 00:15:00,360 Well, you could just invent or reuse USB, VID, and PID, but we're not going to add 165 00:15:00,360 --> 00:15:05,660 that board to the list of CircuitPython boards if you invent one or just make one up because 166 00:15:05,900 --> 00:15:11,760 it's unofficial and it's sort of like not, it's easy to get in trouble that way, kind 167 00:15:11,840 --> 00:15:11,900 of. 168 00:15:12,540 --> 00:15:12,620 Sure. 169 00:15:13,100 --> 00:15:20,140 It's true that many manufacturers, small manufacturers, steal the IDs and PDs or just make them up, 170 00:15:20,180 --> 00:15:20,940 but don't do that. 171 00:15:21,660 --> 00:15:30,660 So there are a few USB vendor IDs that are retired and some people have taken over those 172 00:15:31,100 --> 00:15:36,180 vendor IDs and have been issuing product IDs under those vendor IDs. 173 00:15:36,660 --> 00:15:42,780 There's a website called pid.codes which you can go to and get one for free. 174 00:15:43,860 --> 00:15:49,420 It involves submitting a pull request to a GitHub repo and Scott is one of the people 175 00:15:49,420 --> 00:15:58,480 who can assign vendor IDs through that repo. If you're making a, an expressive board or 176 00:15:58,820 --> 00:16:08,460 a Raspberry Pi RP2 something board, then you can apply to those manufacturers for a product 177 00:16:08,740 --> 00:16:14,380 ID and they will assign you one. Usually only takes a week or two. There's a mechanism for, 178 00:16:14,920 --> 00:16:21,520 both of those to do that. You use their vendor ID and they are allowed to give away product IDs 179 00:16:22,220 --> 00:16:26,520 under that vendor ID. So both of those things will work. 180 00:16:27,240 --> 00:16:29,940 >> So that's almost something you want to be doing in parallel while you're 181 00:16:30,300 --> 00:16:33,340 building CircuitPython for the first time since it takes a week or two to get one. 182 00:16:33,620 --> 00:16:38,880 >> If you are interested in submitting a board, yes. If you just want to build CircuitPython, 183 00:16:38,960 --> 00:16:42,960 you don't have to do this at all. Or if you just want to experiment and build your own board, 184 00:16:43,160 --> 00:16:48,300 Nobody cares what the product ID, you know, you're not distributing it. So it doesn't matter. 185 00:16:49,240 --> 00:16:53,640 So for those who are distributing it, we've got CircuitPython running on our new board with a VID 186 00:16:53,800 --> 00:17:00,000 and PID. You want to add it to CircuitPython.org so it gets built every time when a new version 187 00:17:00,080 --> 00:17:03,220 of CircuitPython is released. How does that process work? 188 00:17:03,660 --> 00:17:09,560 Okay, so it gets built whether or not it's on CircuitPython.org. CircuitPython.org doesn't 189 00:17:09,560 --> 00:17:14,439 determine what's built. What determines what's built is what's in the CircuitPython source tree. 190 00:17:14,939 --> 00:17:22,640 But for it to show up as something that you can download, when you submit a pull request to 191 00:17:22,839 --> 00:17:29,760 CircuitPython data board, we ask that you submit a parallel pull request to CircuitPython.org. 192 00:17:30,360 --> 00:17:39,540 And that's also explained in the how to add a new board to CircuitPython. So there's sort of a 193 00:17:39,540 --> 00:17:45,420 There's a fixed set of features that you can say it does or doesn't have. And we want you to take 194 00:17:45,560 --> 00:17:52,540 pictures of it, clear pictures, and supply three different pictures in different resolutions. And 195 00:17:52,540 --> 00:17:57,800 that's all explained in the "How to Add a New Board to CircuitPython." When this happens, you 196 00:17:57,820 --> 00:18:01,940 know, when you start submitting a pull request, like it's going to go through, go ahead and submit 197 00:18:02,820 --> 00:18:07,540 a pull request to circuitpython.org, or we'll remind you. Because we're not going to finalize 198 00:18:07,540 --> 00:18:13,560 the whole thing until both of those things are ready. That makes sense. Thinking back through 199 00:18:13,640 --> 00:18:18,260 this process, are there any things that come to mind where people get stuck or challenges that 200 00:18:18,380 --> 00:18:23,300 they seem to run into more often than not? I would say make sure that you install the 201 00:18:23,440 --> 00:18:28,160 correct version of GCC. A lot of people just say, "Oh, I'm just going to install the one that comes 202 00:18:28,260 --> 00:18:37,520 from Ubuntu." The compiler that we use for the ARM chips is called ARM-NUN-EABI-GCC. But if you just 203 00:18:37,520 --> 00:18:43,880 the version that comes in the Ubuntu or Debian distribution, it's the wrong one. So don't do that. 204 00:18:45,680 --> 00:18:52,980 Another thing is we haven't mentioned, but is that we use pre-commit, which is the thing that reviews 205 00:18:53,040 --> 00:18:58,320 your changes before you make a commit, and it checks formatting and other things like that in 206 00:18:58,900 --> 00:19:05,960 advance. And so it's explained in the build guide about how to set up pre-commit. That will save you 207 00:19:05,960 --> 00:19:13,740 a lot of round trip time because otherwise you'll be making simple, say formatting mistakes. 208 00:19:13,880 --> 00:19:17,400 And when you submit the pull request, you'll have to wait for the bill to complete and 209 00:19:17,400 --> 00:19:18,280 then it will take a long time. 210 00:19:18,420 --> 00:19:22,940 So pre-commit will check for that stuff in advance because we run pre-commit when you 211 00:19:23,000 --> 00:19:24,220 submit a pull request also. 212 00:19:24,540 --> 00:19:26,880 So it's, you got to pass that one way or the other. 213 00:19:27,440 --> 00:19:28,020 That makes sense. 214 00:19:28,800 --> 00:19:29,040 Yeah. 215 00:19:29,400 --> 00:19:32,700 Getting, getting the expressive field right is, is a lot of trouble. 216 00:19:33,400 --> 00:19:36,180 So we sometimes have to guide people through that. 217 00:19:36,600 --> 00:19:39,620 And dealing with the Python virtual environments 218 00:19:40,320 --> 00:19:41,800 is tricky because a lot of people 219 00:19:42,080 --> 00:19:43,220 haven't used that in the past. 220 00:19:43,840 --> 00:19:46,600 And also, when in doubt, do a clean build in case 221 00:19:46,660 --> 00:19:49,480 you're getting odd build errors because you may obtain 222 00:19:49,860 --> 00:19:55,520 something in which you need to start from a clean build. 223 00:19:56,240 --> 00:19:58,400 And if you're building on Mac OS, 224 00:19:58,760 --> 00:20:01,860 getting the right Python version is very difficult. 225 00:20:02,200 --> 00:20:07,660 you know there's an XKCD cartoon about how much trouble it is to set up Python properly. 226 00:20:08,460 --> 00:20:15,460 And how many different versions of Python there can be available on macOS. So that's 227 00:20:15,460 --> 00:20:15,940 a problem. 228 00:20:17,000 --> 00:20:20,460 >> I'm on a Mac running homebrew and I run into that all the time. So that is definitely 229 00:20:20,560 --> 00:20:22,060 something that people should be looking out for. 230 00:20:22,260 --> 00:20:29,720 >> Yeah. Yeah. And there's so many versions of macOS and things change abruptly. You know, 231 00:20:30,520 --> 00:21:00,500 keep the same Python version for a while, and then they jump up several versions. And it's just really confusing. And there's just a lot to learn here. If you haven't used Git before, you got to learn Git and GitHub. There's just a lot going on here. And so, you know, we try to make a recipe. But it's important that you try to spend some time and do some studying about things that you don't know about so that when something goes wrong, which invariably will, that you can 232 00:21:00,520 --> 00:21:06,500 have some understanding of like, well, what is really going on here? Why is this error happening? 233 00:21:08,020 --> 00:21:11,860 But we're happy to help you along. That's definitely good advice. And if people get stuck, 234 00:21:12,140 --> 00:21:16,900 again, come to the CircuitPython dev channel on the Adafruit Discord, and you and the other core 235 00:21:17,020 --> 00:21:22,440 developers can sometimes help them out. Yeah, yeah, very much. Well, this was all good advice. 236 00:21:22,580 --> 00:21:25,560 Dan, thanks so much for being on the show. You're very welcome. 237 00:21:27,320 --> 00:21:31,320 Thank you to Dan for sharing his knowledge of building CircuitPython. For show notes and 238 00:21:31,660 --> 00:21:36,940 transcripts, visit www.circuitpythonshow.com. Until next time, stay positive!