2010-08-26 8 views

Respuesta

8

Puede escribir un Makefile que hace esto para usted:

SOURCES=$(shell find . -name "*.cpp") 
OBJECTS=$(SOURCES:%.cpp=%.o) 
TARGET=foo 

.PHONY: all 
all: $(TARGET) 

$(TARGET): $(OBJECTS) 
     $(LINK.cpp) $^ $(LOADLIBES) $(LDLIBS) -o [email protected] 

.PHONY: clean 
clean: 
     rm -f $(TARGET) $(OBJECTS) 

Sólo tiene que colocar este en el directorio raíz de la jerarquía de las fuentes y ejecute make (necesitará GNU Make para que esto funcione).

(Tenga en cuenta que yo no soy fluido en Makefile ish así que tal vez esto se puede hacer más fácil.)

+2

También tiene función comodín para encontrar archivos. –

+1

+1 ¿Por qué no utilizar los nombres estándar para las cosas. Y las reglas estándar funcionarán para el objetivo sin necesidad de hacer nada especial. –

+0

@Martin: Intenté usar una regla implícita para el objetivo pero no tuve éxito :) Parece posible solo si uno de los archivos fuente se llama '$ (TARGET) .cpp'. ¿Qué quieres decir con "los nombres estándar para las cosas"? – Job

3

Hay un guión muy antigua llamada 'makedepend' que utiliza para hacer muy archivos make simples. Desde entonces me cambié a Cmake por casi todo.

Aquí está el artículo de wiki http://en.wikipedia.org/wiki/Makedepend, tenga en cuenta la lista de Alternativas en la parte inferior que incluye depcomp en automake, y la bandera -M en gcc.

EDITAR: Como alguien me señaló en otra pregunta, gcc -MM *.cpp > Makefile produce un archivo makef simple bastante agradable. Sólo hay que anteponer sus CPPFLAGS y una regla para la construcción de todo el binario ... que tendrá la forma:

CPPFLAGS=-Wall 
LDFLAGS=-lm 
all: binary_name 
binary_name: foo.o bar.o baz.o biff.o 
+0

¿Cómo hace esto lo que quiere el OP? AFAIK, 'makedepend' solo genera dependencias, no las reglas para construir los archivos. – Job

+0

La versión de makedepend con la que estaba jugando en realidad creó un archivo MAKE funcional. – jkerian

+0

99% de las veces, las reglas implícitas manejarán todo excepto el binario final también. – jkerian

7

CMake lo hace y que incluso crea archivos make y proyectos de Visual Studio. http://www.cmake.org/

Todo lo que necesita hacer es crear un archivo que contiene CMakeLists.txt las líneas siguientes;

file(GLOB sources *.h *.c *.cxx *.cpp *.hxx) 
add_executable(Foo ${sources}) 

Entonces entra en un directorio limpio y tipo:

cmake /path/to/project/ 

que crearán archivos make en ese directorio de compilación limpio.

1
  • sin necesidad de detectar dependencias externas
  • configuración
  • uso por defecto del compilador/enlazador

¿Por qué script entonces? Siempre que todos los archivos de origen del proyecto son *.cpp y en el directorio actual:

all: $(notdir $(CURDIR)) 
$(notdir $(CURDIR)): $(subst .cpp,.o,$(wildcard *.cpp)) 
     $(LINK.cpp) $^ $(LOADLIBES) $(LDLIBS) -o [email protected] 

El Makefile construirían los todos los archivos de origen con la configuración por defecto del compilador/enlazador en un archivo ejecutable llamado así por el nombre del directorio actual.

De lo contrario, generalmente recomiendo a las personas que prueben SCons en lugar de hacerlo donde sea mucho más simple e intuitivo.Se agregó la bonificación de que no hay necesidad de codificar manualmente los objetivos clean, la verificación de dependencia de origen/encabezado está incorporada, es recursiva de forma nativa y admite bibliotecas adecuadamente.

5

Esto es lo que yo usaría para un proyecto simple:

CC    = $(CXX) 
CXXFLAGS  += -ansi -pedantic -W -Wall -Werror 
CPPFLAGS  += -I<Dir Where Boost Lives> 


SOURCES   = $(wildcard *.cpp) 
OBJECTS   = $(patsubst %.cpp,%.o,$(SOURCES)) 

all:    myApp 
myApp:   $(OBJECTS) 

La única restricción es que si usted está construyendo un ejecutable llamado myApp. Entonces uno de los archivos fuente debe llamarse myApp.cpp (que es donde pongo main).

+0

+1 A partir de una plantilla simple makefile no es una mala idea IMO. No sé por qué alguien decidió rechazar esto. – StackedCrooked

+0

Para GNU make al menos, la función es $ (comodín) no $ (comodines) –

0

Como se describe en el enlace discussion, HWUT es una herramienta que puede generar archivos Makefiles bonitos, buscando dependencias e incluyendo archivos en directorios que usted le indique. En Windows necesita instalar MinGW y Ctags. En Linux, gcc y ctags probablemente estén presentes. Es OpenSource y de uso gratuito.

Especialmente, cuando se generan pruebas unitarias para algunos módulos ya existentes de un proyecto más grande con mala cohesión, esta característica le ahorra horas o incluso días.

Cuestiones relacionadas