-
15 votes
-
Good software development habits
22 votes -
Why I will always be angry about software engineering
34 votes -
Moving my game project from C to Odin language
15 votes -
Cmake strategies or alternatives for building (different) code for different platforms
Okay, so this is getting really long, I'll put the ask up front: I have a strategy, I think it is reasonable. Now is a point where I can easily change things, and it won't be so easily later. So...
Okay, so this is getting really long, I'll put the ask up front: I have a strategy, I think it is reasonable. Now is a point where I can easily change things, and it won't be so easily later. So I'm looking to see if anyone has trod this road before and can recommend any of:
- a different build system that will be easier to manage for this use case
- a different strategy for using cmake that will be easier to manage
- any gotchas I should be aware of, even if you don't have better solutions.
Background
I have a project I'm working on where the ultimate deliverable will be a hardware device with 3-4 different microcontrollers coordinating with each other and interacting with a PC-ish platform. This is a clean rewrite of a C++ codebase. Due to the microcontroller (and some of the PC APIs) being C++, the language of choice for most of it is likely to remain C/C++.
I'm succeeded in setting up a build system for embedded code. The old code was arduino, so it relies a lot on those libraries, but I've managed to set up enough custom cmake to get off of the ardunio tools altogether, even if I am borrowing their libraries and some of the "smarts" built into the system about setting build flags, etc. So far, I have a dockerized toolchain (cmake + make + gcc-arm-none-eabi) that can successfully build ARM binaries for the target platform.
The thing that I'm up against now is that I'd like to have a robust off-target unit testing infrastructure. My ideal case is that everything in the embedded system will be broken down into libraries that have clear interfaces, then to use unit tests with mocks to get high coverage of test cases. I'll still need some HIL tests, but because those are harder to set up and run, I want to use those for integration and validation.
In terms of OSes available, we're mostly working on Windows systems using WSL for linux. I'd like things to be as linux-based as possible to support CI on github, etc.
Goals and Cmake limitations
I started out using cmake because I hate it least of the tools I've used, and I am at least pretty far up the learning curve with it. But a limitation I'm hitting is that you can't do a mixed compile with two different toolchains in one build. The reasons why cmake has this limitation seem reasonable to me, even if it is annoying. You can easily change the toolchain that your code is built with, but that seems to be largely targeted at cross-compiling the same binaries for different systems. What I want to do is:
- build my code libraries with embedded settings for linking to the embedded binaries and build those embedded binaries (the end product)
- build my code libraries with linux-ish tools and link them against unit tests to have a nice CI test process
- (eventually) also be able to build windows binaries for the PC components -- when I get to that point, I'd like to get away from the MSVC compilers, but will use them if I have to
Current strategy
My current plan is to configure a library build like this (pseudocode):
add_library(mylib sources) if (BUILD_TYPE STREQUAL BUILD_TYPE_EMBEDDED) <embedded config> elseif (BUILD_TYPE STREQUAL BUILD_TYPE_LINUX) <linux config, if any> endif() #unit tests are built for each library if (BUILD_TYPE STREQUAL BUILD_TYPE_LINUX) add_executable(mylib_test sources test_sources) target_link_libraries(mylib gtest etc.) endif()
For the rollup binaries, I make the whole target conditional
if (BUILD_TYPE STREQUAL BUILD_TYPE_EMBEDDED) add_executable(myembedap sources) target_link_libraries(mylib) endif()
Then the build script (outside cmake) is something like
cd build/embedded cmake <path to src> <set embedded toolchain> -DBUILD_TYPE=embedded make cd ../../build/linux cmake <path to src> -DBUILD_TYPE=linux make
Things I like about this strategy:
- It's relatively simple to do all the builds or just one of the builds (that control would go in the shell script)
- I have one source tree for the whole build
- It lets configuration be near code
- It lets tests be near code.
- I think it's extensible to cover the PC component builds in the future
Things that worry me:
- It feels like a hack
- Support for off-target tests feels like it should be solved problem and I'm worried I'm missing something
Thanks for reading. If you made it this far, you have my gratitude. Here's a video with funny out of office messages that I enjoyed.
6 votes -
Best solution to extract PDF data?
Hi folks-- To those more knowledgeable than I am: What would be the best local solution to extract numerical data from a batch of PDF file reports? The values I want are interspersed among word...
Hi folks--
To those more knowledgeable than I am:
What would be the best local solution to extract numerical data from a batch of PDF file reports? The values I want are interspersed among word processor formatted tables and irrelevant text. The text and table formatting are (nearly) identical across reports. The data I want vary across reports. The PDFs are not of images...I can select and copy text without OCR. I have thousands to process, and the data themselves are confidential (I have clearance) and cannot be shared. I can use Windows or Linux but no MacOS.
I am technically inclined, so I bashed my head against regular expressions just enough to use notepad++ to find and delete most of the irrelevant stuff and make a CSV, but it's a hacky, imprecise method and not nearly automated enough for batches. For reference, I don't code for a living or even as a hobby, but I use R and bash, am familiar with IDEs, and can follow pseudocode well enough to edit and use scripts.
Any thoughts? Thanks in advance!
24 votes -
What was your first programming language, what languages do you know now, and what tips do you have for those trying to learn any of those?
What was your first programming language, what other languages (if any) do you know now, and what tips do you have for those trying to learn any of those? Whether those tips are for beginners or...
What was your first programming language, what other languages (if any) do you know now, and what tips do you have for those trying to learn any of those? Whether those tips are for beginners or even advanced, to do with APIs, or if you've got a good library to share.
53 votes -
Everything I built with Claude Artifacts this week
10 votes -
Gamedev in Lisp. Part 1: ECS and metalinguistic abstraction
9 votes -
I am disappointed by dynamic typing
22 votes -
How to make Racket go (almost) as fast as C
2 votes -
How to write a blog post about how to monetize a blog
5 votes -
Advanced debugging technology in practice
4 votes -
Debugging by querying a database of all program state
4 votes -
Get me out of data hell
30 votes -
SpaceTraders — A unique multiplayer game built on a free Web API
62 votes -
Performance Improvements in .NET 9
15 votes -
Sanding UI
14 votes -
Property-based testing against a model of a web application
7 votes -
Zig and emulators
14 votes -
Why not just do simple C++ RAII in C?
10 votes -
What is a software you wish existed?
I've been feeling pretty bored for a while and my job isn't really giving something fulfilling to do, So I want to make something. However, I don't want to make something useless. unfortunately, I...
I've been feeling pretty bored for a while and my job isn't really giving something fulfilling to do, So I want to make something.
However, I don't want to make something useless. unfortunately, I can't think of any software I'm in a particular need for. I would love to make something that solves a real problem for a real human.
So, please tell me, what's something that you wish existed because it would reduce suffering in your life that little (or big) bit?
Edit: Wow wow and wow, I didn't expect this thread that I made on a whim to blow up so much. So many idead!
69 votes -
FauxRPC: Easily turn protobufs into fake gRPC, gRPC-Web, Connect, and REST services
5 votes -
10 years of Dear ImGui
15 votes -
Zig: The small language (2022)
17 votes -
HTTP/1.0 From Scratch
4 votes -
User-defined Order in SQL
23 votes -
Breaking my hand forced me to write all my code with AI for 2 months
14 votes -
We need visual programming. No, not like that.
17 votes -
Plain Vanilla — An explainer for doing web development without tools or frameworks — just HTML, CSS, and JavaScript
35 votes -
Get roasted based on your Github username and public contributions
20 votes -
Cables — interactive visuals, made from cable salad
11 votes -
First impressions of Gleam: lots of joys and some rough edges
9 votes -
Y’all are sleeping on HTTP/3
20 votes -
HTTP/0.9 From Scratch
11 votes -
Generating sudokus for fun and no profit
26 votes -
Taking my diabetes treatment into my own hands
17 votes -
Yarn, React, and Udemy. Help requested.
My apologies if this kind of content is not allowed here. Mod(s) please feel free to delete it if it is not without any butthurt on my part. I'm new to React Testing, so I am taking an Udemy...
My apologies if this kind of content is not allowed here. Mod(s) please feel free to delete it if it is not without any butthurt on my part.
I'm new to React Testing, so I am taking an Udemy course on it. The Udemy course uses yarn, so I would like to stick with that though I do know yarn isn't the top accepted tool in the React community.
I've posted this question elsewhere, I haven't gotten any responses, so I am posting it here ( costs nothing ).
I am getting this error when executing yarn build:
$ yarn build yarn run v1.22.22 $ react-scripts build Creating an optimized production build... Failed to compile. TS2305: Module '"web-vitals"' has no exported member 'ReportHandler'. > 1 | import { ReportHandler } from 'web-vitals'; | ^^^^^^^^^^^^^ 2 | 3 | const reportWebVitals = (onPerfEntry?: ReportHandler) => { 4 | if (onPerfEntry && onPerfEntry instanceof Function) { error Command failed with exit code 1.
I've tried installing web-vitals over what is already in the modules section, but that hasn't helped.
Any clues appreciated!
Update: the tip about ReportHandler being deprecated helped. I ran create react app in a new folder, did NOT run yarn update as the instructor called for,moved my work over, and now everything runs fine.
7 votes -
Where is the programmer inspo?
13 votes -
Can I have some advice on the neural net I've been working on?
Apologies if this isn't an appropriate place to post this. Inspired by a paper I found a while back (https://publications.lib.chalmers.se/records/fulltext/215545/local_215545.pdf), I tried my hand...
Apologies if this isn't an appropriate place to post this.
Inspired by a paper I found a while back (https://publications.lib.chalmers.se/records/fulltext/215545/local_215545.pdf), I tried my hand at implementing a program (in C#) to create ASCII art from an image. It works pretty well, but like they observed in the paper, it's pretty slow to compare every tile to 90-some glyphs. In the paper, they make a decision tree to replicate this process at a faster speed.
Recently, I revisited this. I thought I'd try making a neural net, since I found the idea interesting. I've watched some videos on neural nets, and refreshed myself on my linear algebra, and I think I've gotten pretty close. That said, I feel like there's something I'm missing (especially given the fact that the loss isn't really decreasing). I think my problem is specifically during backpropagation.
Here is a link to the TrainAsync method in GitHub: https://github.com/bendstein/ImageToASCII/blob/1c2e2260f5d4cfb45443fac8737566141f5eff6e/LibI2A/Converter/NNConverter.cs#L164C59-L164C69. The forward and backward propagation methods are below it.
If anyone can give me any feedback or advice on what I might be missing, I'd really appreciate it.
14 votes -
gRPC: The Bad Parts
5 votes -
Game simulation programming: Continuous time
7 votes -
What to know before you implement public-facing APIs
9 votes -
Moving Beyond Type Systems
6 votes -
Why, after 6 years, I’m over GraphQL
28 votes -
Programming mantras are proverbs
10 votes -
How do you organize your Linux packages?
Hello everyone. I am planning to get back into Linux development after working with Mac only for almost a decade. On Mac, one of the most important lessons that I learned was to always use...
Hello everyone.
I am planning to get back into Linux development after working with Mac only for almost a decade. On Mac, one of the most important lessons that I learned was to always use Homebrew. Using various package managers (e.g. Homebrew, NPM, Yarn, Pip, etc.) creates situations in which you don't know how to uninstall or upgrade certain pieces of software. Also, it's hard to generate a complete overview.
How do you Linux folks handle this?
Bonus question: How do you manage your dotfiles securely? I use Bitwarden, and it's a bit clunky.
If that helps, I want to try Mint and always use Oh My ZSH!.
6 votes -
Why stomping Wigglers glitches Super Mario World
14 votes -
Flying planes with JavaScript
8 votes -
React, Electron, and LLMs have a common purpose: the labour arbitrage theory of dev tool popularity
31 votes