Skip to content

Instantly share code, notes, and snippets.

@arturoc
Created April 5, 2013 12:38
Show Gist options
  • Save arturoc/5318992 to your computer and use it in GitHub Desktop.
Save arturoc/5318992 to your computer and use it in GitHub Desktop.
.DEFAULT_GOAL=Release
# define the OF_SHARED_MAKEFILES location
OF_SHARED_MAKEFILES_PATH=$(OF_ROOT)/libs/openFrameworksCompiled/project/makefileCommon
include $(OF_SHARED_MAKEFILES_PATH)/config.shared.mk
# if APPNAME is not defined, set it to the project dir name
ifndef APPNAME
APPNAME = $(shell basename `pwd`)
endif
# Name TARGET
ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug)
TARGET_NAME = Debug
ifndef RUN_TARGET
RUN_TARGET = RunDebug
endif
ifndef PLATFORM_PROJECT_DEBUG_TARGET
TARGET = bin/$(APPNAME)_debug
else
TARGET = $(PLATFORM_PROJECT_DEBUG_TARGET)
endif
ifndef PLATFORM_PROJECT_DEBUG_BIN_NAME
BIN_NAME = $(APPNAME)_debug
else
BIN_NAME = $(PLATFORM_PROJECT_DEBUG_BIN_NAME)
endif
else ifeq ($(findstring Release,$(MAKECMDGOALS)),Release)
TARGET_NAME = Release
ifndef RUN_TARGET
RUN_TARGET = RunRelease
endif
ifndef PLATFORM_PROJECT_RELEASE_TARGET
TARGET = bin/$(APPNAME)
else
TARGET = $(PLATFORM_PROJECT_RELEASE_TARGET)
endif
ifndef PLATFORM_PROJECT_RELEASE_BIN_NAME
BIN_NAME = $(APPNAME)
else
BIN_NAME = $(PLATFORM_PROJECT_RELEASE_BIN_NAME)
endif
else ifeq ($(MAKECMDGOALS),run)
TARGET_NAME = Release
ifndef PLATFORM_PROJECT_RELEASE_TARGET
TARGET = bin/$(APPNAME)
else
TARGET = $(PLATFORM_PROJECT_RELEASE_TARGET)
endif
ifndef PLATFORM_PROJECT_RELEASE_BIN_NAME
BIN_NAME = $(APPNAME)
else
BIN_NAME = $(PLATFORM_PROJECT_RELEASE_BIN_NAME)
endif
else ifeq ($(MAKECMDGOALS),)
TARGET_NAME = Release
ifndef RUN_TARGET
RUN_TARGET = run
endif
ifndef PLATFORM_PROJECT_RELEASE_TARGET
TARGET = bin/$(APPNAME)
else
TARGET = $(PLATFORM_PROJECT_RELEASE_TARGET)
endif
ifndef PLATFORM_PROJECT_RELEASE_BIN_NAME
BIN_NAME = $(APPNAME)
else
BIN_NAME = $(PLATFORM_PROJECT_RELEASE_BIN_NAME)
endif
endif
ABIS_TO_COMPILE =
ifeq ($(findstring Release,$(TARGET_NAME)),Release)
ifdef ABIS_TO_COMPILE_RELEASE
ABIS_TO_COMPILE += $(ABIS_TO_COMPILE_RELEASE)
endif
endif
ifeq ($(findstring Debug,$(TARGET_NAME)),Debug)
ifdef ABIS_TO_COMPILE_DEBUG
ifeq ($(findstring Release,$(TARGET_NAME)),Release)
ifdef ABIS_TO_COMPILE_RELEASE
ABIS_TO_COMPILE = $(filter-out $(ABIS_TO_COMPILE_DEBUG),$(ABIS_TO_COMPILE_RELEASE))
endif
endif
ABIS_TO_COMPILE += $(ABIS_TO_COMPILE_DEBUG)
endif
endif
ifeq ($(MAKECMDGOALS),clean)
TARGET = bin/$(APPNAME)_debug bin/$(APPNAME)
TARGET_NAME = Release
endif
# we only get a CLEAN_TARGET if a TARGET_NAME has been defined
# Like TARGET, this must be defined above or in a platform file.
ifdef TARGET_NAME
CLEANTARGET = $(addprefix Clean,$(TARGET_NAME))
endif
ifeq ($(findstring ABI,$(MAKECMDGOALS)),ABI)
include $(OF_SHARED_MAKEFILES_PATH)/config.project.mk
-include $(OF_PROJECT_DEPENDENCY_FILES)
endif
.PHONY: all Debug Release after clean CleanDebug CleanRelease help
Release:
@echo Compiling OF library for Release
@$(MAKE) --no-print-directory -C $(OF_ROOT)/libs/openFrameworksCompiled/project/ Release PLATFORM_OS=$(PLATFORM_OS) ABIS_TO_COMPILE_RELEASE="$(ABIS_TO_COMPILE_RELEASE)"
@echo
@echo
@echo Compiling $(APPNAME) for Release
ifndef ABIS_TO_COMPILE_RELEASE
@$(MAKE) --no-print-directory ReleaseABI
else
@$(foreach abi,$(ABIS_TO_COMPILE_RELEASE),$(MAKE) --no-print-directory ReleaseABI ABI=$(abi) &&) echo
endif
ifneq ($(strip $(PROJECT_ADDONS_DATA)),)
@$(MAKE) copyaddonsdata PROJECT_ADDONS_DATA=$(PROJECT_ADDONS_DATA)
endif
@$(MAKE) --no-print-directory afterplatform BIN_NAME=$(BIN_NAME) ABIS_TO_COMPILE="$(ABIS_TO_COMPILE_RELEASE)" RUN_TARGET=$(RUN_TARGET) TARGET=$(TARGET)
Debug:
@echo Compiling OF library for Debug
$(MAKE) --no-print-directory -C $(OF_ROOT)/libs/openFrameworksCompiled/project/ Debug PLATFORM_OS=$(PLATFORM_OS) ABIS_TO_COMPILE_DEBUG="$(ABIS_TO_COMPILE_DEBUG)"
@echo
@echo
@echo Compiling $(APPNAME) for Debug
ifndef ABIS_TO_COMPILE_DEBUG
@$(MAKE) --no-print-directory DebugABI
else
@$(foreach abi,$(ABIS_TO_COMPILE_DEBUG),$(MAKE) --no-print-directory DebugABI ABI=$(abi) &&) echo
endif
ifneq ($(strip $(PROJECT_ADDONS_DATA)),)
@$(MAKE) copyaddonsdata PROJECT_ADDONS_DATA=$(PROJECT_ADDONS_DATA)
endif
@$(MAKE) --no-print-directory afterplatform BIN_NAME=$(BIN_NAME) ABIS_TO_COMPILE="$(ABIS_TO_COMPILE_DEBUG)" RUN_TARGET=$(RUN_TARGET) TARGET=$(TARGET)
ReleaseABI: $(TARGET)
DebugABI: $(TARGET)
all:
$(MAKE) Debug
run:
ifeq ($(PLATFORM_RUN_COMMAND),)
@bin/$(BIN_NAME)
else
@$(PLATFORM_RUN_COMMAND) $(BIN_NAME)
endif
RunRelease:
ifeq ($(PLATFORM_RUN_COMMAND),)
@bin/$(BIN_NAME)
else
@$(PLATFORM_RUN_COMMAND) $(BIN_NAME)
endif
RunDebug:
ifeq ($(PLATFORM_RUN_COMMAND),)
@bin/$(BIN_NAME)
else
@$(PLATFORM_RUN_COMMAND) $(BIN_NAME)
endif
#This rule does the compilation
#$(OBJS): $(SOURCES)
$(OF_PROJECT_OBJ_OUPUT_PATH)/%.o: $(PROJECT_ROOT)/%.cpp
@echo "Compiling" $<
mkdir -p $(@D)
$(CXX) -c $(OPTIMIZATION_CFLAGS) $(CFLAGS) -MMD -MP -MF $(OF_PROJECT_OBJ_OUPUT_PATH)/$*.d -MT $(OF_PROJECT_OBJ_OUPUT_PATH)/$*.o -o $@ -c $<
$(OF_PROJECT_OBJ_OUPUT_PATH)/%.o: $(PROJECT_ROOT)/%.cxx
@echo "Compiling" $<
mkdir -p $(@D)
$(CXX) -c $(OPTIMIZATION_CFLAGS) $(CFLAGS) -MMD -MP -MF $(OF_PROJECT_OBJ_OUPUT_PATH)/$*.d -MT $(OF_PROJECT_OBJ_OUPUT_PATH)/$*.o -o $@ -c $<
$(OF_PROJECT_OBJ_OUPUT_PATH)/%.o: $(PROJECT_ROOT)/%.cc
@echo "Compiling" $<
mkdir -p $(@D)
$(CXX) -c $(OPTIMIZATION_CFLAGS) $(CFLAGS) -MMD -MP -MF $(OF_PROJECT_OBJ_OUPUT_PATH)/$*.d -MT $(OF_PROJECT_OBJ_OUPUT_PATH)/$*.o -o $@ -c $<
$(OF_PROJECT_OBJ_OUPUT_PATH)/%.o: $(PROJECT_ROOT)/%.c
@echo "Compiling" $<
mkdir -p $(@D)
$(CC) -c $(OPTIMIZATION_CFLAGS) $(CFLAGS) -MMD -MP -MF $(OF_PROJECT_OBJ_OUPUT_PATH)/$*.d -MT $(OF_PROJECT_OBJ_OUPUT_PATH)/$*.o -o $@ -c $<
$(OF_PROJECT_OBJ_OUPUT_PATH)/%.o: $(PROJECT_ROOT)/%.S
@echo "Compiling" $<
mkdir -p $(@D)
$(CC) -c $(OPTIMIZATION_CFLAGS) $(CFLAGS) -MMD -MP -MF $(OF_PROJECT_OBJ_OUPUT_PATH)/$*.d -MT $(OF_PROJECT_OBJ_OUPUT_PATH)/$*.o -o $@ -c $<
$(OF_PROJECT_OBJ_OUPUT_PATH)/%.o: $(PROJECT_EXTERNAL_SOURCE_PATHS)/%.cpp
@echo "Compiling" $<
mkdir -p $(@D)
$(CXX) -c $(OPTIMIZATION_CFLAGS) $(CFLAGS) -MMD -MP -MF $(OF_PROJECT_OBJ_OUPUT_PATH)/$*.d -MT $(OF_PROJECT_OBJ_OUPUT_PATH)/$*.o -o $@ -c $<
$(OF_PROJECT_OBJ_OUPUT_PATH)/%.o: $(PROJECT_EXTERNAL_SOURCE_PATHS)/%.cxx
@echo "Compiling" $<
mkdir -p $(@D)
$(CXX) -c $(OPTIMIZATION_CFLAGS) $(CFLAGS) -MMD -MP -MF $(OF_PROJECT_OBJ_OUPUT_PATH)/$*.d -MT $(OF_PROJECT_OBJ_OUPUT_PATH)/$*.o -o $@ -c $<
$(OF_PROJECT_OBJ_OUPUT_PATH)/%.o: $(PROJECT_EXTERNAL_SOURCE_PATHS)/%.cc
@echo "Compiling" $<
mkdir -p $(@D)
$(CXX) -c $(OPTIMIZATION_CFLAGS) $(CFLAGS) -MMD -MP -MF $(OF_PROJECT_OBJ_OUPUT_PATH)/$*.d -MT $(OF_PROJECT_OBJ_OUPUT_PATH)/$*.o -o $@ -c $<
$(OF_PROJECT_OBJ_OUPUT_PATH)/%.o: $(PROJECT_EXTERNAL_SOURCE_PATHS)/%.c
@echo "Compiling" $<
mkdir -p $(@D)
$(CC) -c $(OPTIMIZATION_CFLAGS) $(CFLAGS) -MMD -MP -MF $(OF_PROJECT_OBJ_OUPUT_PATH)/$*.d -MT $(OF_PROJECT_OBJ_OUPUT_PATH)/$*.o -o $@ -c $<
$(OF_PROJECT_OBJ_OUPUT_PATH)/%.o: $(PROJECT_EXTERNAL_SOURCE_PATHS)/%.S
@echo "Compiling" $<
mkdir -p $(@D)
$(CC) -c $(OPTIMIZATION_CFLAGS) $(CFLAGS) -MMD -MP -MF $(OF_PROJECT_OBJ_OUPUT_PATH)/$*.d -MT $(OF_PROJECT_OBJ_OUPUT_PATH)/$*.o -o $@ -c $<
$(OF_ROOT)/addons/$(OF_PROJECT_OBJ_OUPUT_PATH)/%.o: $(OF_ROOT)/addons/%.cpp
@echo "Compiling" $<
mkdir -p $(@D)
$(CXX) -c $(OPTIMIZATION_CFLAGS) $(CFLAGS) -MMD -MP -MF $(OF_ROOT)/addons/$(OF_PROJECT_OBJ_OUPUT_PATH)/$*.d -MT $(OF_ROOT)/addons/$(OF_PROJECT_OBJ_OUPUT_PATH)/$*.o -o $@ -c $<
$(OF_ROOT)/addons/$(OF_PROJECT_OBJ_OUPUT_PATH)/%.o: $(OF_ROOT)/addons/%.cxx
@echo "Compiling" $<
mkdir -p $(@D)
$(CXX) -c $(OPTIMIZATION_CFLAGS) $(CFLAGS) -MMD -MP -MF $(OF_ROOT)/addons/$(OF_PROJECT_OBJ_OUPUT_PATH)/$*.d -MT $(OF_ROOT)/addons/$(OF_PROJECT_OBJ_OUPUT_PATH)/$*.o -o $@ -c $<
$(OF_ROOT)/addons/$(OF_PROJECT_OBJ_OUPUT_PATH)/%.o: $(OF_ROOT)/addons/%.cc
@echo "Compiling" $<
mkdir -p $(@D)
$(CXX) -c $(OPTIMIZATION_CFLAGS) $(CFLAGS) -MMD -MP -MF $(OF_ROOT)/addons/$(OF_PROJECT_OBJ_OUPUT_PATH)/$*.d -MT $(OF_ROOT)/addons/$(OF_PROJECT_OBJ_OUPUT_PATH)/$*.o -o $@ -c $<
$(OF_ROOT)/addons/$(OF_PROJECT_OBJ_OUPUT_PATH)/%.o: $(OF_ROOT)/addons/%.c
@echo "Compiling" $<
mkdir -p $(@D)
$(CC) -c $(OPTIMIZATION_CFLAGS) $(CFLAGS) -MMD -MP -MF $(OF_ROOT)/addons/$(OF_PROJECT_OBJ_OUPUT_PATH)/$*.d -MT $(OF_ROOT)/addons/o$(OF_PROJECT_OBJ_OUPUT_PATH)/$*.o -o $@ -c $<
$(OF_ROOT)/addons/$(OF_PROJECT_OBJ_OUPUT_PATH)/%.o: $(OF_ROOT)/addons/%.S
@echo "Compiling" $<
mkdir -p $(@D)
$(CC) -c $(OPTIMIZATION_CFLAGS) $(CFLAGS) -MMD -MP -MF $(OF_ROOT)/addons/$(OF_PROJECT_OBJ_OUPUT_PATH)/$*.d -MT $(OF_ROOT)/addons/o$(OF_PROJECT_OBJ_OUPUT_PATH)/$*.o -o $@ -c $<
$(TARGET): $(OF_PROJECT_OBJS) $(OF_PROJECT_ADDONS_OBJS) $(OF_PROJECT_LIBS) $(TARGET_LIBS)
@echo 'Linking $(TARGET) for $(ABI_LIB_SUBPATH)'
mkdir -p $(@D)
$(CXX) -o $@ $(OF_PROJECT_OBJS) $(OF_PROJECT_ADDONS_OBJS) $(LDFLAGS) $(TARGET_LIBS) $(OF_PROJECT_LIBS) $(OF_CORE_LIBS)
clean:
@$(MAKE) --no-print-directory CleanDebug
@$(MAKE) --no-print-directory CleanRelease
$(CLEANTARGET)ABI:
ifneq ($(OF_PROJECT_ADDONS_OBJS),)
rm -f $(OF_PROJECT_ADDONS_OBJS)
endif
rm -rf $(OF_PROJECT_OBJ_OUPUT_PATH)
rm -f $(TARGET)
rm -rf $(BIN_NAME)
$(CLEANTARGET):
ifndef ABIS_TO_COMPILE
@$(MAKE) --no-print-directory $(CLEANTARGET)ABI
else
ifeq ($(TARGET_NAME),Debug)
@$(foreach abi,$(ABIS_TO_COMPILE_DEBUG),$(MAKE) --no-print-directory $(CLEANTARGET)ABI ABI=$(abi) &&) echo done
else
@$(foreach abi,$(ABIS_TO_COMPILE_RELEASE),$(MAKE) --no-print-directory $(CLEANTARGET)ABI ABI=$(abi) &&) echo done
endif
endif
@rm -rf bin/libs
after: $(TARGET_NAME)
cp -r $(OF_EXPORT_PATH)/$(ABI_LIB_SUBPATH)/* bin/
@echo
@echo " compiling done"
@echo " to launch the application"
@echo
@echo " cd bin"
@echo " ./$(BIN_NAME)"
@echo " "
@echo " - or -"
@echo " "
@echo " $(MAKE) $(RUN_TARGET)"
@echo
copyaddonsdata:
@mkdir -p bin/data
@cp -rf $(PROJECT_ADDONS_DATA) bin/data/
help:
@echo
@echo openFrameworks universal makefile
@echo
@echo "Targets:"
@echo
@echo "make Debug: builds the library with debug symbols"
@echo "make Release: builds the library with optimizations"
@echo "make: = make Release"
@echo "make all: = make Release"
@echo "make CleanDebug: cleans the Debug target"
@echo "make CleanRelease: cleans the Release target"
@echo "make clean: cleans everything"
@echo "make help: this help message"
@echo
@echo
@echo this should work with any OF app, just copy any example
@echo change the name of the folder and it should compile
@echo "only .cpp support, don't use .c files"
@echo it will look for files in any folder inside the application
@echo folder except that in the EXCLUDE_FROM_SOURCE variable.
@echo "it doesn't autodetect include paths yet"
@echo "add the include paths editing the var USER_CFLAGS"
@echo at the beginning of the makefile using the gcc syntax:
@echo -Ipath
@echo
@echo to add addons to your application, edit the addons.make file
@echo in this directory and add the names of the addons you want to
@echo include
@echo
#legacy targets
AndroidRelease:
$(MAKE) Release PLATFORM_OS=Android
AndroidDebug:
$(MAKE) Debug PLATFORM_OS=Android
CleanAndroid:
$(MAKE) clean PLATFORM_OS=Android
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment