2012-02-07 17 views
14

Quiero ser capaz de dividir mi bin y mis archivos de código en directorios separados ya que se está volviendo difícil de administrar en su estado actual.¿Cómo puede Makefile utilizar directorios separados para el código fuente y los binarios?

que idealmente gustaría tener

project_dir 
|-Makefile 
|-run_tests.sh 
| 
|__source 
| |-program1.cpp 
| |-program2.cpp 
| 
|__bin 
    |-program1 
    |-program2 

Sin embargo soy incapaz de conseguir que esto funcione con mi sistema actual sin tener que escribir manualmente las reglas para cada programa (tenga en cuenta que cada programa es una programa independiente, no una serie de objetos vinculados entre sí)

#Current make system 
BIN=./bin/ 
SOURCE=./source/ 

LIST=program1 program2... 

all: $(LIST) 

%: $(SOURCE)%.cpp 
    $(CC) $(INC) $< $(CFLAGS) -o $(BIN)[email protected] $(LIBS) 

esto funciona, excepto que yo no puede ver el objetivo en la ruta actual por lo que piensa que siempre se vuelve a generar los binarios incluso si los archivos de origen no tienen cambiado

Mi único pensamiento en este momento es escribir un programa para hacer un archivo MAKE pero no quiero hacer eso.

+0

El enfoque tradicional es llamar al directorio de origen 'src', construir los binarios allí, y tener un paso' install' separado en el que los archivos binarios se copian en el directorio 'bin', incluso hay una utilidad especial' instalar' para hacer eso. – reinierpost

Respuesta

17

Eras casi allí ...

#Current make system 
BIN=./bin/ 
SOURCE=./source/ 

LIST=$(BIN)/program1 $(BIN)/program2... 

all: $(LIST) 

$(BIN)/%: $(SOURCE)%.cpp 
    $(CC) $(INC) $< $(CFLAGS) -o [email protected] $(LIBS) 

También puede hacer que el LIST más fácil usando la siguiente

PROG=program1 program2 
LIST=$(addprefix $(BIN)/, $(PROG)) 
+0

Pregunta tonta, pero ¿hay alguna forma de utilizar la variable '%' (es decir, nombrar menos directorio) en la línea de comandos. así que "gcc blah blah -D%" (para que el programa sepa su propio nombre) – 111111

+2

Sí, puedes usar '$ *' para obtener la raíz. –

+0

Excelente Creo que mi archivo make está a punto, gracias por toda su ayuda. – 111111

1

solución fácil: Uso automake.

Si desea hacer esto a mano, deberá emplear la directiva vpath o la variable de entorno VPATH. El manual de fabricación de GNU tiene a section sobre ellos. Coloque su archivo Makefile directamente en el directorio bin, establezca VPATH en el directorio de origen y las reglas implícitas funcionarán nuevamente.

+1

No soy fanático de automake si se puede hacer con un archivo make bien hecho. – 111111

1

Aquí está una versión completa lista para usar del Makefile.

Prepare la carpeta con el siguiente directorio

de archivos .o: /build/ de archivos .cpp: /src/ para archivos binarios: /bin/

A continuación, utilice el siguiente Makefile en /

CC   = g++ 
LD   = g++ 
CFLAG  = -Wall 
PROG_NAME = prog 

SRC_DIR  = ./src 
BUILD_DIR = ./build 
BIN_DIR  = ./bin 
SRC_LIST = $(wildcard $(SRC_DIR)/*.cpp) 
OBJ_LIST = $(BUILD_DIR)/$(notdir $(SRC_LIST:.cpp=.o)) 

.PHONY: all clean $(PROG_NAME) compile 

all: $(PROG_NAME) 

compile: 
    $(CC) -c $(CFLAG) $(SRC_LIST) -o $(OBJ_LIST) 

$(PROG_NAME): compile 
    $(LD) $(OBJ_LIST) -o $(BIN_DIR)/[email protected] 

clean: 
    rm -f $(BIN_DIR)/$(PROG_NAME) $(BUILD_DIR)/*.o 

Su programa final se nombrará como progresivo en el /bin/, cada vez que compile el código, los binarios se separarán en /build/ para que el directorio del código fuente sea muy limpio y ordenado.

Cuestiones relacionadas