> But then I tried to run it on a build server I was using (Netlify), and I got this extremely strange error message: “File not found”. I straced it, and sure enough execve was returning the error code ENOENT, which means “File not found”. This was kind of maddening because the file was DEFINITELY there and it had the correct permissions and everything.<p>This is an infuriating property of the runtime linkers on both Linux and Windows: if you're trying to load file A, and dependency B of file A does not exist, you just get "file not found" with no indication of which file it was, and it's extremely hard to debug. At least on linux the "show dependencies" tool is built in.
> All the code is in one file (sqlite.c), and there are no weird dependencies! It’s amazing.<p>This is because the author of SQLite publishes it this way as a convenience to integrators; the actual day-to-day coding is <i>not</i> done in a single C file.<p>In fact, the README[1] calls out twelve "key files", and explicitly warns that SQLite "will not be the easiest library in the world to hack."<p><a href="https://sqlite.org/src/doc/trunk/README.md" rel="nofollow">https://sqlite.org/src/doc/trunk/README.md</a>
Short Tcl script that combines everything into one file:<p><a href="https://www.sqlite.org/src/artifact/5fed3d75069d8f66" rel="nofollow">https://www.sqlite.org/src/artifact/5fed3d75069d8f66</a><p>Some other details / rationale:<p><a href="https://www.sqlite.org/amalgamation.html" rel="nofollow">https://www.sqlite.org/amalgamation.html</a><p><i>Combining all the code for SQLite into one big file makes SQLite easier to deploy — there is just one file to keep track of. And because all code is in a single translation unit, compilers can do better inter-procedure optimization resulting in machine code that is between 5% and 10% faster.</i>
One of the benefits of this is Alon Zakai's wonderful compilation of the SQLite C code with Emscripten to generate sql.js, which I have found very useful for teaching SQL.<p><a href="https://github.com/kripken/sql.js" rel="nofollow">https://github.com/kripken/sql.js</a>
Yeah, so, this just blew my mind. I compiled it with an older version of gcc that I had on my Windows machine and it worked just as easily (without threading, or -ldl)<p>But there it is, a fully featured SQL engine in an EXE file that I can use with any application I want.<p>In a world that requires a million SDK's, DLL's, dependencies, etc, this is the most refreshing thing in the world.
Being easy to compile is a very nice thing to have about any software. Redis for example, is also too easy to compile, and quickly too.
I think a lot of software using autotools is easy to compile (atleast on the POSIX compliant systems).
Even postgresql is easy to compile, although not very quickly.
> run ./configure
> realize i’m missing a dependency<p>If only there was like, a tool, to help you manage compile-time dependencies.<p>I wish there was a `yarn` equivalent for C projects.
Another good example is the Go compiler. Assuming you have any version of Go in your PATH, it's:<p><pre><code> git clone https://github.com/golang/go
cd go/src
./make.bash # or make.bat for Windows
</code></pre>
And that's it. You can then use "bin/go" to compile your projects.
The amalgamation file is a really interesting idea -- is this common in the world of C applications? The documentation is quite clear, however, that the amalgamation file and the source files are not the same thing. The source code (1,848 files in 40 folders) can be pulled down here -- <a href="https://www.sqlite.org/cgi/src/doc/trunk/README.md" rel="nofollow">https://www.sqlite.org/cgi/src/doc/trunk/README.md</a> -- but more assembly will be required if you're planning to build the project.<p>UPDATE: maybe not so much assembly is required... just running "make" built the project without any drama (I'm on macOS with XCode and tooling for Xamarin already installed - YMMV in terms whether you might need to install something to compile from source).
I haven't checked yet but was curious if it post processes the file into a single source file or that's how it's developed.
The former sounds useful for build (as her blog suggests) whereas the latter sounds frightening to audit.
(Unless it's written literate?)
It's far more easier. I had some sqlite2 database on an old system but nothing to convert it or even dump it. Had to download sqlite2 source and delete all <i>tcl</i>.c files. Then ran<p><pre><code> gcc *.c -o sqlite2
</code></pre>
and it was done. That much simple.