IANAL, but I believe the answer is yes, you violate GPL. If you distribute binaries, then GPL requires that you also distribute all the files necessary to rebuild that same binary, and to make modifications. GPLv3 has the specific term "corresponding source", which you must convey in addition to, and in a similar manner to the source code. Under section 1:
The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work.
Under this generalised definition, the following will be included:
- Makefiles (needed to generate object code from source code)
- Installation scripts (needed to install object code)
- Program data files (needed to run the object code)
GPLv2 also has a similar clause, in section 3:
... For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. ...
So if someone distributes binaries and source code but does not provide compilation instructions (e.g. Makefiles), they may be violating the GPL.
One of the goals of the GPL is to protect users' freedom to modify software. These clause are meant to serve that goal.
I'm surprised that among the voluminous GPL FAQ questions, none address this point. But gpl-violations.org (not GNU affiliated afaik) has one:
The GNU GPL demands that as soon as you distribute GPL licensed software in executable format you make available the "complete corresponding source code". The GNU GPL also contains a definition of this term:
The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable.
This is a quite precise definition. For a typical C program, this translates into all the source code (.c files) plus header files (.h files) plus the scripts used to control compilation and installation.
The SFLC also publishes an article, A Practical Guide to GPL Compliance, which contains a section relevant to the question:
4.2.2 Building the Sources
Note that you must include “scripts used to control compilation and installation of the executable” and/or anything “needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities”. These phrases are written to cover different types of build environments and systems. Therefore, the details of what you need to provide with regard to scripts and installation instructions vary depending on the software details. You must provide all information necessary such that someone generally skilled with computer systems could produce a binary similar to the one provided.
[...] Sometimes, however, scripts were never written (e.g., the information on how to build the binaries is locked up in the mind of your “build guru”). In that case, we recommend that you write out build instructions in a natural language as a detailed, step-by-step
No matter what you offer, you need to give those who receive source a clear path from your sources to binaries similar to the ones you ship. If you ship a firmware (kernel plus filesystem), and the filesystem contains binaries of GPL’d programs, then you should provide whatever is necessary to enable a reasonably skilled user to build any given GPL’d source program (and modified versions thereof), and replace the given binary in your filesystem. If the kernel is Linux, then the users must have the instructions to do the same with the kernel. The best way to achieve this is to make available to your users whatever scripts or process your engineers would use to do the same.
Note: All of the above only applies if you are distributing a binary. If you only distribute source code, there is no requirement to distribute all your changes, or for these changes to be even compilable. See section 6 of the GPL v3, or term 3 of the GPL v2.
Thanks to sleske for the corrections to GPLv2 applicability.