Use of terminology suffers here. The IDE is not the compiler. It's also not the libraries, although in this case it includes library tools.
IDE = Integrated Development Environment. Basically a fancy editor. They call command line tools for the actual compiling, linking, and crossloading. The Arduino IDE is no exception. With a little research, you can set up any of the more generalized IDE's to do the same thing. Or you can do the whole thing at the command line, either by hand or with makefiles. You're on your own making makefiles, of course. You can use the IDE verbose output to determine exactly what command lines it's actually using.
Command line tools are distributed in hardware/tools/avr/bin, including avr-gcc and avrdude, among others. They take the usual --help tag. Everything you need is there.
If you don't like the setup/loop construction, just write your own int main() function to replace the weakly bound one provided:
/*
main.cpp - Main loop for Arduino sketches
Copyright (c) 2005-2013 Arduino Team. All right reserved.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <Arduino.h>
// Declared weak in Arduino.h to allow user redefinitions.
int atexit(void (* /*func*/ )()) { return 0; }
// Weak empty variant initialization function.
// May be redefined by variant files.
void initVariant() __attribute__((weak));
void initVariant() { }
void setupUSB() __attribute__((weak));
void setupUSB() { }
int main(void)
{
init();
initVariant();
#if defined(USBCON)
USBDevice.attach();
#endif
setup();
for (;;) {
loop();
if (serialEventRun) serialEventRun();
}
return 0;
}