CCICC=~/intel/bin/icc
CCGCC=gcc

BINICC := ./bin/icc/
BINGCC := ./bin/gcc/
SRC := ./src/
OBJ := ./obj/

OBJSGCC1= $(OBJ)main.o $(OBJ)functions.o $(OBJ)functions_sse.o $(OBJ)huffman.o $(OBJ)list.o $(OBJ)test_jpeg.o $(OBJ)test_huff.o $(OBJ)compression.o $(OBJ)descompression.o $(OBJ)aux.o
OBJSGCC2= $(OBJ)mainUser.o $(OBJ)functions.o $(OBJ)functions_sse.o $(OBJ)huffman.o $(OBJ)list.o $(OBJ)test_jpeg.o $(OBJ)test_huff.o $(OBJ)compression.o $(OBJ)descompression.o $(OBJ)aux.o
OBJSICC1= $(OBJ)mainICC.o $(OBJ)functionsICC.o $(OBJ)functions_sseICC.o $(OBJ)huffmanICC.o $(OBJ)listICC.o $(OBJ)test_jpegICC.o $(OBJ)test_huffICC.o $(OBJ)compressionICC.o $(OBJ)descompressionICC.o $(OBJ)auxICC.o
OBJSICC2= $(OBJ)mainUserICC.o $(OBJ)functionsICC.o $(OBJ)functions_sseICC.o $(OBJ)huffmanICC.o $(OBJ)listICC.o $(OBJ)test_jpegICC.o $(OBJ)test_huffICC.o $(OBJ)compressionICC.o $(OBJ)descompressionICC.o $(OBJ)auxICC.o
OBJASM=$(OBJ)add_asm.o $(OBJ)sub_asm.o $(OBJ)dct_c1_asm.o $(OBJ)dct_c2_asm.o

CXXFLAGSXXXX= -O2 -g -ggdb -Wall -pg -guide -parallel `pkg-config --cflags opencv` 
CXXFLAGSICC= -O2 -g -ggdb -Wall -pg -fasm-blocks `pkg-config --cflags opencv`
CXXFLAGSGCC= -O2 -g -ggdb -Wall -pg `pkg-config --cflags opencv` 

all: clean mainUser cleanobjGCC mainUserICC cleanobjICC cleanobjASM
user:  clean mainUser cleanobjGCC cleanobjASM
usericc:  clean mainUser cleanobjGCC cleanobjASM
maingcc: clean main cleanobjGCC cleanobjASM
mainicc: clean mainICC mainUserICC cleanobjICC cleanobjASM

# --------------- USANDO GCC ---------------

main: $(OBJSGCC1) $(OBJASM)
	$(CCGCC) $(CXXFLAGSGCC) -o $(BINGCC)main $^ `pkg-config --libs opencv` -lm

$(OBJ)main.o: $(SRC)main.c $(SRC)functions.h $(SRC)huffman.h $(SRC)list.h 
	$(CCGCC) $(CXXFLAGSGCC) -c -o $@ $< -lm

mainUser: $(OBJSGCC2) $(OBJASM)
	$(CCGCC) $(CXXFLAGSGCC) -o $(BINGCC)mainUser $^ `pkg-config --libs opencv` -lm

$(OBJ)mainUser.o: $(SRC)mainUser.c $(SRC)functions.h $(SRC)huffman.h $(SRC)list.h
	$(CCGCC) $(CXXFLAGSGCC) -c -o $@ $< -lm

$(OBJ)%.o: $(SRC)%.c $(SRC)%.h
	$(CCGCC) $(CXXFLAGSGCC) -m32 -c -o $@ $< `pkg-config --libs opencv` -lm


# --------------- USANDO ICC ---------------
mainICC: $(OBJSICC1) $(OBJASM)
	$(CCICC) $(CXXFLAGSICC) -o $(BINICC)main $^ `pkg-config --libs opencv` -lm

$(OBJ)mainICC.o: $(SRC)main.c $(SRC)functions.h $(SRC)huffman.h $(SRC)list.h
	$(CCICC) $(CXXFLAGSICC) -c -o $@ $< -lm

mainUserICC: $(OBJSICC2) $(OBJASM)
	$(CCICC) $(CXXFLAGSICC) -o $(BINICC)mainUser $^ `pkg-config --libs opencv` -lm

$(OBJ)mainUserICC.o: $(SRC)mainUser.c $(SRC)functions.h $(SRC)huffman.h $(SRC)list.h
	$(CCICC) $(CXXFLAGSICC) -c -o $@ $< -lm

$(OBJ)%ICC.o: $(SRC)%.c $(SRC)%.h
	$(CCICC) $(CXXFLAGSICC) -m32 -c -o $@ $< `pkg-config --libs opencv` -lm
	
$(OBJ)%.o: $(SRC)%.asm
	nasm -felf $< -o $@ -ggdb 

#test:  $(OBJS2)
#	$(CCICC) $(CXXFLAGSICC) -o $@ $^ -lm

#test.o: test.c functions.h huffman.h list.h test_jpeg.h test_huff.h
#	$(CCICC) $(CXXFLAGSICC) -c -o $@ $< -lm


binclean: 
	@rm -f $(BINICC)main $(BINICC)mainUser $(BINICC)test $(BINGCC)main $(BINGCC)mainUser $(BINGCC)test
	
cleanobjGCC:
	@rm -f $(OBJSGCC1) $(OBJSGCC2)

cleanobjICC:
	@rm -f $(OBJSICC1) $(OBJSICC2)

cleanobjASM:
	@rm -f $(OBJASM)
	
clean:
	@rm -f $(OBJSICC1) $(OBJSICC2) $(OBJSGCC1) $(OBJSGCC2) $(BINICC)main $(BINICC)mainUser $(BINICC)test $(BINGCC)main $(BINGCC)mainUser $(BINGCC)test
