Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Create directories using make file

I want to create directories using makefile. My project directory is like this

+--Project      +--output      +--source        +Testfile.cpp      +Makefile   

I want to put all the objects and output into the respective output folder. I want to create folder structure which would be like this after compiling.

+--Project    +--output      +--debug (or release)        +--objs          +Testfile.o        +Testfile (my executable file)    +--source      +Testfile.cpp    +Makefile 

I tried with several options, but could not succeed. Please help me to make directories using make file. I'm posting my Makefile for your consideration.

#--------------------------------------------------------------------- # Input dirs, names, files #--------------------------------------------------------------------- OUTPUT_ROOT := output/  TITLE_NAME := TestProj   ifdef DEBUG      TITLE_NAME += _DEBUG else ifdef RELEASE     TITLE_NAME += _RELEASE endif endif   # Include all the source files here with the directory tree SOURCES := \         source/TestFile.cpp \  #--------------------------------------------------------------------- # configs #--------------------------------------------------------------------- ifdef DEBUG OUT_DIR     := $(OUTPUT_ROOT)debug CC_FLAGS    := -c -Wall else ifdef RELEASE OUT_DIR     := $(OUTPUT_ROOT)release CC_FLAGS    := -c -Wall else $(error no build type defined) endif endif  # Put objects in the output directory. OUT_O_DIR   := $(OUT_DIR)/objs  #--------------------------------------------------------------------- # settings #--------------------------------------------------------------------- OBJS = $(SOURCES:.cpp=.o) DIRS = $(subst /,/,$(sort $(dir $(OBJS)))) DIR_TARGET = $(OUT_DIR)  OUTPUT_TARGET = $(OUT_DIR)/$(TITLE_NAME)  CC_FLAGS +=     LCF_FLAGS :=   LD_FLAGS :=   #--------------------------------------------------------------------- # executables #--------------------------------------------------------------------- MD := mkdir RM := rm CC := g++  #--------------------------------------------------------------------- # rules #--------------------------------------------------------------------- .PHONY: all clean title   all: title   clean:     $(RM) -rf $(OUT_DIR)  $(DIR_TARGET):     $(MD) -p $(DIRS)  .cpp.o:      @$(CC) -c $< -o $@  $(OBJS): $(OUT_O_DIR)/%.o: %.cpp     @$(CC) -c $< -o $@  title: $(DIR_TARGET) $(OBJS) 
like image 836
Jabez Avatar asked Dec 23 '09 05:12

Jabez


People also ask

Can Makefile target be a directory?

Yes, a Makefile can have a directory as target. Your problem could be that the cd doesn't do what you want: it does cd and the git clone is carried out in the original directory (the one you cd ed from, not the one you cd ed to). This is because for every command in the Makefile an extra shell is created.

Which command can create directories?

The command that allows you to create directories (also known as folders) is mkdir .


1 Answers

In my opinion, directories should not be considered targets of your makefile, either in technical or in design sense. You should create files and if a file creation needs a new directory then quietly create the directory within the rule for the relevant file.

If you're targeting a usual or "patterned" file, just use make's internal variable $(@D), that means "the directory the current target resides in" (cmp. with $@ for the target). For example,

$(OUT_O_DIR)/%.o: %.cpp         @mkdir -p $(@D)         @$(CC) -c $< -o $@  title: $(OBJS) 

Then, you're effectively doing the same: create directories for all $(OBJS), but you'll do it in a less complicated way.

The same policy (files are targets, directories never are) is used in various applications. For example, git revision control system doesn't store directories.


Note: If you're going to use it, it might be useful to introduce a convenience variable and utilize make's expansion rules.

dir_guard=@mkdir -p $(@D)  $(OUT_O_DIR)/%.o: %.cpp         $(dir_guard)         @$(CC) -c $< -o $@  $(OUT_O_DIR_DEBUG)/%.o: %.cpp         $(dir_guard)         @$(CC) -g -c $< -o $@  title: $(OBJS) 
like image 108
P Shved Avatar answered Sep 19 '22 17:09

P Shved