#!/bin/bash

function compile
{
   for FILE in $FILES; do
     echo "CC $FILE"
     if ! gcc -c $WARN $OPT $INC $DEF -o build/$FILE.o $SRC/$FILE.c; then exit; fi
   done
}

function link
{
   gcc $LDFLAGS $OBJECTS libudev.a -o $1
   echo "LD $1"
   PROGRAM="$PROGRAM $1"
}

WARN="-Wall -W -Wextra -Wno-inline -Wvla -Wundef -Wformat=2 -Wlogical-op 
-Wsign-compare -Wformat-security -Wmissing-include-dirs -Wformat-nonliteral
-Wold-style-definition -Wpointer-arith -Winit-self
-Wdeclaration-after-statement -Wfloat-equal -Wmissing-prototypes
-Wstrict-prototypes -Wredundant-decls -Wmissing-declarations -Wmissing-noreturn
-Wshadow -Wendif-labels -Wcast-align -Wstrict-aliasing=2 -Wwrite-strings
-Wno-long-long -Wno-overlength-strings -Wno-unused-parameter
-Wno-missing-field-initializers -Wno-unused-result -Werror=overflow
-Wp,-D_FORTIFY_SOURCE=2"

OPT="-O2 -pipe -ffast-math -fno-common -fdiagnostics-show-option
-fno-strict-aliasing -fvisibility=hidden -ffunction-sections -fdata-sections"

DEF="$DEF -include cfg.h"
DEF="$DEF -DSYSCONFDIR=\"/etc\""
DEF="$DEF -DFIRMWARE_PATH=\"/lib/firmware\""
DEF="$DEF -DUSB_DATABASE=0"
DEF="$DEF -DPCI_DATABASE=0"
DEF="$DEF -DUDEVLIBEXECDIR=\"/usr/libexec/udev\""

INC="-I src/libudev -I src/shared -I src -I src/login -I src/systemd"

rm -rf build
mkdir  build
##################

SRC=src/libudev

FILES="libudev-device-private 
libudev-device 
libudev-enumerate 
libudev-list
libudev-monitor 
libudev-queue-private
libudev-queue
libudev-util 
libudev"

compile

###########################
SRC=src/shared

FILES="log
label
mkdir
cgroup-util
util
strv
path-util
conf-files
hashmap
set
exit-status
dev-setup"

compile

#########################

SRC=src/libsystemd-daemon

FILES="sd-daemon"

compile

#########################

SRC=src/login

FILES="sd-login"

compile

#########################

ar rcs build/libudev.a build/*.o

SRC=src/udev

FILES="udev-builtin-blkid
udev-builtin-firmware
udev-builtin-hwdb
udev-builtin-input_id
udev-builtin-kmod
udev-builtin-path_id
udev-builtin-uaccess
udev-builtin-usb_id
udev-builtin
udev-ctrl
udev-event
udev-node
udev-rules
udev-watch
udevadm-control
udevadm-info
udevadm-monitor
udevadm-settle
udevadm-test-builtin
udevadm-test
udevadm-trigger
udevadm
udevd"

compile

SRC=src/udev/scsi_id
FILES="scsi_serial scsi_id"
compile

#SRC=src/udev/keymap
#FILES="keymap"
#compile

SRC=src/udev/collect
FILES="collect"
compile

SRC=src/udev/mtd_probe
FILES="mtd_probe probe_smartmedia"
compile

SRC=src/udev/v4l_id
FILES="v4l_id"
compile

SRC=src/udev/cdrom_id
FILES="cdrom_id"
compile

SRC=src/udev/ata_id
FILES="ata_id"
compile

SRC=src/udev/accelerometer
FILES="accelerometer"
compile

########## LINKING

cd build

OBJECTS="udevd.o 
udev-ctrl.o
udev-rules.o
udev-watch.o
udev-event.o
udev-node.o
udev-builtin.o
udev-builtin-blkid.o
udev-builtin-firmware.o
udev-builtin-path_id.o
udev-builtin-hwdb.o
udev-builtin-kmod.o
udev-builtin-uaccess.o
udev-builtin-usb_id.o
udev-builtin-input_id.o"

LDFLAGS="-pthread -Lbuild  -ldl -lrt -lblkid -lkmod -lz -luuid -llzma"
link udevd

OBJECTS="udevadm.o
udevadm-test.o
udevadm-monitor.o
udevadm-settle.o
udevadm-info.o
udevadm-test-builtin.o
udevadm-trigger.o
udevadm-control.o
udev-rules.o
udev-ctrl.o
udev-event.o
udev-node.o
udev-watch.o
udev-builtin.o
udev-builtin-blkid.o
udev-builtin-firmware.o
udev-builtin-path_id.o
udev-builtin-hwdb.o
udev-builtin-kmod.o
udev-builtin-uaccess.o
udev-builtin-usb_id.o
udev-builtin-input_id.o"

link udevadm

OBJECTS="accelerometer.o"
LDFLAGS="-pthread -lm -lrt"
link accelerometer

OBJECTS="scsi_id.o scsi_serial.o"
LDFLAGS="-pthread -lrt"
link scsi_id

OBJECTS="ata_id.o"
link ata_id

OBJECTS="cdrom_id.o"
link cdrom_id

OBJECTS="v4l_id.o"
link v4l_id

OBJECTS="mtd_probe.o probe_smartmedia.o"
link mtd_probe

OBJECTS="collect.o"
link collect

OBJECTS="keymap.o"
#link keymap

strip --strip-unneeded $PROGRAM

echo Finished


