This makes sure a library or core file gets rebuild when a header file
it depends on is changed, preventing weird surprises when the
application is recompiled with the new header values but the library
isn't.
For most users, this won't be strictly needed, but anyone working on a
library or even the Arduino core, this is must to prevent surprises or
needing a make clean between every build attempt.
This adds a dependency on $(OBJDIR) for every rule that creates a file
inside $(OBJDIR) but does not already depend on any file within
$(OBJDIR). All other dependencies on $(OBJDIR) are removed.
These dependencies are added after a | to tell make that this is a
"order-only prerequisite". This means that the file inside $(OBJDIR)
needs $(OBJDIR) to be present but if $(OBJDIR) changes (which happens
whenever a file _inside_ the directory is touched!), there is no need to
recompile the file within $(OBJDIR).
Implementing this using a generic implicit rule like:
$(OBJDIR)/%: | $(OBJDIR)
doesn't work, since make doesn't merge the prerequisites of multiple
implicit rules like it does for explicit rules. We could use
$(LOCAL_OBJS) and friends to create explicit rules to do something like
the above, but just adding the dependencies on all rules seems more
explicit and future-proof.
Commit originally by: Paul Brook <paul@codesourcery.com>
Port to newer version and commit message by: Matthijs Kooijman <matthijs@stdin.nl>
Instead of generating a big list of dependencies at the start, now
dependency files are generated whenever a .o file is compiled. This
works, since if the .o file does not exist, it should be compiled and
make does not need to know about its dependencies. If the .o (and thus
the .d) file does exist, the .d file contains all the dependencies used
to compile the .o file. If none of those changed, the .o file does not
need a recompile, but also the .d file is still accurate (in particular,
the dependency list cannot change without one of the dependent .h files
or the .cpp file itself changing).
This helps to remove a lot of duplication in the code, since now only a
single commandline is needed for both compilation and dependency
generation. It will probably also run a bit faster now.
Note that this commit breaks the creation of $(OBJDIR) since this
"accidentally" always worked before because $(DEPFILE) was created
before anything else. That will be fixed next.
Before, they were copied to a .cpp file to add the Arduino.h/WProgram.h
include. However, this would cause the compiler error messages to not refer to
the right filename, making it hard to use the compiler output in an editor like
vim to point out errors.
By using gcc's -include option, there is no need to modify the ino/pde
file before compiling. However, we will need to explicitely tell gcc
that the source file is c++, because of the non-standard extensions.
Previously, the C preprocessor would pick either Arduino.h or WProgram.h
based on a define. Now, the Makefile makes the decision earlier. This
prevents having to duplicate the #if line in the next commit.
This can happen for example when the arduino directory is a checkout
from git instead of a released version. Before, cat would show an error
which is now prevented. The version still defaults to 100 just like
before.
Before, the configuration info would be shown again when running a
recursive make call, or when make restarted after regenerating the
dependencies file. Now, it only shows the info the first time.
Closes: #46
In commit 90e3c9ad (Fix upload in case of parallelized make), some
dependencies were shuffled to (I assume) prevent the reset from
happening before or at the same time as the upload when running a
parallel make. However, this introduced two problems:
- The upload and raw_upload became effectively the same, and both of
them did a reset (even though raw_upload should do the upload without
a reset).
- The reset target does not depend on $(TARGET_HEX) or verify_size, so
in a parallel make the reset is executed before / at the same time as
the actual compilation (since the reset doesn't seem to be needed for
at least the Arduino Uno, apparently avrdude handles this, this
probably wasn't noticed by anyone).
Because we can't force a specific ordering of dependencies in parallel
make and because adding dependencies to the reset target doesn't seem
appropriate (you should be able to do a "make reset" without needing to
compile everything first), this commit changes the uploading to call
$(MAKE) again to do the actual upload.
The current approach ensures that:
- raw_upload does a compile, size check and upload and upload does the
same plus a reset.
- A reset is not done if the compilation fails or the size check fails.
- verify_size is called only once.
When there are none (and no .cpp files either), the build would stall
trying to cat all the .d files together (which would result in cat
getting no arguments and thus waiting for input on stdin).
When there are multiple .ino and/or .pde files, the build could
technically work out, the Arduino IDE concatenates all .ino / .pde files
together and compiles them as a single compile unit, so unless we
implement that as well, it's better to just error out.
Before, it would only look in .ino files. If you had no .ino file but
only a .pde file, this would cause the build to hang, since grep would
be waiting for input on its stdin.