开发者

Easy makefiles for gcc/g++

开发者 https://www.devze.com 2023-01-16 14:42 出处:网络
My projects almst always consist of: Pairs of Foo.h and Foo.cpp Some extra headers util.h etc. What is the simplest way to write a 开发者_Go百科makefile that

My projects almst always consist of:

  1. Pairs of Foo.h and Foo.cpp

  2. Some extra headers util.h etc.

What is the simplest way to write a 开发者_Go百科makefile that

  • Runs

    $CC -c foo.cpp
    

for each .cpp file, keeping a dependency to its coresponding .h file

  • Provides some way that I can manually add extra dependencies
  • Includes a linking step with my manuall set $LIBS variable.

I work with Linux(Ubuntu) and gcc/g++.


Please, just use automake. You'll get proper dependency tracking, makefiles that comply with the GNU Makefile Standards (e.g., make install does the correct thing and respects DESTDIR and prefix), the ability to check for system quirks as needed and support for building proper distribution tarballs.

This is a minimal configure.ac:

                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.61])
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
AM_INIT_AUTOMAKE([foreign])

# Checks for programs.
AC_PROG_CXX

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

AC_CONFIG_FILES([Makefile])
AC_OUTPUT

and a minimal Makefile.am:

## Process this file with automake to generate Makefile.in
bin_PROGRAMS = foo
foo_SOURCES = foo.cpp bar.h baz.h quux.cpp

Run autoreconf -i to generate the configure script, followed by ./configure and make.

Here is an excellent autotools tutorial.


How about this:

%.o: %.cpp %.h
    $(CC) -c $< -o $@

# Some things have extra dependencies. (Headers like util.h are unlikely
# to change, but you can handle them this way if you really want to.)
#
# foo.o and bar.o both depend on baz.h
foo.o bar.o: baz.h

# foo.o also depends on gab.h and jig.h
foo.o: gab.h jig.h

# You will need a list of object files. You can build it by hand:
OBJ_FILES = foo.o bar.o snaz.o # and so on

# ...or just grab all the files in the source directory:
SOURCE_FILES = $(wildcard *.cpp)
OBJ_FILES = $(SOURCE_FILES:.cpp=.o)

# It is possible to get this from the environment, but not advisable.
LIBS = -lred -lblue

final-thing: $(OBJ_FILES)
    $(CC) $(LIBS) $^ -o $@


Perhaps you can check out CMake?

If you're unfamiliar with CMake, it's basically a Makefile generator (or XCode, or Visual Studio Projects, etc, depending on platform), so it lets you specify just the variables you need, and takes care of header dependency issues for you, makefile generation, etc.


Here is a simple shell script that constructs a makefile from all .cpp files in a given directory:

# !sh    
if [ $# = 0 ]
then
echo -e "please give executable name"
exit 1
fi

echo -e -n "CC=g++\nOPTIMS=\nLIBS= " > makefile

echo >> makefile
echo -n "$1: " >> makefile
for fic in *.cpp
do
echo -n "${fic%\.cpp}.o " >> makefile
done

echo >> makefile
echo -n -e "\t\$(CC) " >> makefile
for fic in *.cpp
do
echo -n "${fic%\.cpp}.o " >> makefile
done
echo -n -e "-o $1 \$(OPTIMS) \$(LIBS)\n" >> makefile

echo >> makefile
for fic in *.cpp
do
g++ -MM $fic >> makefile
echo -e "\t\$(CC) -c $fic \$(OPTIMS)\n" >> makefile
done

exit 0

It uses the -MM option of gcc for creating makefile dependency lines. Just create the script in the sources directory, (let's call it micmake), make it executable (chmod +x micmake) and type

./micmake go

It will create a makefile and the make command compile your project. The executable is named go. You can edit the makefile if you need special compilation options or libraries. For more complex projects and dependencies, you should use automake, cmake or scons.


start here simple makefile for gcc


Here is an example from one of my projects -- you can simply drop new pairs foo1.cc and foo1.h in there and they will automagically be built for you:

# determine all sources and from that all targets
sources :=              $(wildcard *.cpp)
programs :=             $(sources:.cpp=)

## compiler etc settings used in default make rules 
CXX :=                  g++
CPPFLAGS :=             -Wall 
CXXFLAGS :=             -O3 -pipe 
LDLIBS :=  

# build all and strip programs afterwards 
all:                    $(programs) 
                        @test -x /usr/bin/strip && strip $^ 
0

精彩评论

暂无评论...
验证码 换一张
取 消