I want to test the algorithms in my code without needing to send it to an actual Arduino board. I figured I could lay out my project like:
project/
core.cpp # core algorithms
core.h # header for core.cpp
project.ino # Arduino setup() loop() calling into core
pc-main.cpp # main(argv) calling into core
However, when I do this, the Arduino IDE wants to compile pc-main.cpp
, which won't work since it uses stdio and all that. What can I do instead?
Is there a way to hide a file from the build, other than changing the extension which would inconvenience other editors and compilers? Is there a different standard approach to this kind of problem?
What I've thought of:
I could put
pc-main.cpp
in another directory and have the build for it refer to the files in the Arduino project directory, but that seems awkward and I'd like a more elegant solution.I could symlink the
core.*
files into the Arduino project directory from elsewhere, but that would also be inelegant, and inconvenience Windows users should one want to compile the project.I could put an
#ifdef
around the contents ofpc-main.cpp
, but I haven't found a suitable#define
to check for, other than board-specific ones.
I don't want a solution which requires extra steps for each build; the whole point of trying to do this is fast and easy development.
I would also prefer one which does not bring in a whole additional build system, testing framework, or IDE; for example, I found arduino_ci and PlatformIO while researching this question. I'll switch to looking at such options if there isn't a good solution to the problem as I've stated it here.
[My question is arguably the same as Project structure to build for PC and Arduino at a high level, but the question and answer there are broad and about organizing modules and not how to make the build actually work.]
1 Answer 1
I would use conditional compilation, like this:
#ifndef(ARDUINO)
// Non-Arduino code.
#endif
-
Thanks. Is there official documentation that specifies this
#define
exists?Kevin Reid– Kevin Reid2018年11月14日 17:10:59 +00:00Commented Nov 14, 2018 at 17:10 -
You can add the #define to your code and manually change it when you change environments. You can look up Arduino compiler predefined symbols. Or you can tweak the IDE's compiler command to include "-DSYMBOL_OF_MY_CHOICE" which would define your symbol during an IDE compile and presumably be undefined in your desktop environment.JRobert– JRobert2018年11月14日 17:46:02 +00:00Commented Nov 14, 2018 at 17:46
-
To be clear, I found that
ARDUINO
is already defined and I didn't need to configure anything, so Edgar's code works exactly as written. I'm asking if there's documentation for it, as I think the answer would be even better with a link.Kevin Reid– Kevin Reid2018年11月14日 18:01:28 +00:00Commented Nov 14, 2018 at 18:01 -
@KevinReid: I didn't find it in a doc (although it's mentioned here), but in a Makefile intended to emulate the Arduino IDE.Edgar Bonet– Edgar Bonet2018年11月14日 19:58:55 +00:00Commented Nov 14, 2018 at 19:58