# Modifying Your makefile

If you use makefiles to build your GCC* application, you need to change the value for the GCC compiler variable to use the Intel® oneAPI DPC++/C++ Compiler. You may also want to review the options specified by `CFLAGS`. For example:

Sample GCC makefile
    # Use gcc compiler
      CC = gcc

    # Compile-time flags
      CFLAGS = -O2 -std=c99
    all: area_app

    area_app: area_main.o area_functions.o
        $(CC) area_main.o area_functions.o -o area

    area_main.o: area_main.c
        $(CC) -c $(CFLAGS) area_main.c

    area_functions.o: area_functions.c
        $(CC) -c -fno-asm $(CFLAGS) area_functions.c

    clean: rm -rf *o area

Sample makefile modified for the Intel® oneAPI DPC++/C++ Compiler
    # Use Intel C/C++/DPC++ Compiler
      CC = [invocation]

    # Compile-time flags
      CFLAGS = -std=c99
    all: area_app

    area_app: area_main.o area_functions.o
        $(CC) area_main.o area_functions.o -o area

    area_main.o: area_main.c
        $(CC) -c $(CFLAGS) area_main.c

    area_functions.o: area_functions.c
        $(CC) -c -fno-asm $(CFLAGS) area_functions.c

    clean: rm -rf *o area

Where [`invocation`] is `icpx` (for C++) or `dpcpp` (for DPC++).

If your GCC code includes features that are not supported with the Intel® oneAPI DPC++/C++ Compiler (compiler options, language extensions, macros, pragmas, and so on), you can compile those sources separately with GCC if necessary.

In the above makefile, area_functions.c is an example of a source file that includes features unique to GCC. Because the Intel® oneAPI DPC++/C++ Compiler uses the O2 option by default and GCC uses option O0 as the default, we instruct GCC to compile at option O2. We also include the -fno-asm switch from the original makefile because this switch is not supported with the Intel® oneAPI DPC++/C++ Compiler.

Sample makefile modified for using the Intel® oneAPI DPC++/C++ Compiler and GCC together
    # Use Intel C/C++/DPC++ Compiler
      CC = [invocation]
    # Use gcc for files that cannot be compiled by [invocation]
      GCC = gcc
    # Compile-time flags
      CFLAGS = -std=c99
    all: area_app

    area_app: area_main.o area_functions.o
        $(CC) area_main.o area_functions.o -o area

    area_main.o: area_main.c
        $(CC) -c $(CFLAGS) area_main.c

    area_functions.o: area_functions.c
        $(GCC) -c -O2 -fno-asm $(CFLAGS) area_functions.c

    clean: rm -rf *o area

Where [`invocation`] is `icpx` (for C++) or `dpcpp` (for DPC++).

Output of make using a modified makefile
    [invocation] -c -std=c99 area_main.c
    gcc -c -O2 -fno-asm -std=c99 area_functions.c
    [invocation] area_main.o area_functions.o -o area

Where [`invocation`] is `icpx` (for C++) or `dpcpp` (for DPC++).

Using IPO in Makefiles

By default, IPO generates "dummy" object files containing Interprocedural information used by the compiler. To link or create static libraries with these object files requires special Intel®-provided tools. To use them in your makefile, simply replace references to "ld" with "xild" and references to "ar" with "xiar", or use `icx` or `icpx` (for C++) or `dpcpp` (for DPC++) to link as shown below.

Sample makefile modified for the Intel® oneAPI DPC++/C++ Compiler with IPO
    # Use Intel C/C++/DPC++ Compiler
      CC = [invocation]
    # Compile-time flags
      CFLAGS = -std=c99 -ipo
    all: area_app

    area_app: area_main.o area_functions.o
        $(CC) area_main.o area_functions.o -o area

    area_main.o: area_main.c
        $(CC) -c $(CFLAGS) area_main.c

    area_functions.o: area_functions.c
        $(CC) -c $(CFLAGS) area_functions.c

    clean: rm -rf *o area

Where [`invocation`] is `icpx` (for C++) or `dpcpp` (for DPC++).

Parent topic: Porting from GCC* to the Intel® oneAPI DPC++/C++ Compiler