Linux Makefile for applications and shared libraries

L

Makefiles are a simple way to organize code compilation. Make is a Unix tool to simplify building program executables from many modules. make reads in rules (specified as a list of target entries) from a user created Makefile. make will only re-build things that need to be re-built (object or executables that depend on files that have been modified since the last time the objects or executables were built).

The following code snippet is an example of a makefile + makefile.conf. You can find the source code as well as some examples here.

(info  Starting building process)  # include configurations  include makefile.conf(info  - Makefile.conf loaded)

# find project files

H_FILES   :=    (shell find -L ./ -name '*.h' -exec dirname {} \; | sed 's/ /\\ /g' | uniq)  C_FILES   :=(shell find ./ -name '*.c' -type f | sed 's/ /\\ /g' | uniq)

CXX_FILES :=    (shell find ./ -name '*.cpp' -type f | sed 's/ /\\ /g' | uniq)  O_FILES   :=(C_FILES:.c=.o)

O_FILES   +=    (CXX_FILES:.cpp=.o)  H_FILES   :=(notdir  (H_FILES))  C_FILES   :=(notdir  (C_FILES))  CXX_FILES :=(notdir  (CXX_FILES))  INCLUDES  :=(H_FILES:%=-I%)

(info  - Project Files Loaded)   ifeq ((DEBUG),yes)

   (info  - Debug flag added [makefile.conf DEBUG = yes])     CFLAGS = -g(CFLAGS)

endif


ifeq ((IS_LIBRARY),yes)(info  - Set Parameters for Shared Library build process)

   ALL_PARAMETERS = lib(PROJECT_NAME).so.(PROJECT_VERSION) clean

   ALL_TYPE = lib(PROJECT_NAME).so.(PROJECT_VERSION): (O_FILES)        LIBFLAGS = -shared -Wl,-soname,lib(PROJECT_NAME).so
   
   CFLAGS :=  -fPIC (CFLAGS)        CXXFLAGS := -fPIC(CXXFLAGS)
else

   (info  - Set Parameters for Application build process)     ALL_PARAMETERS =(PROJECT_NAME) clean

   ALL_TYPE = (PROJECT_NAME):(O_FILES)
   
   LIBFLAGS =

endif

# Build Process

all: (ALL_PARAMETERS)(ALL_TYPE)
	@echo -  [OUTPUT][CXX] @ @[(BIN_DIRECTORY)]
	@(CXX)(CFLAGS) (INCLUDES)(LDFLAGS) (LIBFLAGS) -o(BIN_DIRECTORY)/@^ (LDLIBS)  %.o: %.c 	@echo -  [CC]@
	@(CC)(CFLAGS) -c (INCLUDES) -o@ <(LFLAGS)

%.o: %.cpp
	@echo -  [CXX] @ 	@(CXX) (CXXFLAGS) -c(INCLUDES) -o @< (LFLAGS) 	 # Clear Objects 	 clean:(info  - Remove all .o [object] files)
	@find . -name \*.o -type f -delete
	
	
# Clear Objects & Executables 
	
cleanall:	
	(info  - Remove all .o [object] files) 	@find . -name \*.o -type f -delete(info  - Remove all files in (BIN_DIRECTORY)) 	@find(BIN_DIRECTORY) -name \*.* -type f -delete

 

# Project Configurations

   # Project Name
   
      PROJECT_NAME               =           sharedtest

   # Project Version

      PROJECT_VERSION            =           0.1

   # Program or Shared Library
   
      IS_LIBRARY                 =           yes

   # Source Files Directory
   
      SRC_DIRECTORY              =           src

   # Header Files Directory
   
      INC_DIRECTORY              =           inc

   # Library Header Files Directory
   
      LIB_DIRECTORY              =           lib

   # Build Output Directory	  
   
      BIN_DIRECTORY              =           ../Executable

   # Installation Directory Exec
   
     INS_DIRECTORY               =           /usr/bin/
	 
   # Installation Directory Headers
	  
     INS_HEARERS_DIRECTORY       =           /usr/include/
	 
   # Installation Directory SO		
 
	 INS_SO_DIRECTORY            =           /usr/lib/

   # C Flags
   
      CFLAGS                     =           -O3 -D_GNU_SOURCE -Wfatal-errors
	  
   # C++ Flags
   
      CXXFLAGS                   =           (CFLAGS) 	      # Linker Flags           LDFLAGS                    =(shell dpkg-buildflags --get LDFLAGS)
	  
   # Linker Libraries
   
      LDLIBS                     =           -fno-inline
   
   # Debug Yes / No
   
      DEBUG                      =           no

   # C Compiler
   
      CC                         =           gcc
   
   # C++ Compiler
   
      CXX                        =           g++

 

 

Disclaimer: The present content may not be used for training artificial intelligence or machine learning algorithms. All other uses, including search, entertainment, and commercial use, are permitted.

Categories

Tags