Autotools Tutorial
Total Page:16
File Type:pdf, Size:1020Kb
Autotools Tutorial Mengke HU ECE Department Drexel University ASPITRG Group Meeting Outline 1 Introduction 2 GNU Coding standards 3 Autoconf 4 Automake 5 Libtools 6 Demonstration The Basics of Autotools 1 The purpose of autotools I It serves the needs of your users (checking platform and libraries; compiling and installing ). I It makes your project incredibly portablefor dierent system platforms. 2 Why should we use autotools: I A lot of free softwares target Linux operating system. I Autotools allow your project to build successfully on future versions or distributions with virtually no changes to the build scripts. The Basics of Autotools 1 The purpose of autotools I It serves the needs of your users (checking platform and libraries; compiling and installing ). I It makes your project incredibly portablefor dierent system platforms. 2 Why should we use autotools: I A lot of free softwares target Linux operating system. I Autotools allow your project to build successfully on future versions or distributions with virtually no changes to the build scripts. The Basics of Autotools 1 3 GNU packages for GNU build system I Autoconf Generate a conguration script for a project I Automake Simplify the process of creating consistent and functional makeles I Libtool Provides an abstraction for the portable creation of shared libraries 2 Basic steps (commends) to build and install software I tar -zxvf package_name-version.tar.gz I cd package_name-version I ./congure I make I sudo make install The Basics of Autotools 1 3 GNU packages for GNU build system I Autoconf Generate a conguration script for a project I Automake Simplify the process of creating consistent and functional makeles I Libtool Provides an abstraction for the portable creation of shared libraries 2 Basic steps (commends) to build and install software I tar -zxvf package_name-version.tar.gz I cd package_name-version I ./congure I make I sudo make install Autoconf 1 Autoconf I autoconf I autoheader I autom4te I autoreconf I autoscan I autoupdate Data Flow Diagram for Autoconf Automake 1 automake I automake I aclocal Data Flow Diagram for aclocal Libtools 1 Libtools I libtool I libtoolize Data Flow Diagram for automake and libtool A simple project structure jupiter1.0 Makele I ./src/ F Makele F main.c Makele Makele layout var1=val1 var2=val2 ... target1 : t1_dep1 ... t1_depN <TAB> shell-command1a <TAB> shell-command1b ... target2 : t2_dep1 ... t2_depN <TAB> shell-command2a <TAB> shell-command2b ... File: /home/mengke/Desktop/backup2/jupiter/src/Makefile Page 1 of 1 Makele# src/Makefile. Example Generated from Makefile.in by configure. # Package-specific substitution variables package = Jupiter version = 1.0 tarname = jupiter distdir = $(tarname)-$(version) # VPATH-related substitution variables srcdir = . # Prefix-specific substitution variables prefix = /usr/local exec_prefix = ${prefix} bindir = ${exec_prefix}/bin #CFLAGS = -g -O0 all: jupiter jupiter: main.c gcc -g -O2 -o jupiter ../../src/main.c #$(CC) $(CPPFLAGS) $(CFLAGS) -o $@ main.c check: all ./jupiter | grep "Hello from .*jupiter!" @echo "*** ALL TESTS PASSED ***" install: install -d $(DESTDIR)$(bindir) #DESTDIR is to dsupport the staged installation install -m 0755 jupiter $(DESTDIR)$(bindir) cp jupiter /usr/bin chown root:toot /usr/bin/jupiter #change file owner and group chmod +x /usr/bin/jupiter uninstall: -rm $(DESTDIR)$(bindir)/jupiter Makefile: Makefile.in ../config.status cd .. && ./config.status src/$@ ../config.status: ../configure cd .. && ./config.status --recheck clean: -rm jupiter .PHONY: all clean check install uninstall Autoconf Syntax 1 Autoconf I Autoconf use M4 macro language. I M4 is for the purpose of macro language processor. 2 Syntax for congure.ac le AC_INIT([PackageName], [version]) AC_CONFIG_FILES([Makele src/Makele]) AC_OUTPUT Check Datatype 1 Check for types for dierent platforms I AC_TYPE_UINTN_T I AC_TYPE_INTN_T Where N = 8;16;32;64 2 How those macros work? I Check if stdint.h or inttypes.h have UINTN_T or UINTN_T I If not, dene UINTN_T or UINTN_T. Add automake functionality 1 Enabling Automake in congure.ac I AC_INIT([Jupiter], [1.0], [[email protected]]) I AM_INIT_AUTOMAKE I AC_CONFIG_SRCDIR([src/main.c]) 2 Makele.am for compiling sources I bin_PROGRAMS = jupiter I jupiter_SOURCES = main.c I jupiter_CPPFLAGS = -I$(top_srcdir)/common I jupiter_LDADD = ../common/libjupcommon.a Add convenience libraries (static library) Makele.am for convenience libraries I noinst_LIBRARIES = libjupcommon.a I libjupcommon_a_SOURCES = jupcommon.h print.c Shared Libraries Shared libraries contain only a small table of functions that programs require. Shared libraries make executable le smaller. It is easy to update shared libraries without recompiling projects. Shared libraries use dynamic linking, which provides chunks of executable code that the operating system can load into a program's address space and execute. Libtools 1 How the libtool works? I Libtool script is generated by congure script and ltmain.sh. I Libtool script then insulates the author of the build system from the nuances of building shared libraries on dierent platforms. 2 Add following lines in congure.ac: I AC_SEARCH_LIBS([dlopen], [dl]) I AC_SEARCH_LIBS([lt_dlopen], [ltdl]) Demo1: Makele for compiling? File:Project_Name/src/main.c /home/mengke/Research/autotoo…demo/demo1_makefile/src/main.c Page 1 of 1 #include <stdio.h> #include <stdlib.h> int main(int argc, char * argv[]) { printf("Hello from %s!\n", argv[0]); return 0; } Demo1: Makele for compiling? File:Project_Name/src/Makele /home/mengke/Research/autotoo…mo/demo1_makefile/src/Makefile Page 1 of 1 #TARGET1: refer to actions "HelloWorld" in TARGET2 all: HelloWorld #TARGET2: depends on HelloWorld.o, # ultimately depends on TARTET3 HelloWorld: HelloWorld.o gcc -o HelloWorld HelloWorld.o #TARGET3: depends on main.c HelloWorld.o: main.c cc -c -o HelloWorld.o main.c #TARGET4: delete HelloWorld and HelloWorld.o clean: rm HelloWorld HelloWorld.o #TARGET5: refer to actions "all" and "clean" .PHONY: all clean Demo2:Makele for Creating Source Distribution Archive File:Project_Name/Makele /home/mengke/Research/autotoo…emo/demo2_makePackage/Makefile Page 1 of 1 #TARGET1: refer to src/Makefile # 1. go into src folder # 2. run target "all" in src/Makefile all: cd src && make #TARGET2: creates distribution, refers to TARGET3 dist: HelloWorld-1.0.tar.gz #TARGET3: generate software package # ultimately depends on TARGET4 HelloWorld-1.0.tar.gz: HelloWorld-1.0 tar -zcvf HelloWorld-1.0.tar.gz HelloWorld-1.0 rm -rf HelloWorld-1.0 #TARGET4: create package distribution directory HelloWorld-1.0: mkdir -p HelloWorld-1.0/src cp Makefile HelloWorld-1.0 cp src/Makefile HelloWorld-1.0/src cp src/main.c HelloWorld-1.0/src #TARGET5: check the all the functions for both Makefile and src/Makefile distcheck: HelloWorld-1.0.tar.gz tar -zxvf HelloWorld-1.0.tar.gz cd HelloWorld-1.0 && make all cd HelloWorld-1.0 && make clean rm -rf Helloworld-1.0 @echo "**** Package Helloworld-1.0.tar.gz is ready for distribution." #TARGET6: refer to actions "all", "clean" and "dist" .PHONY: all clean dist Demo3: Autoconf for conguring project File: /home/mengke/Research/autotoo…mo3_configureFile/configure.ac Page 1 of 1 Project_Name/congure.ac #pass 'HelloWorld' to variable "package" in Makefile.in #pass '1.0' to variable "version" in Makefile.in AC_INIT([HelloWorld],[1.0]) #generate Makefile by running the script './configure' AC_CONFIG_FILES([Makefile src/Makefile]) AC_OUTPUT Demo3:File: /home/mengke/Research/autotoo…emo3_configureFile/Makefile.in Autoconf for conguring project Page 1 of 1 # Configure Input package = @PACKAGE_NAME@ version = @PACKAGE_VERSION@ tarname = @PACKAGE_TARNAME@ distdir = $(tarname)-$(version) #TARGET1: refer to src/Makefile # 1. go into src folder # 2. run target "all" in src/Makefile all clean check HelloWorld install uninstall: cd src && $(MAKE) $@ #TARGET2: creates distribution, refers to TARGET3 dist: $(distdir).tar.gz #TARGET3: generate software package # ultimately depends on TARGET4 $(distdir).tar.gz: $(distdir) tar -zcvf $(distdir).tar.gz $(distdir) rm -rf $(distdir) #TARGET4: create package distribution directory $(distdir): mkdir -p $(distdir)/src # cp Makefile $(distdir) # cp src/Makefile $(distdir)/src cp src/main.c $(distdir)/src cp configure.ac $(distdir) cp configure $(distdir) cp Makefile.in $(distdir) cp src/Makefile.in $(distdir)/src #TARGET5: check the all the functions for both Makefile and src/Makefile distcheck: $(distdir).tar.gz gzip -cd $(distdir).tar.gz | tar xvf - # tar -zxvf $(distdir).tar.gz cd $(distdir) && ./configure cd $(distdir) && $(MAKE) all cd $(distdir) && $(MAKE) check cd $(distdir) && $(MAKE) install cd $(distdir) && $(MAKE) uninstall cd $(distdir) && $(MAKE) clean rm -rf $(distdir) @echo "**** Package Helloworld-1.0.tar.gz is ready for distribution." #TARGET6: regenerate Makefile if its template (Makefile.in) has changed Makefile: Makefile.in config.status ./config.status $@ #TARGET7: rebuild config.status when configure changes config.status: configure ./config.status --recheck #TARGET8: refer to actions "all", "clean", "dist", "install" and "uninstall" .PHONY: all clean check dist distcheck install uninstall Demo3: Autoconf for conguring project autoreconf Generate congure script from congure.ac ./congure Generate Makele from Makele.in make dist Package the software project into tarball Demo4: Autoconf for automatic Makeles File: /home/mengke/Research/autotoo…/demo4_makefileam/configure.ac Page 1 of 1 congure.ac #Initializes the Autoconf system #pass 'HelloWorld'