From 4b71b5ea57ef9ba1dd34f0dcd872b8d6d893f657 Mon Sep 17 00:00:00 2001 From: bilderbuchi Date: Sat, 24 Mar 2012 18:32:13 +0100 Subject: [PATCH 01/13] gitignore clean-up: Unignore first batch of falsely ignored files. --- addons/.gitignore | 4 ++++ apps/.gitignore | 3 +++ .../AdvancedImageLoading/bin/data/resaved/exrFloat/.gitignore | 4 +++- .../AdvancedImageLoading/bin/data/resaved/jpg8/.gitignore | 4 +++- .../AdvancedImageLoading/bin/data/resaved/png16/.gitignore | 4 +++- .../AdvancedImageLoading/bin/data/resaved/png8/.gitignore | 4 +++- 6 files changed, 19 insertions(+), 4 deletions(-) diff --git a/addons/.gitignore b/addons/.gitignore index 72c780cdec7..41e6fe65046 100644 --- a/addons/.gitignore +++ b/addons/.gitignore @@ -1,4 +1,5 @@ !ofAddons.h +!.project !ofx3DModelLoader !ofx3DModelLoader/** !ofxAccelerometer @@ -32,3 +33,6 @@ !ofxGui/*/** ofxAndroid/ofAndroidLib/bin ofxAndroid/ofAndroidLib/gen + +# don't ignore the .gitignore file +!.gitignore diff --git a/apps/.gitignore b/apps/.gitignore index 7be5d569933..9d30d32a34f 100644 --- a/apps/.gitignore +++ b/apps/.gitignore @@ -4,3 +4,6 @@ # ignore bin folders' contents, except data folder therein /devApps/*/bin/* !/devApps/*/bin/data/ + +# don't ignore the .gitignore file +!.gitignore diff --git a/apps/devApps/AdvancedImageLoading/bin/data/resaved/exrFloat/.gitignore b/apps/devApps/AdvancedImageLoading/bin/data/resaved/exrFloat/.gitignore index f59ec20aabf..6361a516d6c 100644 --- a/apps/devApps/AdvancedImageLoading/bin/data/resaved/exrFloat/.gitignore +++ b/apps/devApps/AdvancedImageLoading/bin/data/resaved/exrFloat/.gitignore @@ -1 +1,3 @@ -* \ No newline at end of file +* +# don't ignore the .gitignore file +!.gitignore diff --git a/apps/devApps/AdvancedImageLoading/bin/data/resaved/jpg8/.gitignore b/apps/devApps/AdvancedImageLoading/bin/data/resaved/jpg8/.gitignore index f59ec20aabf..6361a516d6c 100644 --- a/apps/devApps/AdvancedImageLoading/bin/data/resaved/jpg8/.gitignore +++ b/apps/devApps/AdvancedImageLoading/bin/data/resaved/jpg8/.gitignore @@ -1 +1,3 @@ -* \ No newline at end of file +* +# don't ignore the .gitignore file +!.gitignore diff --git a/apps/devApps/AdvancedImageLoading/bin/data/resaved/png16/.gitignore b/apps/devApps/AdvancedImageLoading/bin/data/resaved/png16/.gitignore index f59ec20aabf..6361a516d6c 100644 --- a/apps/devApps/AdvancedImageLoading/bin/data/resaved/png16/.gitignore +++ b/apps/devApps/AdvancedImageLoading/bin/data/resaved/png16/.gitignore @@ -1 +1,3 @@ -* \ No newline at end of file +* +# don't ignore the .gitignore file +!.gitignore diff --git a/apps/devApps/AdvancedImageLoading/bin/data/resaved/png8/.gitignore b/apps/devApps/AdvancedImageLoading/bin/data/resaved/png8/.gitignore index f59ec20aabf..6361a516d6c 100644 --- a/apps/devApps/AdvancedImageLoading/bin/data/resaved/png8/.gitignore +++ b/apps/devApps/AdvancedImageLoading/bin/data/resaved/png8/.gitignore @@ -1 +1,3 @@ -* \ No newline at end of file +* +# don't ignore the .gitignore file +!.gitignore From b4cab67ab98d8c85ed886bbf88b25bb79f394cee Mon Sep 17 00:00:00 2001 From: bilderbuchi Date: Sat, 24 Mar 2012 18:53:51 +0100 Subject: [PATCH 02/13] gitignore clean-up: Ignore binaries but not data folder in examples. --- apps/.gitignore | 4 ++++ examples/.gitignore | 5 +---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/apps/.gitignore b/apps/.gitignore index 9d30d32a34f..c615082f938 100644 --- a/apps/.gitignore +++ b/apps/.gitignore @@ -5,5 +5,9 @@ /devApps/*/bin/* !/devApps/*/bin/data/ +/devApps/*/.cproject +/devApps/*/.project +/devApps/*/.settings + # don't ignore the .gitignore file !.gitignore diff --git a/examples/.gitignore b/examples/.gitignore index 6e309c4139b..509daa6a4f9 100644 --- a/examples/.gitignore +++ b/examples/.gitignore @@ -18,7 +18,4 @@ libneondetection.so Application.mk Android.mk */*/bin/* -!*/*/bin/data -!*/*/bin/data/* -!*/*/bin/data/** -!*/*/bin/data/**/* +!*/*/bin/data/ From 3c4d32191fd66023123c955632bede9cfa1d5857 Mon Sep 17 00:00:00 2001 From: bilderbuchi Date: Wed, 28 Mar 2012 14:14:20 +0200 Subject: [PATCH 03/13] Remove Android examples' config.make and Makefile. --- .../androidAdvanced3DExample/config.make | 32 -- .../android/androidAssimpExample/Makefile | 475 ------------------ .../android/androidAssimpExample/config.make | 32 -- examples/android/androidAudioExample/Makefile | 475 ------------------ .../android/androidAudioExample/config.make | 32 -- .../android/androidCameraExample/Makefile | 475 ------------------ .../android/androidCameraExample/config.make | 32 -- examples/android/androidEmptyExample/Makefile | 475 ------------------ .../android/androidEmptyExample/config.make | 32 -- examples/android/androidFontExample/Makefile | 475 ------------------ .../android/androidFontExample/config.make | 32 -- examples/android/androidImageExample/Makefile | 475 ------------------ .../android/androidImageExample/config.make | 32 -- .../android/androidOpenCVExample/Makefile | 475 ------------------ .../android/androidOpenCVExample/config.make | 32 -- .../android/androidPolygonExample/Makefile | 475 ------------------ .../android/androidPolygonExample/config.make | 32 -- .../androidSoundPlayerExample/Makefile | 475 ------------------ .../androidSoundPlayerExample/config.make | 32 -- examples/android/androidTouchExample/Makefile | 475 ------------------ .../android/androidTouchExample/config.make | 32 -- examples/android/androidVBOExample/Makefile | 475 ------------------ .../android/androidVBOExample/config.make | 32 -- 23 files changed, 5609 deletions(-) delete mode 100644 examples/android/androidAdvanced3DExample/config.make delete mode 100644 examples/android/androidAssimpExample/Makefile delete mode 100644 examples/android/androidAssimpExample/config.make delete mode 100644 examples/android/androidAudioExample/Makefile delete mode 100644 examples/android/androidAudioExample/config.make delete mode 100644 examples/android/androidCameraExample/Makefile delete mode 100644 examples/android/androidCameraExample/config.make delete mode 100644 examples/android/androidEmptyExample/Makefile delete mode 100644 examples/android/androidEmptyExample/config.make delete mode 100644 examples/android/androidFontExample/Makefile delete mode 100644 examples/android/androidFontExample/config.make delete mode 100644 examples/android/androidImageExample/Makefile delete mode 100644 examples/android/androidImageExample/config.make delete mode 100644 examples/android/androidOpenCVExample/Makefile delete mode 100644 examples/android/androidOpenCVExample/config.make delete mode 100644 examples/android/androidPolygonExample/Makefile delete mode 100644 examples/android/androidPolygonExample/config.make delete mode 100644 examples/android/androidSoundPlayerExample/Makefile delete mode 100644 examples/android/androidSoundPlayerExample/config.make delete mode 100644 examples/android/androidTouchExample/Makefile delete mode 100644 examples/android/androidTouchExample/config.make delete mode 100644 examples/android/androidVBOExample/Makefile delete mode 100644 examples/android/androidVBOExample/config.make diff --git a/examples/android/androidAdvanced3DExample/config.make b/examples/android/androidAdvanced3DExample/config.make deleted file mode 100644 index 8266e5d914e..00000000000 --- a/examples/android/androidAdvanced3DExample/config.make +++ /dev/null @@ -1,32 +0,0 @@ -# add custom variables to this file - -# OF_ROOT allows to move projects outside apps/* just set this variable to the -# absoulte path to the OF root folder - -OF_ROOT = ../../.. - - -# USER_CFLAGS allows to pass custom flags to the compiler -# for example search paths like: -# USER_CFLAGS = -I src/objects - -USER_CFLAGS = - - -# USER_LDFLAGS allows to pass custom flags to the linker -# for example libraries like: -# USER_LD_FLAGS = libs/libawesomelib.a - -USER_LDFLAGS = - -# android specific, in case you want to use different optimizations -USER_LIBS_ARM = -USER_LIBS_ARM7 = -USER_LIBS_NEON = - -# android optimizations - -ANDROID_COMPILER_OPTIMIZATION = -Os - - -EXCLUDE_FROM_SOURCE="bin,.xcodeproj,obj" diff --git a/examples/android/androidAssimpExample/Makefile b/examples/android/androidAssimpExample/Makefile deleted file mode 100644 index f61fe5d517a..00000000000 --- a/examples/android/androidAssimpExample/Makefile +++ /dev/null @@ -1,475 +0,0 @@ -# openFrameworks universal makefile -# -# make help : shows this message -# make Debug: makes the application with debug symbols -# make Release: makes the app with optimizations -# make: the same as make Release -# make CleanDebug: cleans the Debug target -# make CleanRelease: cleans the Release target -# make clean: cleans everything -# -# -# this should work with any OF app, just copy any example -# change the name of the folder and it should compile -# only .cpp support, don't use .c files -# it will look for files in any folder inside the application -# folder except that in the EXCLUDE_FROM_SOURCE variable -# it doesn't autodetect include paths yet -# add the include paths in the USER_CFLAGS variable -# using the gcc syntax: -Ipath -# -# to add addons to your application, edit the addons.make file -# in this directory and add the names of the addons you want to -# include -# -# edit the following vars to customize the makefile - -include config.make - -ifeq ($(findstring Android,$(MAKECMDGOALS)),Android) - include $(OF_ROOT)/libs/openFrameworksCompiled/project/android/paths.make - ARCH = android - ifeq ($(shell uname),Darwin) - HOST_PLATFORM = darwin-x86 - else - HOST_PLATFORM = linux-x86 - endif -endif - -ifeq ($(ARCH),android) - COMPILER_OPTIMIZATION = $(ANDROID_COMPILER_OPTIMIZATION) - NDK_PLATFORM = android-8 -else - COMPILER_OPTIMIZATION = $(USER_COMPILER_OPTIMIZATION) -endif - - - - -# you shouldn't modify anything below this line - - -SHELL = /bin/sh -ifneq ($(ARCH),android) - CXX = g++ - ARCH = $(shell uname -m) - ifeq ($(ARCH),x86_64) - LIBSPATH=linux64 - else - LIBSPATH=linux - endif -else - ifeq ($(findstring Release_arm7,$(MAKECMDGOALS)),Release_arm7) - LIBSPATH =android/armeabi-v7a - else - LIBSPATH =android/armeabi - endif - #NDK_ROOT = $(shell cat $(OF_ROOT)/libs/openFrameworksCompiled/project/android/ndk_path.make) - #SDK_ROOT = $(shell cat $(OF_ROOT)/libs/openFrameworksCompiled/project/android/sdk_path.make) - TOOLCHAIN=arm-linux-androideabi-4.4.3 - TOOLCHAIN_PATH=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/ - ANDROID_PREFIX=arm-linux-androideabi- - CC=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)gcc - CXX=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)g++ - AR=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)ar - SYSROOT=$(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/ - CFLAGS += -nostdlib --sysroot=$(SYSROOT) -fno-short-enums - CFLAGS += -I"$(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" -I"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/include/" -I"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include" - CFLAGS += -DANDROID -endif - -NODEPS = clean -SED_EXCLUDE_FROM_SRC = $(shell echo $(EXCLUDE_FROM_SOURCE) | sed s/\,/\\\\\|/g) -SOURCE_DIRS = $(shell find . -maxdepth 1 -mindepth 1 -type d | grep -v $(SED_EXCLUDE_FROM_SRC) | sed s/.\\///) -SOURCES = $(shell find $(SOURCE_DIRS) -name "*.cpp" -or -name "*.c" -or -name "*.cc") -OBJFILES = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(patsubst %.cc,%.o,$(SOURCES)))) - -ifneq (,$(USER_SOURCE_DIR)) - USER_SOURCES = $(shell find $(USER_SOURCE_DIR) -name "*.cpp" -or -name "*.c" -or -name "*.cc") - USER_OBJFILES = $(subst $(USER_SOURCE_DIR)/, ,$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(patsubst %.cc,%.o,$(USER_SOURCES))))) -endif - -APPNAME = $(shell basename `pwd`) -CORE_INCLUDES = $(shell find $(OF_ROOT)/libs/openFrameworks/ -type d) -CORE_INCLUDE_FLAGS = $(addprefix -I,$(CORE_INCLUDES)) -INCLUDES = $(shell find $(OF_ROOT)/libs/*/include -type d | grep -v glu | grep -v quicktime | grep -v poco) -INCLUDES_FLAGS = $(addprefix -I,$(INCLUDES)) -INCLUDES_FLAGS += -I$(OF_ROOT)/libs/poco/include -ifeq ($(ARCH),android) - INCLUDES_FLAGS += -I$(OF_ROOT)/libs/glu/include_android -else - INCLUDES_FLAGS += -I$(OF_ROOT)/libs/glu/include - INCLUDES_FLAGS += $(shell pkg-config glew gstreamer-0.10 gstreamer-video-0.10 gstreamer-base-0.10 libudev --cflags) - #check if gtk exists and add it - GTK = $(shell pkg-config gtk+-2.0 --exists; echo $$?) - ifeq ($(GTK),0) - CFLAGS += $(shell pkg-config gtk+-2.0 --cflags) -DOF_USING_GTK - SYSTEMLIBS += $(shell pkg-config gtk+-2.0 --libs) - endif - - #check if mpg123 exists and add it - MPG123 = $(shell pkg-config libmpg123 --exists; echo $$?) - ifeq ($(MPG123),0) - CFLAGS += -DOF_USING_MPG123 - SYSTEMLIBS += -lmpg123 - endif -endif -LIB_STATIC = $(shell ls $(OF_ROOT)/libs/*/lib/$(LIBSPATH)/*.a 2> /dev/null | grep -v openFrameworksCompiled | grep -v Poco) -LIB_SHARED = $(shell ls $(OF_ROOT)/libs/*/lib/$(LIBSPATH)/*.so 2> /dev/null | grep -v openFrameworksCompiled | sed "s/.*\\/lib\([^/]*\)\.so/-l\1/") -LIB_STATIC += $(OF_ROOT)/libs/poco/lib/$(LIBSPATH)/libPocoNet.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoXML.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoUtil.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoFoundation.a -LIB_PATHS_FLAGS = $(shell ls -d $(OF_ROOT)/libs/*/lib/$(LIBSPATH) | sed "s/\(\.*\)/-L\1/") - -CFLAGS += -Wall -fexceptions -CFLAGS += -I. -CFLAGS += $(INCLUDES_FLAGS) -CFLAGS += $(CORE_INCLUDE_FLAGS) - - - -ifeq ($(ARCH),android) - LDFLAGS = --sysroot=$(SYSROOT) -nostdlib -L"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi" - SYSTEMLIBS += -lstdc++ -lsupc++ -lgcc -lz -lGLESv1_CM -llog -ldl -lm -lc -else - LDFLAGS = -Wl,-rpath=./libs - SYSTEMLIBS += $(shell pkg-config jack glew gstreamer-0.10 gstreamer-video-0.10 gstreamer-base-0.10 gstreamer-app-0.10 libudev --libs) - SYSTEMLIBS += -lglut -lGL -lasound -lopenal -lsndfile -lvorbis -lFLAC -logg -lfreeimage -endif - - -ifeq ($(findstring addons.make,$(wildcard *.make)),addons.make) - ifneq ($(ARCH),android) - ADDONS = $(shell cat addons.make | grep -v ofxAndroid) - else - ADDONS = $(shell cat addons.make) - endif - - ifneq ($(strip $(ADDONS)),) - ADDONS_REL_DIRS = $(addsuffix /src, $(ADDONS)) - ADDONS_LIBS_REL_DIRS = $(addsuffix /libs, $(ADDONS)) - ADDONS_DIRS = $(addprefix $(OF_ROOT)/addons/, $(ADDONS_REL_DIRS) ) - ADDONS_LIBS_DIRS = $(addprefix $(OF_ROOT)/addons/, $(ADDONS_LIBS_REL_DIRS) ) - ADDONS_BIN_LIBS_DIRS = $(addsuffix /*/lib/$(LIBSPATH), $(ADDONS_LIBS_DIRS) ) - - ADDONS_INCLUDES = $(ADDONS_DIRS) - ADDONS_INCLUDES = $(ADDONS_LIBS_DIRS) - ADDONS_INCLUDES += $(shell find $(ADDONS_DIRS) -type d 2> /dev/null) - ADDONS_INCLUDES += $(shell find $(ADDONS_LIBS_DIRS) -type d 2> /dev/null) - ADDONSCFLAGS = $(addprefix -I,$(ADDONS_INCLUDES)) - - ifeq ($(findstring libsorder.make,$(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null)),libsorder.make) - ADDONS_LIBS_W_ORDER = $(shell cat $(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null)) - EXCLUDE_LIBS_FILTER = $(addprefix %,$(addsuffix .a,$(ADDONS_LIBS_W_ORDER))) - ADDONS_LIBS_STATICS = $(filter-out $(EXCLUDE_LIBS_FILTER), $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.a)) - ADDONS_LIBS_STATICS += $(addprefix -l, $(ADDONS_LIBS_W_ORDER)) - ADDONS_LIBS_STATICS += $(addprefix -L, $(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null | sed s/libsorder.make//g)) - else - ADDONS_LIBS_STATICS = $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.a 2> /dev/null) - endif - - ADDONS_LIBS_SHARED = $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.so 2> /dev/null) - ADDONSLIBS = $(ADDONS_LIBS_STATICS) - ADDONSLIBS += $(ADDONS_LIBS_SHARED) - - - ADDONS_SOURCES = $(shell find $(ADDONS_DIRS) -name "*.cpp" -or -name "*.c" 2> /dev/null) - ADDONS_SOURCES += $(shell find $(ADDONS_LIBS_DIRS) -name "*.cpp" -or -name "*.c" -or -name "*.cc" 2>/dev/null) - ADDONS_OBJFILES = $(subst $(OF_ROOT)/, ,$(patsubst %.cc,%.o,$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(ADDONS_SOURCES))))) - endif -endif - - -ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) - TARGET_CFLAGS = -g - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworksDebug.a - TARGET_NAME = Debug -endif - -ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) - TARGET_CFLAGS = $(COMPILER_OPTIMIZATION) - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworks.a - TARGET_NAME = Release -endif - -ifeq ($(ARCH),android) - ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) - TARGET = libs/armeabi/libOFAndroidApp.so - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworksDebug.a - LDFLAGS += -Wl,--fix-cortex-a8 -shared - USER_LIBS = $(USER_LIBS_ARM) - endif - - ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) - TARGET = libs/armeabi/libOFAndroidApp.so - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks.a - LDFLAGS += -Wl,--fix-cortex-a8 -shared - USER_LIBS = $(USER_LIBS_ARM) - endif - - ifeq ($(findstring Release_arm7,$(MAKECMDGOALS)),Release_arm7) - TARGET_NAME = Release_arm7 - TARGET_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mthumb - TARGET = libs/armeabi-v7a/libOFAndroidApp.so - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks_arm7.a - USER_LIBS = $(USER_LIBS_ARM7) - endif - - ifeq ($(findstring Release_neon,$(MAKECMDGOALS)),Release_neon) - TARGET_NAME = Release_neon - TARGET_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mfpu=neon - TARGET = libs/armeabi-v7a/libOFAndroidApp_neon.so - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks_neon.a - USER_LIBS = $(USER_LIBS_NEON) - endif - - ifeq ($(findstring TestLink,$(MAKECMDGOALS)),TestLink) - TARGET_NAME = Debug - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworksDebug.a - LDFLAGS += -Wl,--entry=main,--fix-cortex-a8 - BIN_NAME = $(APPNAME) - TARGET = obj/$(BIN_NAME) - USER_LIBS = $(USER_LIBS_ARM) - endif -else - ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) - BIN_NAME = $(APPNAME)_debug - TARGET = bin/$(BIN_NAME) - endif - - ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) - BIN_NAME = $(APPNAME) - TARGET = bin/$(BIN_NAME) - endif - - ifeq ($(MAKECMDGOALS),) - TARGET_NAME = Release - BIN_NAME = $(APPNAME) - TARGET = bin/$(BIN_NAME) - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworks.a - endif -endif - -ifeq ($(MAKECMDGOALS),clean) - TARGET = bin/$(APPNAME)_debug bin/$(APPNAME) - TARGET_NAME = Release -endif - -ifeq ($(MAKECMDGOALS),AndroidInstall) - TARGET_NAME = Install -endif - -OBJ_OUTPUT = obj/$(ARCH)$(TARGET_NAME)/ -CLEANTARGET = clean$(TARGET_NAME) - -OBJS = $(addprefix $(OBJ_OUTPUT), $(OBJFILES)) -DEPFILES = $(patsubst %.o,%.d,$(OBJS)) - -USER_OBJS = $(addprefix $(OBJ_OUTPUT), $(USER_OBJFILES)) -DEPFILES += $(patsubst %.o,%.d,$(USER_OBJS)) - -ifeq ($(findstring addons.make,$(wildcard *.make)),addons.make) - ADDONS_OBJS = $(addprefix $(OBJ_OUTPUT), $(ADDONS_OBJFILES)) - DEPFILES += $(patsubst %.o,%.d,$(ADDONS_OBJS)) -endif - -.PHONY: Debug Release all after afterDebugAndroid afterReleaseAndroid - -Release: $(TARGET) after - -Debug: $(TARGET) after - -all: - $(MAKE) Release - -DebugAndroid: $(TARGET) - -ReleaseAndroid: $(TARGET) - -Release_arm7Android: $(TARGET) - -Release_neonAndroid: $(TARGET) afterReleaseAndroid - -TestLinkAndroid: $(TARGET) afterDebugAndroid - -AndroidDebug: - $(MAKE) DebugAndroid - $(MAKE) TestLinkAndroid - -AndroidRelease: - $(MAKE) ReleaseAndroid - $(MAKE) Release_arm7Android - $(MAKE) Release_neonAndroid - - -#This rule does the compilation -#$(OBJS): $(SOURCES) -$(OBJ_OUTPUT)%.o: %.cpp - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CXX) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: %.c - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CC) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: %.cc - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CC) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.cpp - @echo "compiling addon object for" $< - mkdir -p $(@D) - $(CXX) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< - -$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.c - @echo "compiling addon object for" $< - mkdir -p $(@D) - $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< - -$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.cc - @echo "compiling addon object for" $< - mkdir -p $(@D) - $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< - -$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.c - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.cc - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.cpp - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CXX) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(TARGET): $(OBJS) $(ADDONS_OBJS) $(USER_OBJS) $(TARGET_LIBS) $(LIB_STATIC) - @echo 'linking $(TARGET)' - mkdir -p $(@D) - $(CXX) -o $@ $(OBJS) $(ADDONS_OBJS) $(USER_OBJS) $(LDFLAGS) $(USER_LDFLAGS) $(TARGET_LIBS) $(ADDONSLIBS) $(USER_LIBS) $(LIB_STATIC) $(LIB_PATHS_FLAGS) $(LIB_SHARED) $(SYSTEMLIBS) - --include $(DEPFILES) - -.PHONY: clean cleanDebug cleanRelease CleanAndroid -clean: - rm -rf $(OBJ_OUTPUT) - rm -f $(TARGET) - rm -r bin/libs - -$(CLEANTARGET): - rm -rf $(OBJ_OUTPUT) - rm -f $(TARGET) - rm -rf bin/libs - -CleanAndroid: - rm -Rf obj - rm -f libs/armeabi-v7a/libOFAndroidApp.so - rm -f libs/armeabi/libOFAndroidApp.so - rm -f obj/$(APPNAME) - - -afterDebugAndroid:$(TARGET) - @if [ -d libs/armeabi-v7a ]; then rm -r libs/armeabi-v7a; fi - - @cp $(NDK_ROOT)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver libs/armeabi - - #create gdb.setup for armeabi - @echo "set solib-search-path $(PWD)/obj/local/armeabi:$(PWD)/libs/armeabi" > libs/armeabi/gdb.setup - @echo "directory $(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" >> libs/armeabi/gdb.setup - @echo "directory $(PWD)/src" >> libs/armeabi/gdb.setup - @echo "directory $(NDK_ROOT)/sources/cxx-stl/system" >> libs/armeabi/gdb.setup - @echo "directory $(PWD)/libs/armeabi" >> libs/armeabi/gdb.setup - @echo "" >> libs/armeabi/gdb.setup - - @if [ ! -d jni ]; then mkdir jni; fi - @echo "APP_ABI := armeabi" > jni/Application.mk - @echo "#LOCAL_MODULE := OFAndroidApp" > jni/Android.mk - -afterReleaseAndroid:$(TARGET) - @if [ -f obj/$(BIN_NAME) ]; then rm obj/$(BIN_NAME); fi - - @cp $(OF_ROOT)/libs/openFrameworksCompiled/project/android/libneondetection.so libs/armeabi-v7a/ - @cp $(NDK_ROOT)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver libs/armeabi-v7a - - #create gdb.setup for armeabi-v7a - @echo "set solib-search-path $(PWD)/obj/local/armeabi-v7a:$(PWD)/libs/armeabi-v7a" > libs/armeabi-v7a/gdb.setup - @echo "directory $(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" >> libs/armeabi-v7a/gdb.setup - @echo "directory $(PWD)/src" >> libs/armeabi-v7a/gdb.setup - @echo "directory $(NDK_ROOT)/sources/cxx-stl/system" >> libs/armeabi-v7a/gdb.setup - @echo "directory $(PWD)/libs/armeabi-v7a" >> libs/armeabi-v7a/gdb.setup - @echo "" >> libs/armeabi-v7a/gdb.setup - - @if [ ! -d jni ]; then mkdir jni; fi - @echo "APP_ABI := armeabi armeabi-v7a" > jni/Application.mk - @echo "#LOCAL_MODULE := OFAndroidApp" > jni/Android.mk - -RESNAME=$(shell echo $(APPNAME)Resources | tr '[A-Z]' '[a-z]') - -AndroidInstall: - if [ -d "bin/data" ]; then \ - mkdir -p res/raw; \ - rm res/raw/$(RESNAME).zip; \ - cd bin/data; \ - zip -r ../../res/raw/$(RESNAME).zip *; \ - cd ../..; \ - fi - if [ -f obj/$(BIN_NAME) ]; then rm obj/$(BIN_NAME); fi - #touch AndroidManifest.xml - $(SDK_ROOT)/tools/android update project --target $(NDK_PLATFORM) --path $(PROJECT_PATH) - if [ -d bin/classes ]; then rm -r bin/classes; fi - if [ -d bin/classes.dex ]; then rm bin/classes.dex; fi - if [ -d bin/OFActivity.ap_ ]; then rm bin/OFActivity.ap_; fi - if [ -d bin/OFActivity-debug.apk ]; then rm bin/OFActivity-debug.apk; fi - if [ -d bin/OFActivity-debug-unaligned.apk ]; then rm bin/OFActivity-debug-unaligned.apk; fi - if [ -d bin/$(APPNAME).apk ]; then rm bin/$(APPNAME).apk; fi - ant debug - cp bin/OFActivity-debug.apk bin/$(APPNAME).apk - #if [ "$(shell $(SDK_ROOT)/platform-tools/adb get-state)" = "device" ]; then - $(SDK_ROOT)/platform-tools/adb install -r bin/$(APPNAME).apk; - #fi - $(SDK_ROOT)/platform-tools/adb shell am start -a android.intent.action.MAIN -n cc.openframeworks.$(APPNAME)/cc.openframeworks.$(APPNAME).OFActivity - - -after:$(TARGET) - cp -r $(OF_ROOT)/export/$(LIBSPATH)/libs bin/ - @echo - @echo " compiling done" - @echo " to launch the application" - @echo - @echo " cd bin" - @echo " ./$(BIN_NAME)" - @echo - - -.PHONY: help -help: - @echo - @echo openFrameworks universal makefile - @echo - @echo targets: - @echo "make Debug: builds the application with debug symbols" - @echo "make Release: builds the app 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 - @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 diff --git a/examples/android/androidAssimpExample/config.make b/examples/android/androidAssimpExample/config.make deleted file mode 100644 index 8266e5d914e..00000000000 --- a/examples/android/androidAssimpExample/config.make +++ /dev/null @@ -1,32 +0,0 @@ -# add custom variables to this file - -# OF_ROOT allows to move projects outside apps/* just set this variable to the -# absoulte path to the OF root folder - -OF_ROOT = ../../.. - - -# USER_CFLAGS allows to pass custom flags to the compiler -# for example search paths like: -# USER_CFLAGS = -I src/objects - -USER_CFLAGS = - - -# USER_LDFLAGS allows to pass custom flags to the linker -# for example libraries like: -# USER_LD_FLAGS = libs/libawesomelib.a - -USER_LDFLAGS = - -# android specific, in case you want to use different optimizations -USER_LIBS_ARM = -USER_LIBS_ARM7 = -USER_LIBS_NEON = - -# android optimizations - -ANDROID_COMPILER_OPTIMIZATION = -Os - - -EXCLUDE_FROM_SOURCE="bin,.xcodeproj,obj" diff --git a/examples/android/androidAudioExample/Makefile b/examples/android/androidAudioExample/Makefile deleted file mode 100644 index f61fe5d517a..00000000000 --- a/examples/android/androidAudioExample/Makefile +++ /dev/null @@ -1,475 +0,0 @@ -# openFrameworks universal makefile -# -# make help : shows this message -# make Debug: makes the application with debug symbols -# make Release: makes the app with optimizations -# make: the same as make Release -# make CleanDebug: cleans the Debug target -# make CleanRelease: cleans the Release target -# make clean: cleans everything -# -# -# this should work with any OF app, just copy any example -# change the name of the folder and it should compile -# only .cpp support, don't use .c files -# it will look for files in any folder inside the application -# folder except that in the EXCLUDE_FROM_SOURCE variable -# it doesn't autodetect include paths yet -# add the include paths in the USER_CFLAGS variable -# using the gcc syntax: -Ipath -# -# to add addons to your application, edit the addons.make file -# in this directory and add the names of the addons you want to -# include -# -# edit the following vars to customize the makefile - -include config.make - -ifeq ($(findstring Android,$(MAKECMDGOALS)),Android) - include $(OF_ROOT)/libs/openFrameworksCompiled/project/android/paths.make - ARCH = android - ifeq ($(shell uname),Darwin) - HOST_PLATFORM = darwin-x86 - else - HOST_PLATFORM = linux-x86 - endif -endif - -ifeq ($(ARCH),android) - COMPILER_OPTIMIZATION = $(ANDROID_COMPILER_OPTIMIZATION) - NDK_PLATFORM = android-8 -else - COMPILER_OPTIMIZATION = $(USER_COMPILER_OPTIMIZATION) -endif - - - - -# you shouldn't modify anything below this line - - -SHELL = /bin/sh -ifneq ($(ARCH),android) - CXX = g++ - ARCH = $(shell uname -m) - ifeq ($(ARCH),x86_64) - LIBSPATH=linux64 - else - LIBSPATH=linux - endif -else - ifeq ($(findstring Release_arm7,$(MAKECMDGOALS)),Release_arm7) - LIBSPATH =android/armeabi-v7a - else - LIBSPATH =android/armeabi - endif - #NDK_ROOT = $(shell cat $(OF_ROOT)/libs/openFrameworksCompiled/project/android/ndk_path.make) - #SDK_ROOT = $(shell cat $(OF_ROOT)/libs/openFrameworksCompiled/project/android/sdk_path.make) - TOOLCHAIN=arm-linux-androideabi-4.4.3 - TOOLCHAIN_PATH=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/ - ANDROID_PREFIX=arm-linux-androideabi- - CC=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)gcc - CXX=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)g++ - AR=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)ar - SYSROOT=$(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/ - CFLAGS += -nostdlib --sysroot=$(SYSROOT) -fno-short-enums - CFLAGS += -I"$(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" -I"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/include/" -I"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include" - CFLAGS += -DANDROID -endif - -NODEPS = clean -SED_EXCLUDE_FROM_SRC = $(shell echo $(EXCLUDE_FROM_SOURCE) | sed s/\,/\\\\\|/g) -SOURCE_DIRS = $(shell find . -maxdepth 1 -mindepth 1 -type d | grep -v $(SED_EXCLUDE_FROM_SRC) | sed s/.\\///) -SOURCES = $(shell find $(SOURCE_DIRS) -name "*.cpp" -or -name "*.c" -or -name "*.cc") -OBJFILES = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(patsubst %.cc,%.o,$(SOURCES)))) - -ifneq (,$(USER_SOURCE_DIR)) - USER_SOURCES = $(shell find $(USER_SOURCE_DIR) -name "*.cpp" -or -name "*.c" -or -name "*.cc") - USER_OBJFILES = $(subst $(USER_SOURCE_DIR)/, ,$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(patsubst %.cc,%.o,$(USER_SOURCES))))) -endif - -APPNAME = $(shell basename `pwd`) -CORE_INCLUDES = $(shell find $(OF_ROOT)/libs/openFrameworks/ -type d) -CORE_INCLUDE_FLAGS = $(addprefix -I,$(CORE_INCLUDES)) -INCLUDES = $(shell find $(OF_ROOT)/libs/*/include -type d | grep -v glu | grep -v quicktime | grep -v poco) -INCLUDES_FLAGS = $(addprefix -I,$(INCLUDES)) -INCLUDES_FLAGS += -I$(OF_ROOT)/libs/poco/include -ifeq ($(ARCH),android) - INCLUDES_FLAGS += -I$(OF_ROOT)/libs/glu/include_android -else - INCLUDES_FLAGS += -I$(OF_ROOT)/libs/glu/include - INCLUDES_FLAGS += $(shell pkg-config glew gstreamer-0.10 gstreamer-video-0.10 gstreamer-base-0.10 libudev --cflags) - #check if gtk exists and add it - GTK = $(shell pkg-config gtk+-2.0 --exists; echo $$?) - ifeq ($(GTK),0) - CFLAGS += $(shell pkg-config gtk+-2.0 --cflags) -DOF_USING_GTK - SYSTEMLIBS += $(shell pkg-config gtk+-2.0 --libs) - endif - - #check if mpg123 exists and add it - MPG123 = $(shell pkg-config libmpg123 --exists; echo $$?) - ifeq ($(MPG123),0) - CFLAGS += -DOF_USING_MPG123 - SYSTEMLIBS += -lmpg123 - endif -endif -LIB_STATIC = $(shell ls $(OF_ROOT)/libs/*/lib/$(LIBSPATH)/*.a 2> /dev/null | grep -v openFrameworksCompiled | grep -v Poco) -LIB_SHARED = $(shell ls $(OF_ROOT)/libs/*/lib/$(LIBSPATH)/*.so 2> /dev/null | grep -v openFrameworksCompiled | sed "s/.*\\/lib\([^/]*\)\.so/-l\1/") -LIB_STATIC += $(OF_ROOT)/libs/poco/lib/$(LIBSPATH)/libPocoNet.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoXML.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoUtil.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoFoundation.a -LIB_PATHS_FLAGS = $(shell ls -d $(OF_ROOT)/libs/*/lib/$(LIBSPATH) | sed "s/\(\.*\)/-L\1/") - -CFLAGS += -Wall -fexceptions -CFLAGS += -I. -CFLAGS += $(INCLUDES_FLAGS) -CFLAGS += $(CORE_INCLUDE_FLAGS) - - - -ifeq ($(ARCH),android) - LDFLAGS = --sysroot=$(SYSROOT) -nostdlib -L"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi" - SYSTEMLIBS += -lstdc++ -lsupc++ -lgcc -lz -lGLESv1_CM -llog -ldl -lm -lc -else - LDFLAGS = -Wl,-rpath=./libs - SYSTEMLIBS += $(shell pkg-config jack glew gstreamer-0.10 gstreamer-video-0.10 gstreamer-base-0.10 gstreamer-app-0.10 libudev --libs) - SYSTEMLIBS += -lglut -lGL -lasound -lopenal -lsndfile -lvorbis -lFLAC -logg -lfreeimage -endif - - -ifeq ($(findstring addons.make,$(wildcard *.make)),addons.make) - ifneq ($(ARCH),android) - ADDONS = $(shell cat addons.make | grep -v ofxAndroid) - else - ADDONS = $(shell cat addons.make) - endif - - ifneq ($(strip $(ADDONS)),) - ADDONS_REL_DIRS = $(addsuffix /src, $(ADDONS)) - ADDONS_LIBS_REL_DIRS = $(addsuffix /libs, $(ADDONS)) - ADDONS_DIRS = $(addprefix $(OF_ROOT)/addons/, $(ADDONS_REL_DIRS) ) - ADDONS_LIBS_DIRS = $(addprefix $(OF_ROOT)/addons/, $(ADDONS_LIBS_REL_DIRS) ) - ADDONS_BIN_LIBS_DIRS = $(addsuffix /*/lib/$(LIBSPATH), $(ADDONS_LIBS_DIRS) ) - - ADDONS_INCLUDES = $(ADDONS_DIRS) - ADDONS_INCLUDES = $(ADDONS_LIBS_DIRS) - ADDONS_INCLUDES += $(shell find $(ADDONS_DIRS) -type d 2> /dev/null) - ADDONS_INCLUDES += $(shell find $(ADDONS_LIBS_DIRS) -type d 2> /dev/null) - ADDONSCFLAGS = $(addprefix -I,$(ADDONS_INCLUDES)) - - ifeq ($(findstring libsorder.make,$(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null)),libsorder.make) - ADDONS_LIBS_W_ORDER = $(shell cat $(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null)) - EXCLUDE_LIBS_FILTER = $(addprefix %,$(addsuffix .a,$(ADDONS_LIBS_W_ORDER))) - ADDONS_LIBS_STATICS = $(filter-out $(EXCLUDE_LIBS_FILTER), $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.a)) - ADDONS_LIBS_STATICS += $(addprefix -l, $(ADDONS_LIBS_W_ORDER)) - ADDONS_LIBS_STATICS += $(addprefix -L, $(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null | sed s/libsorder.make//g)) - else - ADDONS_LIBS_STATICS = $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.a 2> /dev/null) - endif - - ADDONS_LIBS_SHARED = $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.so 2> /dev/null) - ADDONSLIBS = $(ADDONS_LIBS_STATICS) - ADDONSLIBS += $(ADDONS_LIBS_SHARED) - - - ADDONS_SOURCES = $(shell find $(ADDONS_DIRS) -name "*.cpp" -or -name "*.c" 2> /dev/null) - ADDONS_SOURCES += $(shell find $(ADDONS_LIBS_DIRS) -name "*.cpp" -or -name "*.c" -or -name "*.cc" 2>/dev/null) - ADDONS_OBJFILES = $(subst $(OF_ROOT)/, ,$(patsubst %.cc,%.o,$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(ADDONS_SOURCES))))) - endif -endif - - -ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) - TARGET_CFLAGS = -g - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworksDebug.a - TARGET_NAME = Debug -endif - -ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) - TARGET_CFLAGS = $(COMPILER_OPTIMIZATION) - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworks.a - TARGET_NAME = Release -endif - -ifeq ($(ARCH),android) - ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) - TARGET = libs/armeabi/libOFAndroidApp.so - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworksDebug.a - LDFLAGS += -Wl,--fix-cortex-a8 -shared - USER_LIBS = $(USER_LIBS_ARM) - endif - - ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) - TARGET = libs/armeabi/libOFAndroidApp.so - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks.a - LDFLAGS += -Wl,--fix-cortex-a8 -shared - USER_LIBS = $(USER_LIBS_ARM) - endif - - ifeq ($(findstring Release_arm7,$(MAKECMDGOALS)),Release_arm7) - TARGET_NAME = Release_arm7 - TARGET_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mthumb - TARGET = libs/armeabi-v7a/libOFAndroidApp.so - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks_arm7.a - USER_LIBS = $(USER_LIBS_ARM7) - endif - - ifeq ($(findstring Release_neon,$(MAKECMDGOALS)),Release_neon) - TARGET_NAME = Release_neon - TARGET_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mfpu=neon - TARGET = libs/armeabi-v7a/libOFAndroidApp_neon.so - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks_neon.a - USER_LIBS = $(USER_LIBS_NEON) - endif - - ifeq ($(findstring TestLink,$(MAKECMDGOALS)),TestLink) - TARGET_NAME = Debug - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworksDebug.a - LDFLAGS += -Wl,--entry=main,--fix-cortex-a8 - BIN_NAME = $(APPNAME) - TARGET = obj/$(BIN_NAME) - USER_LIBS = $(USER_LIBS_ARM) - endif -else - ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) - BIN_NAME = $(APPNAME)_debug - TARGET = bin/$(BIN_NAME) - endif - - ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) - BIN_NAME = $(APPNAME) - TARGET = bin/$(BIN_NAME) - endif - - ifeq ($(MAKECMDGOALS),) - TARGET_NAME = Release - BIN_NAME = $(APPNAME) - TARGET = bin/$(BIN_NAME) - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworks.a - endif -endif - -ifeq ($(MAKECMDGOALS),clean) - TARGET = bin/$(APPNAME)_debug bin/$(APPNAME) - TARGET_NAME = Release -endif - -ifeq ($(MAKECMDGOALS),AndroidInstall) - TARGET_NAME = Install -endif - -OBJ_OUTPUT = obj/$(ARCH)$(TARGET_NAME)/ -CLEANTARGET = clean$(TARGET_NAME) - -OBJS = $(addprefix $(OBJ_OUTPUT), $(OBJFILES)) -DEPFILES = $(patsubst %.o,%.d,$(OBJS)) - -USER_OBJS = $(addprefix $(OBJ_OUTPUT), $(USER_OBJFILES)) -DEPFILES += $(patsubst %.o,%.d,$(USER_OBJS)) - -ifeq ($(findstring addons.make,$(wildcard *.make)),addons.make) - ADDONS_OBJS = $(addprefix $(OBJ_OUTPUT), $(ADDONS_OBJFILES)) - DEPFILES += $(patsubst %.o,%.d,$(ADDONS_OBJS)) -endif - -.PHONY: Debug Release all after afterDebugAndroid afterReleaseAndroid - -Release: $(TARGET) after - -Debug: $(TARGET) after - -all: - $(MAKE) Release - -DebugAndroid: $(TARGET) - -ReleaseAndroid: $(TARGET) - -Release_arm7Android: $(TARGET) - -Release_neonAndroid: $(TARGET) afterReleaseAndroid - -TestLinkAndroid: $(TARGET) afterDebugAndroid - -AndroidDebug: - $(MAKE) DebugAndroid - $(MAKE) TestLinkAndroid - -AndroidRelease: - $(MAKE) ReleaseAndroid - $(MAKE) Release_arm7Android - $(MAKE) Release_neonAndroid - - -#This rule does the compilation -#$(OBJS): $(SOURCES) -$(OBJ_OUTPUT)%.o: %.cpp - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CXX) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: %.c - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CC) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: %.cc - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CC) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.cpp - @echo "compiling addon object for" $< - mkdir -p $(@D) - $(CXX) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< - -$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.c - @echo "compiling addon object for" $< - mkdir -p $(@D) - $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< - -$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.cc - @echo "compiling addon object for" $< - mkdir -p $(@D) - $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< - -$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.c - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.cc - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.cpp - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CXX) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(TARGET): $(OBJS) $(ADDONS_OBJS) $(USER_OBJS) $(TARGET_LIBS) $(LIB_STATIC) - @echo 'linking $(TARGET)' - mkdir -p $(@D) - $(CXX) -o $@ $(OBJS) $(ADDONS_OBJS) $(USER_OBJS) $(LDFLAGS) $(USER_LDFLAGS) $(TARGET_LIBS) $(ADDONSLIBS) $(USER_LIBS) $(LIB_STATIC) $(LIB_PATHS_FLAGS) $(LIB_SHARED) $(SYSTEMLIBS) - --include $(DEPFILES) - -.PHONY: clean cleanDebug cleanRelease CleanAndroid -clean: - rm -rf $(OBJ_OUTPUT) - rm -f $(TARGET) - rm -r bin/libs - -$(CLEANTARGET): - rm -rf $(OBJ_OUTPUT) - rm -f $(TARGET) - rm -rf bin/libs - -CleanAndroid: - rm -Rf obj - rm -f libs/armeabi-v7a/libOFAndroidApp.so - rm -f libs/armeabi/libOFAndroidApp.so - rm -f obj/$(APPNAME) - - -afterDebugAndroid:$(TARGET) - @if [ -d libs/armeabi-v7a ]; then rm -r libs/armeabi-v7a; fi - - @cp $(NDK_ROOT)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver libs/armeabi - - #create gdb.setup for armeabi - @echo "set solib-search-path $(PWD)/obj/local/armeabi:$(PWD)/libs/armeabi" > libs/armeabi/gdb.setup - @echo "directory $(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" >> libs/armeabi/gdb.setup - @echo "directory $(PWD)/src" >> libs/armeabi/gdb.setup - @echo "directory $(NDK_ROOT)/sources/cxx-stl/system" >> libs/armeabi/gdb.setup - @echo "directory $(PWD)/libs/armeabi" >> libs/armeabi/gdb.setup - @echo "" >> libs/armeabi/gdb.setup - - @if [ ! -d jni ]; then mkdir jni; fi - @echo "APP_ABI := armeabi" > jni/Application.mk - @echo "#LOCAL_MODULE := OFAndroidApp" > jni/Android.mk - -afterReleaseAndroid:$(TARGET) - @if [ -f obj/$(BIN_NAME) ]; then rm obj/$(BIN_NAME); fi - - @cp $(OF_ROOT)/libs/openFrameworksCompiled/project/android/libneondetection.so libs/armeabi-v7a/ - @cp $(NDK_ROOT)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver libs/armeabi-v7a - - #create gdb.setup for armeabi-v7a - @echo "set solib-search-path $(PWD)/obj/local/armeabi-v7a:$(PWD)/libs/armeabi-v7a" > libs/armeabi-v7a/gdb.setup - @echo "directory $(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" >> libs/armeabi-v7a/gdb.setup - @echo "directory $(PWD)/src" >> libs/armeabi-v7a/gdb.setup - @echo "directory $(NDK_ROOT)/sources/cxx-stl/system" >> libs/armeabi-v7a/gdb.setup - @echo "directory $(PWD)/libs/armeabi-v7a" >> libs/armeabi-v7a/gdb.setup - @echo "" >> libs/armeabi-v7a/gdb.setup - - @if [ ! -d jni ]; then mkdir jni; fi - @echo "APP_ABI := armeabi armeabi-v7a" > jni/Application.mk - @echo "#LOCAL_MODULE := OFAndroidApp" > jni/Android.mk - -RESNAME=$(shell echo $(APPNAME)Resources | tr '[A-Z]' '[a-z]') - -AndroidInstall: - if [ -d "bin/data" ]; then \ - mkdir -p res/raw; \ - rm res/raw/$(RESNAME).zip; \ - cd bin/data; \ - zip -r ../../res/raw/$(RESNAME).zip *; \ - cd ../..; \ - fi - if [ -f obj/$(BIN_NAME) ]; then rm obj/$(BIN_NAME); fi - #touch AndroidManifest.xml - $(SDK_ROOT)/tools/android update project --target $(NDK_PLATFORM) --path $(PROJECT_PATH) - if [ -d bin/classes ]; then rm -r bin/classes; fi - if [ -d bin/classes.dex ]; then rm bin/classes.dex; fi - if [ -d bin/OFActivity.ap_ ]; then rm bin/OFActivity.ap_; fi - if [ -d bin/OFActivity-debug.apk ]; then rm bin/OFActivity-debug.apk; fi - if [ -d bin/OFActivity-debug-unaligned.apk ]; then rm bin/OFActivity-debug-unaligned.apk; fi - if [ -d bin/$(APPNAME).apk ]; then rm bin/$(APPNAME).apk; fi - ant debug - cp bin/OFActivity-debug.apk bin/$(APPNAME).apk - #if [ "$(shell $(SDK_ROOT)/platform-tools/adb get-state)" = "device" ]; then - $(SDK_ROOT)/platform-tools/adb install -r bin/$(APPNAME).apk; - #fi - $(SDK_ROOT)/platform-tools/adb shell am start -a android.intent.action.MAIN -n cc.openframeworks.$(APPNAME)/cc.openframeworks.$(APPNAME).OFActivity - - -after:$(TARGET) - cp -r $(OF_ROOT)/export/$(LIBSPATH)/libs bin/ - @echo - @echo " compiling done" - @echo " to launch the application" - @echo - @echo " cd bin" - @echo " ./$(BIN_NAME)" - @echo - - -.PHONY: help -help: - @echo - @echo openFrameworks universal makefile - @echo - @echo targets: - @echo "make Debug: builds the application with debug symbols" - @echo "make Release: builds the app 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 - @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 diff --git a/examples/android/androidAudioExample/config.make b/examples/android/androidAudioExample/config.make deleted file mode 100644 index 8266e5d914e..00000000000 --- a/examples/android/androidAudioExample/config.make +++ /dev/null @@ -1,32 +0,0 @@ -# add custom variables to this file - -# OF_ROOT allows to move projects outside apps/* just set this variable to the -# absoulte path to the OF root folder - -OF_ROOT = ../../.. - - -# USER_CFLAGS allows to pass custom flags to the compiler -# for example search paths like: -# USER_CFLAGS = -I src/objects - -USER_CFLAGS = - - -# USER_LDFLAGS allows to pass custom flags to the linker -# for example libraries like: -# USER_LD_FLAGS = libs/libawesomelib.a - -USER_LDFLAGS = - -# android specific, in case you want to use different optimizations -USER_LIBS_ARM = -USER_LIBS_ARM7 = -USER_LIBS_NEON = - -# android optimizations - -ANDROID_COMPILER_OPTIMIZATION = -Os - - -EXCLUDE_FROM_SOURCE="bin,.xcodeproj,obj" diff --git a/examples/android/androidCameraExample/Makefile b/examples/android/androidCameraExample/Makefile deleted file mode 100644 index f61fe5d517a..00000000000 --- a/examples/android/androidCameraExample/Makefile +++ /dev/null @@ -1,475 +0,0 @@ -# openFrameworks universal makefile -# -# make help : shows this message -# make Debug: makes the application with debug symbols -# make Release: makes the app with optimizations -# make: the same as make Release -# make CleanDebug: cleans the Debug target -# make CleanRelease: cleans the Release target -# make clean: cleans everything -# -# -# this should work with any OF app, just copy any example -# change the name of the folder and it should compile -# only .cpp support, don't use .c files -# it will look for files in any folder inside the application -# folder except that in the EXCLUDE_FROM_SOURCE variable -# it doesn't autodetect include paths yet -# add the include paths in the USER_CFLAGS variable -# using the gcc syntax: -Ipath -# -# to add addons to your application, edit the addons.make file -# in this directory and add the names of the addons you want to -# include -# -# edit the following vars to customize the makefile - -include config.make - -ifeq ($(findstring Android,$(MAKECMDGOALS)),Android) - include $(OF_ROOT)/libs/openFrameworksCompiled/project/android/paths.make - ARCH = android - ifeq ($(shell uname),Darwin) - HOST_PLATFORM = darwin-x86 - else - HOST_PLATFORM = linux-x86 - endif -endif - -ifeq ($(ARCH),android) - COMPILER_OPTIMIZATION = $(ANDROID_COMPILER_OPTIMIZATION) - NDK_PLATFORM = android-8 -else - COMPILER_OPTIMIZATION = $(USER_COMPILER_OPTIMIZATION) -endif - - - - -# you shouldn't modify anything below this line - - -SHELL = /bin/sh -ifneq ($(ARCH),android) - CXX = g++ - ARCH = $(shell uname -m) - ifeq ($(ARCH),x86_64) - LIBSPATH=linux64 - else - LIBSPATH=linux - endif -else - ifeq ($(findstring Release_arm7,$(MAKECMDGOALS)),Release_arm7) - LIBSPATH =android/armeabi-v7a - else - LIBSPATH =android/armeabi - endif - #NDK_ROOT = $(shell cat $(OF_ROOT)/libs/openFrameworksCompiled/project/android/ndk_path.make) - #SDK_ROOT = $(shell cat $(OF_ROOT)/libs/openFrameworksCompiled/project/android/sdk_path.make) - TOOLCHAIN=arm-linux-androideabi-4.4.3 - TOOLCHAIN_PATH=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/ - ANDROID_PREFIX=arm-linux-androideabi- - CC=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)gcc - CXX=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)g++ - AR=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)ar - SYSROOT=$(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/ - CFLAGS += -nostdlib --sysroot=$(SYSROOT) -fno-short-enums - CFLAGS += -I"$(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" -I"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/include/" -I"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include" - CFLAGS += -DANDROID -endif - -NODEPS = clean -SED_EXCLUDE_FROM_SRC = $(shell echo $(EXCLUDE_FROM_SOURCE) | sed s/\,/\\\\\|/g) -SOURCE_DIRS = $(shell find . -maxdepth 1 -mindepth 1 -type d | grep -v $(SED_EXCLUDE_FROM_SRC) | sed s/.\\///) -SOURCES = $(shell find $(SOURCE_DIRS) -name "*.cpp" -or -name "*.c" -or -name "*.cc") -OBJFILES = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(patsubst %.cc,%.o,$(SOURCES)))) - -ifneq (,$(USER_SOURCE_DIR)) - USER_SOURCES = $(shell find $(USER_SOURCE_DIR) -name "*.cpp" -or -name "*.c" -or -name "*.cc") - USER_OBJFILES = $(subst $(USER_SOURCE_DIR)/, ,$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(patsubst %.cc,%.o,$(USER_SOURCES))))) -endif - -APPNAME = $(shell basename `pwd`) -CORE_INCLUDES = $(shell find $(OF_ROOT)/libs/openFrameworks/ -type d) -CORE_INCLUDE_FLAGS = $(addprefix -I,$(CORE_INCLUDES)) -INCLUDES = $(shell find $(OF_ROOT)/libs/*/include -type d | grep -v glu | grep -v quicktime | grep -v poco) -INCLUDES_FLAGS = $(addprefix -I,$(INCLUDES)) -INCLUDES_FLAGS += -I$(OF_ROOT)/libs/poco/include -ifeq ($(ARCH),android) - INCLUDES_FLAGS += -I$(OF_ROOT)/libs/glu/include_android -else - INCLUDES_FLAGS += -I$(OF_ROOT)/libs/glu/include - INCLUDES_FLAGS += $(shell pkg-config glew gstreamer-0.10 gstreamer-video-0.10 gstreamer-base-0.10 libudev --cflags) - #check if gtk exists and add it - GTK = $(shell pkg-config gtk+-2.0 --exists; echo $$?) - ifeq ($(GTK),0) - CFLAGS += $(shell pkg-config gtk+-2.0 --cflags) -DOF_USING_GTK - SYSTEMLIBS += $(shell pkg-config gtk+-2.0 --libs) - endif - - #check if mpg123 exists and add it - MPG123 = $(shell pkg-config libmpg123 --exists; echo $$?) - ifeq ($(MPG123),0) - CFLAGS += -DOF_USING_MPG123 - SYSTEMLIBS += -lmpg123 - endif -endif -LIB_STATIC = $(shell ls $(OF_ROOT)/libs/*/lib/$(LIBSPATH)/*.a 2> /dev/null | grep -v openFrameworksCompiled | grep -v Poco) -LIB_SHARED = $(shell ls $(OF_ROOT)/libs/*/lib/$(LIBSPATH)/*.so 2> /dev/null | grep -v openFrameworksCompiled | sed "s/.*\\/lib\([^/]*\)\.so/-l\1/") -LIB_STATIC += $(OF_ROOT)/libs/poco/lib/$(LIBSPATH)/libPocoNet.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoXML.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoUtil.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoFoundation.a -LIB_PATHS_FLAGS = $(shell ls -d $(OF_ROOT)/libs/*/lib/$(LIBSPATH) | sed "s/\(\.*\)/-L\1/") - -CFLAGS += -Wall -fexceptions -CFLAGS += -I. -CFLAGS += $(INCLUDES_FLAGS) -CFLAGS += $(CORE_INCLUDE_FLAGS) - - - -ifeq ($(ARCH),android) - LDFLAGS = --sysroot=$(SYSROOT) -nostdlib -L"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi" - SYSTEMLIBS += -lstdc++ -lsupc++ -lgcc -lz -lGLESv1_CM -llog -ldl -lm -lc -else - LDFLAGS = -Wl,-rpath=./libs - SYSTEMLIBS += $(shell pkg-config jack glew gstreamer-0.10 gstreamer-video-0.10 gstreamer-base-0.10 gstreamer-app-0.10 libudev --libs) - SYSTEMLIBS += -lglut -lGL -lasound -lopenal -lsndfile -lvorbis -lFLAC -logg -lfreeimage -endif - - -ifeq ($(findstring addons.make,$(wildcard *.make)),addons.make) - ifneq ($(ARCH),android) - ADDONS = $(shell cat addons.make | grep -v ofxAndroid) - else - ADDONS = $(shell cat addons.make) - endif - - ifneq ($(strip $(ADDONS)),) - ADDONS_REL_DIRS = $(addsuffix /src, $(ADDONS)) - ADDONS_LIBS_REL_DIRS = $(addsuffix /libs, $(ADDONS)) - ADDONS_DIRS = $(addprefix $(OF_ROOT)/addons/, $(ADDONS_REL_DIRS) ) - ADDONS_LIBS_DIRS = $(addprefix $(OF_ROOT)/addons/, $(ADDONS_LIBS_REL_DIRS) ) - ADDONS_BIN_LIBS_DIRS = $(addsuffix /*/lib/$(LIBSPATH), $(ADDONS_LIBS_DIRS) ) - - ADDONS_INCLUDES = $(ADDONS_DIRS) - ADDONS_INCLUDES = $(ADDONS_LIBS_DIRS) - ADDONS_INCLUDES += $(shell find $(ADDONS_DIRS) -type d 2> /dev/null) - ADDONS_INCLUDES += $(shell find $(ADDONS_LIBS_DIRS) -type d 2> /dev/null) - ADDONSCFLAGS = $(addprefix -I,$(ADDONS_INCLUDES)) - - ifeq ($(findstring libsorder.make,$(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null)),libsorder.make) - ADDONS_LIBS_W_ORDER = $(shell cat $(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null)) - EXCLUDE_LIBS_FILTER = $(addprefix %,$(addsuffix .a,$(ADDONS_LIBS_W_ORDER))) - ADDONS_LIBS_STATICS = $(filter-out $(EXCLUDE_LIBS_FILTER), $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.a)) - ADDONS_LIBS_STATICS += $(addprefix -l, $(ADDONS_LIBS_W_ORDER)) - ADDONS_LIBS_STATICS += $(addprefix -L, $(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null | sed s/libsorder.make//g)) - else - ADDONS_LIBS_STATICS = $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.a 2> /dev/null) - endif - - ADDONS_LIBS_SHARED = $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.so 2> /dev/null) - ADDONSLIBS = $(ADDONS_LIBS_STATICS) - ADDONSLIBS += $(ADDONS_LIBS_SHARED) - - - ADDONS_SOURCES = $(shell find $(ADDONS_DIRS) -name "*.cpp" -or -name "*.c" 2> /dev/null) - ADDONS_SOURCES += $(shell find $(ADDONS_LIBS_DIRS) -name "*.cpp" -or -name "*.c" -or -name "*.cc" 2>/dev/null) - ADDONS_OBJFILES = $(subst $(OF_ROOT)/, ,$(patsubst %.cc,%.o,$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(ADDONS_SOURCES))))) - endif -endif - - -ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) - TARGET_CFLAGS = -g - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworksDebug.a - TARGET_NAME = Debug -endif - -ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) - TARGET_CFLAGS = $(COMPILER_OPTIMIZATION) - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworks.a - TARGET_NAME = Release -endif - -ifeq ($(ARCH),android) - ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) - TARGET = libs/armeabi/libOFAndroidApp.so - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworksDebug.a - LDFLAGS += -Wl,--fix-cortex-a8 -shared - USER_LIBS = $(USER_LIBS_ARM) - endif - - ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) - TARGET = libs/armeabi/libOFAndroidApp.so - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks.a - LDFLAGS += -Wl,--fix-cortex-a8 -shared - USER_LIBS = $(USER_LIBS_ARM) - endif - - ifeq ($(findstring Release_arm7,$(MAKECMDGOALS)),Release_arm7) - TARGET_NAME = Release_arm7 - TARGET_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mthumb - TARGET = libs/armeabi-v7a/libOFAndroidApp.so - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks_arm7.a - USER_LIBS = $(USER_LIBS_ARM7) - endif - - ifeq ($(findstring Release_neon,$(MAKECMDGOALS)),Release_neon) - TARGET_NAME = Release_neon - TARGET_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mfpu=neon - TARGET = libs/armeabi-v7a/libOFAndroidApp_neon.so - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks_neon.a - USER_LIBS = $(USER_LIBS_NEON) - endif - - ifeq ($(findstring TestLink,$(MAKECMDGOALS)),TestLink) - TARGET_NAME = Debug - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworksDebug.a - LDFLAGS += -Wl,--entry=main,--fix-cortex-a8 - BIN_NAME = $(APPNAME) - TARGET = obj/$(BIN_NAME) - USER_LIBS = $(USER_LIBS_ARM) - endif -else - ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) - BIN_NAME = $(APPNAME)_debug - TARGET = bin/$(BIN_NAME) - endif - - ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) - BIN_NAME = $(APPNAME) - TARGET = bin/$(BIN_NAME) - endif - - ifeq ($(MAKECMDGOALS),) - TARGET_NAME = Release - BIN_NAME = $(APPNAME) - TARGET = bin/$(BIN_NAME) - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworks.a - endif -endif - -ifeq ($(MAKECMDGOALS),clean) - TARGET = bin/$(APPNAME)_debug bin/$(APPNAME) - TARGET_NAME = Release -endif - -ifeq ($(MAKECMDGOALS),AndroidInstall) - TARGET_NAME = Install -endif - -OBJ_OUTPUT = obj/$(ARCH)$(TARGET_NAME)/ -CLEANTARGET = clean$(TARGET_NAME) - -OBJS = $(addprefix $(OBJ_OUTPUT), $(OBJFILES)) -DEPFILES = $(patsubst %.o,%.d,$(OBJS)) - -USER_OBJS = $(addprefix $(OBJ_OUTPUT), $(USER_OBJFILES)) -DEPFILES += $(patsubst %.o,%.d,$(USER_OBJS)) - -ifeq ($(findstring addons.make,$(wildcard *.make)),addons.make) - ADDONS_OBJS = $(addprefix $(OBJ_OUTPUT), $(ADDONS_OBJFILES)) - DEPFILES += $(patsubst %.o,%.d,$(ADDONS_OBJS)) -endif - -.PHONY: Debug Release all after afterDebugAndroid afterReleaseAndroid - -Release: $(TARGET) after - -Debug: $(TARGET) after - -all: - $(MAKE) Release - -DebugAndroid: $(TARGET) - -ReleaseAndroid: $(TARGET) - -Release_arm7Android: $(TARGET) - -Release_neonAndroid: $(TARGET) afterReleaseAndroid - -TestLinkAndroid: $(TARGET) afterDebugAndroid - -AndroidDebug: - $(MAKE) DebugAndroid - $(MAKE) TestLinkAndroid - -AndroidRelease: - $(MAKE) ReleaseAndroid - $(MAKE) Release_arm7Android - $(MAKE) Release_neonAndroid - - -#This rule does the compilation -#$(OBJS): $(SOURCES) -$(OBJ_OUTPUT)%.o: %.cpp - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CXX) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: %.c - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CC) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: %.cc - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CC) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.cpp - @echo "compiling addon object for" $< - mkdir -p $(@D) - $(CXX) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< - -$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.c - @echo "compiling addon object for" $< - mkdir -p $(@D) - $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< - -$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.cc - @echo "compiling addon object for" $< - mkdir -p $(@D) - $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< - -$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.c - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.cc - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.cpp - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CXX) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(TARGET): $(OBJS) $(ADDONS_OBJS) $(USER_OBJS) $(TARGET_LIBS) $(LIB_STATIC) - @echo 'linking $(TARGET)' - mkdir -p $(@D) - $(CXX) -o $@ $(OBJS) $(ADDONS_OBJS) $(USER_OBJS) $(LDFLAGS) $(USER_LDFLAGS) $(TARGET_LIBS) $(ADDONSLIBS) $(USER_LIBS) $(LIB_STATIC) $(LIB_PATHS_FLAGS) $(LIB_SHARED) $(SYSTEMLIBS) - --include $(DEPFILES) - -.PHONY: clean cleanDebug cleanRelease CleanAndroid -clean: - rm -rf $(OBJ_OUTPUT) - rm -f $(TARGET) - rm -r bin/libs - -$(CLEANTARGET): - rm -rf $(OBJ_OUTPUT) - rm -f $(TARGET) - rm -rf bin/libs - -CleanAndroid: - rm -Rf obj - rm -f libs/armeabi-v7a/libOFAndroidApp.so - rm -f libs/armeabi/libOFAndroidApp.so - rm -f obj/$(APPNAME) - - -afterDebugAndroid:$(TARGET) - @if [ -d libs/armeabi-v7a ]; then rm -r libs/armeabi-v7a; fi - - @cp $(NDK_ROOT)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver libs/armeabi - - #create gdb.setup for armeabi - @echo "set solib-search-path $(PWD)/obj/local/armeabi:$(PWD)/libs/armeabi" > libs/armeabi/gdb.setup - @echo "directory $(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" >> libs/armeabi/gdb.setup - @echo "directory $(PWD)/src" >> libs/armeabi/gdb.setup - @echo "directory $(NDK_ROOT)/sources/cxx-stl/system" >> libs/armeabi/gdb.setup - @echo "directory $(PWD)/libs/armeabi" >> libs/armeabi/gdb.setup - @echo "" >> libs/armeabi/gdb.setup - - @if [ ! -d jni ]; then mkdir jni; fi - @echo "APP_ABI := armeabi" > jni/Application.mk - @echo "#LOCAL_MODULE := OFAndroidApp" > jni/Android.mk - -afterReleaseAndroid:$(TARGET) - @if [ -f obj/$(BIN_NAME) ]; then rm obj/$(BIN_NAME); fi - - @cp $(OF_ROOT)/libs/openFrameworksCompiled/project/android/libneondetection.so libs/armeabi-v7a/ - @cp $(NDK_ROOT)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver libs/armeabi-v7a - - #create gdb.setup for armeabi-v7a - @echo "set solib-search-path $(PWD)/obj/local/armeabi-v7a:$(PWD)/libs/armeabi-v7a" > libs/armeabi-v7a/gdb.setup - @echo "directory $(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" >> libs/armeabi-v7a/gdb.setup - @echo "directory $(PWD)/src" >> libs/armeabi-v7a/gdb.setup - @echo "directory $(NDK_ROOT)/sources/cxx-stl/system" >> libs/armeabi-v7a/gdb.setup - @echo "directory $(PWD)/libs/armeabi-v7a" >> libs/armeabi-v7a/gdb.setup - @echo "" >> libs/armeabi-v7a/gdb.setup - - @if [ ! -d jni ]; then mkdir jni; fi - @echo "APP_ABI := armeabi armeabi-v7a" > jni/Application.mk - @echo "#LOCAL_MODULE := OFAndroidApp" > jni/Android.mk - -RESNAME=$(shell echo $(APPNAME)Resources | tr '[A-Z]' '[a-z]') - -AndroidInstall: - if [ -d "bin/data" ]; then \ - mkdir -p res/raw; \ - rm res/raw/$(RESNAME).zip; \ - cd bin/data; \ - zip -r ../../res/raw/$(RESNAME).zip *; \ - cd ../..; \ - fi - if [ -f obj/$(BIN_NAME) ]; then rm obj/$(BIN_NAME); fi - #touch AndroidManifest.xml - $(SDK_ROOT)/tools/android update project --target $(NDK_PLATFORM) --path $(PROJECT_PATH) - if [ -d bin/classes ]; then rm -r bin/classes; fi - if [ -d bin/classes.dex ]; then rm bin/classes.dex; fi - if [ -d bin/OFActivity.ap_ ]; then rm bin/OFActivity.ap_; fi - if [ -d bin/OFActivity-debug.apk ]; then rm bin/OFActivity-debug.apk; fi - if [ -d bin/OFActivity-debug-unaligned.apk ]; then rm bin/OFActivity-debug-unaligned.apk; fi - if [ -d bin/$(APPNAME).apk ]; then rm bin/$(APPNAME).apk; fi - ant debug - cp bin/OFActivity-debug.apk bin/$(APPNAME).apk - #if [ "$(shell $(SDK_ROOT)/platform-tools/adb get-state)" = "device" ]; then - $(SDK_ROOT)/platform-tools/adb install -r bin/$(APPNAME).apk; - #fi - $(SDK_ROOT)/platform-tools/adb shell am start -a android.intent.action.MAIN -n cc.openframeworks.$(APPNAME)/cc.openframeworks.$(APPNAME).OFActivity - - -after:$(TARGET) - cp -r $(OF_ROOT)/export/$(LIBSPATH)/libs bin/ - @echo - @echo " compiling done" - @echo " to launch the application" - @echo - @echo " cd bin" - @echo " ./$(BIN_NAME)" - @echo - - -.PHONY: help -help: - @echo - @echo openFrameworks universal makefile - @echo - @echo targets: - @echo "make Debug: builds the application with debug symbols" - @echo "make Release: builds the app 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 - @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 diff --git a/examples/android/androidCameraExample/config.make b/examples/android/androidCameraExample/config.make deleted file mode 100644 index 8266e5d914e..00000000000 --- a/examples/android/androidCameraExample/config.make +++ /dev/null @@ -1,32 +0,0 @@ -# add custom variables to this file - -# OF_ROOT allows to move projects outside apps/* just set this variable to the -# absoulte path to the OF root folder - -OF_ROOT = ../../.. - - -# USER_CFLAGS allows to pass custom flags to the compiler -# for example search paths like: -# USER_CFLAGS = -I src/objects - -USER_CFLAGS = - - -# USER_LDFLAGS allows to pass custom flags to the linker -# for example libraries like: -# USER_LD_FLAGS = libs/libawesomelib.a - -USER_LDFLAGS = - -# android specific, in case you want to use different optimizations -USER_LIBS_ARM = -USER_LIBS_ARM7 = -USER_LIBS_NEON = - -# android optimizations - -ANDROID_COMPILER_OPTIMIZATION = -Os - - -EXCLUDE_FROM_SOURCE="bin,.xcodeproj,obj" diff --git a/examples/android/androidEmptyExample/Makefile b/examples/android/androidEmptyExample/Makefile deleted file mode 100644 index f61fe5d517a..00000000000 --- a/examples/android/androidEmptyExample/Makefile +++ /dev/null @@ -1,475 +0,0 @@ -# openFrameworks universal makefile -# -# make help : shows this message -# make Debug: makes the application with debug symbols -# make Release: makes the app with optimizations -# make: the same as make Release -# make CleanDebug: cleans the Debug target -# make CleanRelease: cleans the Release target -# make clean: cleans everything -# -# -# this should work with any OF app, just copy any example -# change the name of the folder and it should compile -# only .cpp support, don't use .c files -# it will look for files in any folder inside the application -# folder except that in the EXCLUDE_FROM_SOURCE variable -# it doesn't autodetect include paths yet -# add the include paths in the USER_CFLAGS variable -# using the gcc syntax: -Ipath -# -# to add addons to your application, edit the addons.make file -# in this directory and add the names of the addons you want to -# include -# -# edit the following vars to customize the makefile - -include config.make - -ifeq ($(findstring Android,$(MAKECMDGOALS)),Android) - include $(OF_ROOT)/libs/openFrameworksCompiled/project/android/paths.make - ARCH = android - ifeq ($(shell uname),Darwin) - HOST_PLATFORM = darwin-x86 - else - HOST_PLATFORM = linux-x86 - endif -endif - -ifeq ($(ARCH),android) - COMPILER_OPTIMIZATION = $(ANDROID_COMPILER_OPTIMIZATION) - NDK_PLATFORM = android-8 -else - COMPILER_OPTIMIZATION = $(USER_COMPILER_OPTIMIZATION) -endif - - - - -# you shouldn't modify anything below this line - - -SHELL = /bin/sh -ifneq ($(ARCH),android) - CXX = g++ - ARCH = $(shell uname -m) - ifeq ($(ARCH),x86_64) - LIBSPATH=linux64 - else - LIBSPATH=linux - endif -else - ifeq ($(findstring Release_arm7,$(MAKECMDGOALS)),Release_arm7) - LIBSPATH =android/armeabi-v7a - else - LIBSPATH =android/armeabi - endif - #NDK_ROOT = $(shell cat $(OF_ROOT)/libs/openFrameworksCompiled/project/android/ndk_path.make) - #SDK_ROOT = $(shell cat $(OF_ROOT)/libs/openFrameworksCompiled/project/android/sdk_path.make) - TOOLCHAIN=arm-linux-androideabi-4.4.3 - TOOLCHAIN_PATH=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/ - ANDROID_PREFIX=arm-linux-androideabi- - CC=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)gcc - CXX=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)g++ - AR=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)ar - SYSROOT=$(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/ - CFLAGS += -nostdlib --sysroot=$(SYSROOT) -fno-short-enums - CFLAGS += -I"$(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" -I"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/include/" -I"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include" - CFLAGS += -DANDROID -endif - -NODEPS = clean -SED_EXCLUDE_FROM_SRC = $(shell echo $(EXCLUDE_FROM_SOURCE) | sed s/\,/\\\\\|/g) -SOURCE_DIRS = $(shell find . -maxdepth 1 -mindepth 1 -type d | grep -v $(SED_EXCLUDE_FROM_SRC) | sed s/.\\///) -SOURCES = $(shell find $(SOURCE_DIRS) -name "*.cpp" -or -name "*.c" -or -name "*.cc") -OBJFILES = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(patsubst %.cc,%.o,$(SOURCES)))) - -ifneq (,$(USER_SOURCE_DIR)) - USER_SOURCES = $(shell find $(USER_SOURCE_DIR) -name "*.cpp" -or -name "*.c" -or -name "*.cc") - USER_OBJFILES = $(subst $(USER_SOURCE_DIR)/, ,$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(patsubst %.cc,%.o,$(USER_SOURCES))))) -endif - -APPNAME = $(shell basename `pwd`) -CORE_INCLUDES = $(shell find $(OF_ROOT)/libs/openFrameworks/ -type d) -CORE_INCLUDE_FLAGS = $(addprefix -I,$(CORE_INCLUDES)) -INCLUDES = $(shell find $(OF_ROOT)/libs/*/include -type d | grep -v glu | grep -v quicktime | grep -v poco) -INCLUDES_FLAGS = $(addprefix -I,$(INCLUDES)) -INCLUDES_FLAGS += -I$(OF_ROOT)/libs/poco/include -ifeq ($(ARCH),android) - INCLUDES_FLAGS += -I$(OF_ROOT)/libs/glu/include_android -else - INCLUDES_FLAGS += -I$(OF_ROOT)/libs/glu/include - INCLUDES_FLAGS += $(shell pkg-config glew gstreamer-0.10 gstreamer-video-0.10 gstreamer-base-0.10 libudev --cflags) - #check if gtk exists and add it - GTK = $(shell pkg-config gtk+-2.0 --exists; echo $$?) - ifeq ($(GTK),0) - CFLAGS += $(shell pkg-config gtk+-2.0 --cflags) -DOF_USING_GTK - SYSTEMLIBS += $(shell pkg-config gtk+-2.0 --libs) - endif - - #check if mpg123 exists and add it - MPG123 = $(shell pkg-config libmpg123 --exists; echo $$?) - ifeq ($(MPG123),0) - CFLAGS += -DOF_USING_MPG123 - SYSTEMLIBS += -lmpg123 - endif -endif -LIB_STATIC = $(shell ls $(OF_ROOT)/libs/*/lib/$(LIBSPATH)/*.a 2> /dev/null | grep -v openFrameworksCompiled | grep -v Poco) -LIB_SHARED = $(shell ls $(OF_ROOT)/libs/*/lib/$(LIBSPATH)/*.so 2> /dev/null | grep -v openFrameworksCompiled | sed "s/.*\\/lib\([^/]*\)\.so/-l\1/") -LIB_STATIC += $(OF_ROOT)/libs/poco/lib/$(LIBSPATH)/libPocoNet.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoXML.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoUtil.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoFoundation.a -LIB_PATHS_FLAGS = $(shell ls -d $(OF_ROOT)/libs/*/lib/$(LIBSPATH) | sed "s/\(\.*\)/-L\1/") - -CFLAGS += -Wall -fexceptions -CFLAGS += -I. -CFLAGS += $(INCLUDES_FLAGS) -CFLAGS += $(CORE_INCLUDE_FLAGS) - - - -ifeq ($(ARCH),android) - LDFLAGS = --sysroot=$(SYSROOT) -nostdlib -L"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi" - SYSTEMLIBS += -lstdc++ -lsupc++ -lgcc -lz -lGLESv1_CM -llog -ldl -lm -lc -else - LDFLAGS = -Wl,-rpath=./libs - SYSTEMLIBS += $(shell pkg-config jack glew gstreamer-0.10 gstreamer-video-0.10 gstreamer-base-0.10 gstreamer-app-0.10 libudev --libs) - SYSTEMLIBS += -lglut -lGL -lasound -lopenal -lsndfile -lvorbis -lFLAC -logg -lfreeimage -endif - - -ifeq ($(findstring addons.make,$(wildcard *.make)),addons.make) - ifneq ($(ARCH),android) - ADDONS = $(shell cat addons.make | grep -v ofxAndroid) - else - ADDONS = $(shell cat addons.make) - endif - - ifneq ($(strip $(ADDONS)),) - ADDONS_REL_DIRS = $(addsuffix /src, $(ADDONS)) - ADDONS_LIBS_REL_DIRS = $(addsuffix /libs, $(ADDONS)) - ADDONS_DIRS = $(addprefix $(OF_ROOT)/addons/, $(ADDONS_REL_DIRS) ) - ADDONS_LIBS_DIRS = $(addprefix $(OF_ROOT)/addons/, $(ADDONS_LIBS_REL_DIRS) ) - ADDONS_BIN_LIBS_DIRS = $(addsuffix /*/lib/$(LIBSPATH), $(ADDONS_LIBS_DIRS) ) - - ADDONS_INCLUDES = $(ADDONS_DIRS) - ADDONS_INCLUDES = $(ADDONS_LIBS_DIRS) - ADDONS_INCLUDES += $(shell find $(ADDONS_DIRS) -type d 2> /dev/null) - ADDONS_INCLUDES += $(shell find $(ADDONS_LIBS_DIRS) -type d 2> /dev/null) - ADDONSCFLAGS = $(addprefix -I,$(ADDONS_INCLUDES)) - - ifeq ($(findstring libsorder.make,$(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null)),libsorder.make) - ADDONS_LIBS_W_ORDER = $(shell cat $(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null)) - EXCLUDE_LIBS_FILTER = $(addprefix %,$(addsuffix .a,$(ADDONS_LIBS_W_ORDER))) - ADDONS_LIBS_STATICS = $(filter-out $(EXCLUDE_LIBS_FILTER), $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.a)) - ADDONS_LIBS_STATICS += $(addprefix -l, $(ADDONS_LIBS_W_ORDER)) - ADDONS_LIBS_STATICS += $(addprefix -L, $(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null | sed s/libsorder.make//g)) - else - ADDONS_LIBS_STATICS = $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.a 2> /dev/null) - endif - - ADDONS_LIBS_SHARED = $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.so 2> /dev/null) - ADDONSLIBS = $(ADDONS_LIBS_STATICS) - ADDONSLIBS += $(ADDONS_LIBS_SHARED) - - - ADDONS_SOURCES = $(shell find $(ADDONS_DIRS) -name "*.cpp" -or -name "*.c" 2> /dev/null) - ADDONS_SOURCES += $(shell find $(ADDONS_LIBS_DIRS) -name "*.cpp" -or -name "*.c" -or -name "*.cc" 2>/dev/null) - ADDONS_OBJFILES = $(subst $(OF_ROOT)/, ,$(patsubst %.cc,%.o,$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(ADDONS_SOURCES))))) - endif -endif - - -ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) - TARGET_CFLAGS = -g - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworksDebug.a - TARGET_NAME = Debug -endif - -ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) - TARGET_CFLAGS = $(COMPILER_OPTIMIZATION) - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworks.a - TARGET_NAME = Release -endif - -ifeq ($(ARCH),android) - ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) - TARGET = libs/armeabi/libOFAndroidApp.so - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworksDebug.a - LDFLAGS += -Wl,--fix-cortex-a8 -shared - USER_LIBS = $(USER_LIBS_ARM) - endif - - ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) - TARGET = libs/armeabi/libOFAndroidApp.so - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks.a - LDFLAGS += -Wl,--fix-cortex-a8 -shared - USER_LIBS = $(USER_LIBS_ARM) - endif - - ifeq ($(findstring Release_arm7,$(MAKECMDGOALS)),Release_arm7) - TARGET_NAME = Release_arm7 - TARGET_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mthumb - TARGET = libs/armeabi-v7a/libOFAndroidApp.so - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks_arm7.a - USER_LIBS = $(USER_LIBS_ARM7) - endif - - ifeq ($(findstring Release_neon,$(MAKECMDGOALS)),Release_neon) - TARGET_NAME = Release_neon - TARGET_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mfpu=neon - TARGET = libs/armeabi-v7a/libOFAndroidApp_neon.so - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks_neon.a - USER_LIBS = $(USER_LIBS_NEON) - endif - - ifeq ($(findstring TestLink,$(MAKECMDGOALS)),TestLink) - TARGET_NAME = Debug - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworksDebug.a - LDFLAGS += -Wl,--entry=main,--fix-cortex-a8 - BIN_NAME = $(APPNAME) - TARGET = obj/$(BIN_NAME) - USER_LIBS = $(USER_LIBS_ARM) - endif -else - ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) - BIN_NAME = $(APPNAME)_debug - TARGET = bin/$(BIN_NAME) - endif - - ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) - BIN_NAME = $(APPNAME) - TARGET = bin/$(BIN_NAME) - endif - - ifeq ($(MAKECMDGOALS),) - TARGET_NAME = Release - BIN_NAME = $(APPNAME) - TARGET = bin/$(BIN_NAME) - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworks.a - endif -endif - -ifeq ($(MAKECMDGOALS),clean) - TARGET = bin/$(APPNAME)_debug bin/$(APPNAME) - TARGET_NAME = Release -endif - -ifeq ($(MAKECMDGOALS),AndroidInstall) - TARGET_NAME = Install -endif - -OBJ_OUTPUT = obj/$(ARCH)$(TARGET_NAME)/ -CLEANTARGET = clean$(TARGET_NAME) - -OBJS = $(addprefix $(OBJ_OUTPUT), $(OBJFILES)) -DEPFILES = $(patsubst %.o,%.d,$(OBJS)) - -USER_OBJS = $(addprefix $(OBJ_OUTPUT), $(USER_OBJFILES)) -DEPFILES += $(patsubst %.o,%.d,$(USER_OBJS)) - -ifeq ($(findstring addons.make,$(wildcard *.make)),addons.make) - ADDONS_OBJS = $(addprefix $(OBJ_OUTPUT), $(ADDONS_OBJFILES)) - DEPFILES += $(patsubst %.o,%.d,$(ADDONS_OBJS)) -endif - -.PHONY: Debug Release all after afterDebugAndroid afterReleaseAndroid - -Release: $(TARGET) after - -Debug: $(TARGET) after - -all: - $(MAKE) Release - -DebugAndroid: $(TARGET) - -ReleaseAndroid: $(TARGET) - -Release_arm7Android: $(TARGET) - -Release_neonAndroid: $(TARGET) afterReleaseAndroid - -TestLinkAndroid: $(TARGET) afterDebugAndroid - -AndroidDebug: - $(MAKE) DebugAndroid - $(MAKE) TestLinkAndroid - -AndroidRelease: - $(MAKE) ReleaseAndroid - $(MAKE) Release_arm7Android - $(MAKE) Release_neonAndroid - - -#This rule does the compilation -#$(OBJS): $(SOURCES) -$(OBJ_OUTPUT)%.o: %.cpp - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CXX) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: %.c - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CC) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: %.cc - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CC) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.cpp - @echo "compiling addon object for" $< - mkdir -p $(@D) - $(CXX) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< - -$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.c - @echo "compiling addon object for" $< - mkdir -p $(@D) - $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< - -$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.cc - @echo "compiling addon object for" $< - mkdir -p $(@D) - $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< - -$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.c - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.cc - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.cpp - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CXX) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(TARGET): $(OBJS) $(ADDONS_OBJS) $(USER_OBJS) $(TARGET_LIBS) $(LIB_STATIC) - @echo 'linking $(TARGET)' - mkdir -p $(@D) - $(CXX) -o $@ $(OBJS) $(ADDONS_OBJS) $(USER_OBJS) $(LDFLAGS) $(USER_LDFLAGS) $(TARGET_LIBS) $(ADDONSLIBS) $(USER_LIBS) $(LIB_STATIC) $(LIB_PATHS_FLAGS) $(LIB_SHARED) $(SYSTEMLIBS) - --include $(DEPFILES) - -.PHONY: clean cleanDebug cleanRelease CleanAndroid -clean: - rm -rf $(OBJ_OUTPUT) - rm -f $(TARGET) - rm -r bin/libs - -$(CLEANTARGET): - rm -rf $(OBJ_OUTPUT) - rm -f $(TARGET) - rm -rf bin/libs - -CleanAndroid: - rm -Rf obj - rm -f libs/armeabi-v7a/libOFAndroidApp.so - rm -f libs/armeabi/libOFAndroidApp.so - rm -f obj/$(APPNAME) - - -afterDebugAndroid:$(TARGET) - @if [ -d libs/armeabi-v7a ]; then rm -r libs/armeabi-v7a; fi - - @cp $(NDK_ROOT)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver libs/armeabi - - #create gdb.setup for armeabi - @echo "set solib-search-path $(PWD)/obj/local/armeabi:$(PWD)/libs/armeabi" > libs/armeabi/gdb.setup - @echo "directory $(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" >> libs/armeabi/gdb.setup - @echo "directory $(PWD)/src" >> libs/armeabi/gdb.setup - @echo "directory $(NDK_ROOT)/sources/cxx-stl/system" >> libs/armeabi/gdb.setup - @echo "directory $(PWD)/libs/armeabi" >> libs/armeabi/gdb.setup - @echo "" >> libs/armeabi/gdb.setup - - @if [ ! -d jni ]; then mkdir jni; fi - @echo "APP_ABI := armeabi" > jni/Application.mk - @echo "#LOCAL_MODULE := OFAndroidApp" > jni/Android.mk - -afterReleaseAndroid:$(TARGET) - @if [ -f obj/$(BIN_NAME) ]; then rm obj/$(BIN_NAME); fi - - @cp $(OF_ROOT)/libs/openFrameworksCompiled/project/android/libneondetection.so libs/armeabi-v7a/ - @cp $(NDK_ROOT)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver libs/armeabi-v7a - - #create gdb.setup for armeabi-v7a - @echo "set solib-search-path $(PWD)/obj/local/armeabi-v7a:$(PWD)/libs/armeabi-v7a" > libs/armeabi-v7a/gdb.setup - @echo "directory $(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" >> libs/armeabi-v7a/gdb.setup - @echo "directory $(PWD)/src" >> libs/armeabi-v7a/gdb.setup - @echo "directory $(NDK_ROOT)/sources/cxx-stl/system" >> libs/armeabi-v7a/gdb.setup - @echo "directory $(PWD)/libs/armeabi-v7a" >> libs/armeabi-v7a/gdb.setup - @echo "" >> libs/armeabi-v7a/gdb.setup - - @if [ ! -d jni ]; then mkdir jni; fi - @echo "APP_ABI := armeabi armeabi-v7a" > jni/Application.mk - @echo "#LOCAL_MODULE := OFAndroidApp" > jni/Android.mk - -RESNAME=$(shell echo $(APPNAME)Resources | tr '[A-Z]' '[a-z]') - -AndroidInstall: - if [ -d "bin/data" ]; then \ - mkdir -p res/raw; \ - rm res/raw/$(RESNAME).zip; \ - cd bin/data; \ - zip -r ../../res/raw/$(RESNAME).zip *; \ - cd ../..; \ - fi - if [ -f obj/$(BIN_NAME) ]; then rm obj/$(BIN_NAME); fi - #touch AndroidManifest.xml - $(SDK_ROOT)/tools/android update project --target $(NDK_PLATFORM) --path $(PROJECT_PATH) - if [ -d bin/classes ]; then rm -r bin/classes; fi - if [ -d bin/classes.dex ]; then rm bin/classes.dex; fi - if [ -d bin/OFActivity.ap_ ]; then rm bin/OFActivity.ap_; fi - if [ -d bin/OFActivity-debug.apk ]; then rm bin/OFActivity-debug.apk; fi - if [ -d bin/OFActivity-debug-unaligned.apk ]; then rm bin/OFActivity-debug-unaligned.apk; fi - if [ -d bin/$(APPNAME).apk ]; then rm bin/$(APPNAME).apk; fi - ant debug - cp bin/OFActivity-debug.apk bin/$(APPNAME).apk - #if [ "$(shell $(SDK_ROOT)/platform-tools/adb get-state)" = "device" ]; then - $(SDK_ROOT)/platform-tools/adb install -r bin/$(APPNAME).apk; - #fi - $(SDK_ROOT)/platform-tools/adb shell am start -a android.intent.action.MAIN -n cc.openframeworks.$(APPNAME)/cc.openframeworks.$(APPNAME).OFActivity - - -after:$(TARGET) - cp -r $(OF_ROOT)/export/$(LIBSPATH)/libs bin/ - @echo - @echo " compiling done" - @echo " to launch the application" - @echo - @echo " cd bin" - @echo " ./$(BIN_NAME)" - @echo - - -.PHONY: help -help: - @echo - @echo openFrameworks universal makefile - @echo - @echo targets: - @echo "make Debug: builds the application with debug symbols" - @echo "make Release: builds the app 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 - @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 diff --git a/examples/android/androidEmptyExample/config.make b/examples/android/androidEmptyExample/config.make deleted file mode 100644 index 8266e5d914e..00000000000 --- a/examples/android/androidEmptyExample/config.make +++ /dev/null @@ -1,32 +0,0 @@ -# add custom variables to this file - -# OF_ROOT allows to move projects outside apps/* just set this variable to the -# absoulte path to the OF root folder - -OF_ROOT = ../../.. - - -# USER_CFLAGS allows to pass custom flags to the compiler -# for example search paths like: -# USER_CFLAGS = -I src/objects - -USER_CFLAGS = - - -# USER_LDFLAGS allows to pass custom flags to the linker -# for example libraries like: -# USER_LD_FLAGS = libs/libawesomelib.a - -USER_LDFLAGS = - -# android specific, in case you want to use different optimizations -USER_LIBS_ARM = -USER_LIBS_ARM7 = -USER_LIBS_NEON = - -# android optimizations - -ANDROID_COMPILER_OPTIMIZATION = -Os - - -EXCLUDE_FROM_SOURCE="bin,.xcodeproj,obj" diff --git a/examples/android/androidFontExample/Makefile b/examples/android/androidFontExample/Makefile deleted file mode 100644 index f61fe5d517a..00000000000 --- a/examples/android/androidFontExample/Makefile +++ /dev/null @@ -1,475 +0,0 @@ -# openFrameworks universal makefile -# -# make help : shows this message -# make Debug: makes the application with debug symbols -# make Release: makes the app with optimizations -# make: the same as make Release -# make CleanDebug: cleans the Debug target -# make CleanRelease: cleans the Release target -# make clean: cleans everything -# -# -# this should work with any OF app, just copy any example -# change the name of the folder and it should compile -# only .cpp support, don't use .c files -# it will look for files in any folder inside the application -# folder except that in the EXCLUDE_FROM_SOURCE variable -# it doesn't autodetect include paths yet -# add the include paths in the USER_CFLAGS variable -# using the gcc syntax: -Ipath -# -# to add addons to your application, edit the addons.make file -# in this directory and add the names of the addons you want to -# include -# -# edit the following vars to customize the makefile - -include config.make - -ifeq ($(findstring Android,$(MAKECMDGOALS)),Android) - include $(OF_ROOT)/libs/openFrameworksCompiled/project/android/paths.make - ARCH = android - ifeq ($(shell uname),Darwin) - HOST_PLATFORM = darwin-x86 - else - HOST_PLATFORM = linux-x86 - endif -endif - -ifeq ($(ARCH),android) - COMPILER_OPTIMIZATION = $(ANDROID_COMPILER_OPTIMIZATION) - NDK_PLATFORM = android-8 -else - COMPILER_OPTIMIZATION = $(USER_COMPILER_OPTIMIZATION) -endif - - - - -# you shouldn't modify anything below this line - - -SHELL = /bin/sh -ifneq ($(ARCH),android) - CXX = g++ - ARCH = $(shell uname -m) - ifeq ($(ARCH),x86_64) - LIBSPATH=linux64 - else - LIBSPATH=linux - endif -else - ifeq ($(findstring Release_arm7,$(MAKECMDGOALS)),Release_arm7) - LIBSPATH =android/armeabi-v7a - else - LIBSPATH =android/armeabi - endif - #NDK_ROOT = $(shell cat $(OF_ROOT)/libs/openFrameworksCompiled/project/android/ndk_path.make) - #SDK_ROOT = $(shell cat $(OF_ROOT)/libs/openFrameworksCompiled/project/android/sdk_path.make) - TOOLCHAIN=arm-linux-androideabi-4.4.3 - TOOLCHAIN_PATH=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/ - ANDROID_PREFIX=arm-linux-androideabi- - CC=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)gcc - CXX=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)g++ - AR=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)ar - SYSROOT=$(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/ - CFLAGS += -nostdlib --sysroot=$(SYSROOT) -fno-short-enums - CFLAGS += -I"$(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" -I"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/include/" -I"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include" - CFLAGS += -DANDROID -endif - -NODEPS = clean -SED_EXCLUDE_FROM_SRC = $(shell echo $(EXCLUDE_FROM_SOURCE) | sed s/\,/\\\\\|/g) -SOURCE_DIRS = $(shell find . -maxdepth 1 -mindepth 1 -type d | grep -v $(SED_EXCLUDE_FROM_SRC) | sed s/.\\///) -SOURCES = $(shell find $(SOURCE_DIRS) -name "*.cpp" -or -name "*.c" -or -name "*.cc") -OBJFILES = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(patsubst %.cc,%.o,$(SOURCES)))) - -ifneq (,$(USER_SOURCE_DIR)) - USER_SOURCES = $(shell find $(USER_SOURCE_DIR) -name "*.cpp" -or -name "*.c" -or -name "*.cc") - USER_OBJFILES = $(subst $(USER_SOURCE_DIR)/, ,$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(patsubst %.cc,%.o,$(USER_SOURCES))))) -endif - -APPNAME = $(shell basename `pwd`) -CORE_INCLUDES = $(shell find $(OF_ROOT)/libs/openFrameworks/ -type d) -CORE_INCLUDE_FLAGS = $(addprefix -I,$(CORE_INCLUDES)) -INCLUDES = $(shell find $(OF_ROOT)/libs/*/include -type d | grep -v glu | grep -v quicktime | grep -v poco) -INCLUDES_FLAGS = $(addprefix -I,$(INCLUDES)) -INCLUDES_FLAGS += -I$(OF_ROOT)/libs/poco/include -ifeq ($(ARCH),android) - INCLUDES_FLAGS += -I$(OF_ROOT)/libs/glu/include_android -else - INCLUDES_FLAGS += -I$(OF_ROOT)/libs/glu/include - INCLUDES_FLAGS += $(shell pkg-config glew gstreamer-0.10 gstreamer-video-0.10 gstreamer-base-0.10 libudev --cflags) - #check if gtk exists and add it - GTK = $(shell pkg-config gtk+-2.0 --exists; echo $$?) - ifeq ($(GTK),0) - CFLAGS += $(shell pkg-config gtk+-2.0 --cflags) -DOF_USING_GTK - SYSTEMLIBS += $(shell pkg-config gtk+-2.0 --libs) - endif - - #check if mpg123 exists and add it - MPG123 = $(shell pkg-config libmpg123 --exists; echo $$?) - ifeq ($(MPG123),0) - CFLAGS += -DOF_USING_MPG123 - SYSTEMLIBS += -lmpg123 - endif -endif -LIB_STATIC = $(shell ls $(OF_ROOT)/libs/*/lib/$(LIBSPATH)/*.a 2> /dev/null | grep -v openFrameworksCompiled | grep -v Poco) -LIB_SHARED = $(shell ls $(OF_ROOT)/libs/*/lib/$(LIBSPATH)/*.so 2> /dev/null | grep -v openFrameworksCompiled | sed "s/.*\\/lib\([^/]*\)\.so/-l\1/") -LIB_STATIC += $(OF_ROOT)/libs/poco/lib/$(LIBSPATH)/libPocoNet.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoXML.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoUtil.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoFoundation.a -LIB_PATHS_FLAGS = $(shell ls -d $(OF_ROOT)/libs/*/lib/$(LIBSPATH) | sed "s/\(\.*\)/-L\1/") - -CFLAGS += -Wall -fexceptions -CFLAGS += -I. -CFLAGS += $(INCLUDES_FLAGS) -CFLAGS += $(CORE_INCLUDE_FLAGS) - - - -ifeq ($(ARCH),android) - LDFLAGS = --sysroot=$(SYSROOT) -nostdlib -L"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi" - SYSTEMLIBS += -lstdc++ -lsupc++ -lgcc -lz -lGLESv1_CM -llog -ldl -lm -lc -else - LDFLAGS = -Wl,-rpath=./libs - SYSTEMLIBS += $(shell pkg-config jack glew gstreamer-0.10 gstreamer-video-0.10 gstreamer-base-0.10 gstreamer-app-0.10 libudev --libs) - SYSTEMLIBS += -lglut -lGL -lasound -lopenal -lsndfile -lvorbis -lFLAC -logg -lfreeimage -endif - - -ifeq ($(findstring addons.make,$(wildcard *.make)),addons.make) - ifneq ($(ARCH),android) - ADDONS = $(shell cat addons.make | grep -v ofxAndroid) - else - ADDONS = $(shell cat addons.make) - endif - - ifneq ($(strip $(ADDONS)),) - ADDONS_REL_DIRS = $(addsuffix /src, $(ADDONS)) - ADDONS_LIBS_REL_DIRS = $(addsuffix /libs, $(ADDONS)) - ADDONS_DIRS = $(addprefix $(OF_ROOT)/addons/, $(ADDONS_REL_DIRS) ) - ADDONS_LIBS_DIRS = $(addprefix $(OF_ROOT)/addons/, $(ADDONS_LIBS_REL_DIRS) ) - ADDONS_BIN_LIBS_DIRS = $(addsuffix /*/lib/$(LIBSPATH), $(ADDONS_LIBS_DIRS) ) - - ADDONS_INCLUDES = $(ADDONS_DIRS) - ADDONS_INCLUDES = $(ADDONS_LIBS_DIRS) - ADDONS_INCLUDES += $(shell find $(ADDONS_DIRS) -type d 2> /dev/null) - ADDONS_INCLUDES += $(shell find $(ADDONS_LIBS_DIRS) -type d 2> /dev/null) - ADDONSCFLAGS = $(addprefix -I,$(ADDONS_INCLUDES)) - - ifeq ($(findstring libsorder.make,$(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null)),libsorder.make) - ADDONS_LIBS_W_ORDER = $(shell cat $(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null)) - EXCLUDE_LIBS_FILTER = $(addprefix %,$(addsuffix .a,$(ADDONS_LIBS_W_ORDER))) - ADDONS_LIBS_STATICS = $(filter-out $(EXCLUDE_LIBS_FILTER), $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.a)) - ADDONS_LIBS_STATICS += $(addprefix -l, $(ADDONS_LIBS_W_ORDER)) - ADDONS_LIBS_STATICS += $(addprefix -L, $(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null | sed s/libsorder.make//g)) - else - ADDONS_LIBS_STATICS = $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.a 2> /dev/null) - endif - - ADDONS_LIBS_SHARED = $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.so 2> /dev/null) - ADDONSLIBS = $(ADDONS_LIBS_STATICS) - ADDONSLIBS += $(ADDONS_LIBS_SHARED) - - - ADDONS_SOURCES = $(shell find $(ADDONS_DIRS) -name "*.cpp" -or -name "*.c" 2> /dev/null) - ADDONS_SOURCES += $(shell find $(ADDONS_LIBS_DIRS) -name "*.cpp" -or -name "*.c" -or -name "*.cc" 2>/dev/null) - ADDONS_OBJFILES = $(subst $(OF_ROOT)/, ,$(patsubst %.cc,%.o,$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(ADDONS_SOURCES))))) - endif -endif - - -ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) - TARGET_CFLAGS = -g - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworksDebug.a - TARGET_NAME = Debug -endif - -ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) - TARGET_CFLAGS = $(COMPILER_OPTIMIZATION) - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworks.a - TARGET_NAME = Release -endif - -ifeq ($(ARCH),android) - ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) - TARGET = libs/armeabi/libOFAndroidApp.so - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworksDebug.a - LDFLAGS += -Wl,--fix-cortex-a8 -shared - USER_LIBS = $(USER_LIBS_ARM) - endif - - ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) - TARGET = libs/armeabi/libOFAndroidApp.so - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks.a - LDFLAGS += -Wl,--fix-cortex-a8 -shared - USER_LIBS = $(USER_LIBS_ARM) - endif - - ifeq ($(findstring Release_arm7,$(MAKECMDGOALS)),Release_arm7) - TARGET_NAME = Release_arm7 - TARGET_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mthumb - TARGET = libs/armeabi-v7a/libOFAndroidApp.so - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks_arm7.a - USER_LIBS = $(USER_LIBS_ARM7) - endif - - ifeq ($(findstring Release_neon,$(MAKECMDGOALS)),Release_neon) - TARGET_NAME = Release_neon - TARGET_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mfpu=neon - TARGET = libs/armeabi-v7a/libOFAndroidApp_neon.so - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks_neon.a - USER_LIBS = $(USER_LIBS_NEON) - endif - - ifeq ($(findstring TestLink,$(MAKECMDGOALS)),TestLink) - TARGET_NAME = Debug - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworksDebug.a - LDFLAGS += -Wl,--entry=main,--fix-cortex-a8 - BIN_NAME = $(APPNAME) - TARGET = obj/$(BIN_NAME) - USER_LIBS = $(USER_LIBS_ARM) - endif -else - ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) - BIN_NAME = $(APPNAME)_debug - TARGET = bin/$(BIN_NAME) - endif - - ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) - BIN_NAME = $(APPNAME) - TARGET = bin/$(BIN_NAME) - endif - - ifeq ($(MAKECMDGOALS),) - TARGET_NAME = Release - BIN_NAME = $(APPNAME) - TARGET = bin/$(BIN_NAME) - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworks.a - endif -endif - -ifeq ($(MAKECMDGOALS),clean) - TARGET = bin/$(APPNAME)_debug bin/$(APPNAME) - TARGET_NAME = Release -endif - -ifeq ($(MAKECMDGOALS),AndroidInstall) - TARGET_NAME = Install -endif - -OBJ_OUTPUT = obj/$(ARCH)$(TARGET_NAME)/ -CLEANTARGET = clean$(TARGET_NAME) - -OBJS = $(addprefix $(OBJ_OUTPUT), $(OBJFILES)) -DEPFILES = $(patsubst %.o,%.d,$(OBJS)) - -USER_OBJS = $(addprefix $(OBJ_OUTPUT), $(USER_OBJFILES)) -DEPFILES += $(patsubst %.o,%.d,$(USER_OBJS)) - -ifeq ($(findstring addons.make,$(wildcard *.make)),addons.make) - ADDONS_OBJS = $(addprefix $(OBJ_OUTPUT), $(ADDONS_OBJFILES)) - DEPFILES += $(patsubst %.o,%.d,$(ADDONS_OBJS)) -endif - -.PHONY: Debug Release all after afterDebugAndroid afterReleaseAndroid - -Release: $(TARGET) after - -Debug: $(TARGET) after - -all: - $(MAKE) Release - -DebugAndroid: $(TARGET) - -ReleaseAndroid: $(TARGET) - -Release_arm7Android: $(TARGET) - -Release_neonAndroid: $(TARGET) afterReleaseAndroid - -TestLinkAndroid: $(TARGET) afterDebugAndroid - -AndroidDebug: - $(MAKE) DebugAndroid - $(MAKE) TestLinkAndroid - -AndroidRelease: - $(MAKE) ReleaseAndroid - $(MAKE) Release_arm7Android - $(MAKE) Release_neonAndroid - - -#This rule does the compilation -#$(OBJS): $(SOURCES) -$(OBJ_OUTPUT)%.o: %.cpp - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CXX) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: %.c - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CC) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: %.cc - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CC) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.cpp - @echo "compiling addon object for" $< - mkdir -p $(@D) - $(CXX) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< - -$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.c - @echo "compiling addon object for" $< - mkdir -p $(@D) - $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< - -$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.cc - @echo "compiling addon object for" $< - mkdir -p $(@D) - $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< - -$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.c - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.cc - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.cpp - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CXX) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(TARGET): $(OBJS) $(ADDONS_OBJS) $(USER_OBJS) $(TARGET_LIBS) $(LIB_STATIC) - @echo 'linking $(TARGET)' - mkdir -p $(@D) - $(CXX) -o $@ $(OBJS) $(ADDONS_OBJS) $(USER_OBJS) $(LDFLAGS) $(USER_LDFLAGS) $(TARGET_LIBS) $(ADDONSLIBS) $(USER_LIBS) $(LIB_STATIC) $(LIB_PATHS_FLAGS) $(LIB_SHARED) $(SYSTEMLIBS) - --include $(DEPFILES) - -.PHONY: clean cleanDebug cleanRelease CleanAndroid -clean: - rm -rf $(OBJ_OUTPUT) - rm -f $(TARGET) - rm -r bin/libs - -$(CLEANTARGET): - rm -rf $(OBJ_OUTPUT) - rm -f $(TARGET) - rm -rf bin/libs - -CleanAndroid: - rm -Rf obj - rm -f libs/armeabi-v7a/libOFAndroidApp.so - rm -f libs/armeabi/libOFAndroidApp.so - rm -f obj/$(APPNAME) - - -afterDebugAndroid:$(TARGET) - @if [ -d libs/armeabi-v7a ]; then rm -r libs/armeabi-v7a; fi - - @cp $(NDK_ROOT)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver libs/armeabi - - #create gdb.setup for armeabi - @echo "set solib-search-path $(PWD)/obj/local/armeabi:$(PWD)/libs/armeabi" > libs/armeabi/gdb.setup - @echo "directory $(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" >> libs/armeabi/gdb.setup - @echo "directory $(PWD)/src" >> libs/armeabi/gdb.setup - @echo "directory $(NDK_ROOT)/sources/cxx-stl/system" >> libs/armeabi/gdb.setup - @echo "directory $(PWD)/libs/armeabi" >> libs/armeabi/gdb.setup - @echo "" >> libs/armeabi/gdb.setup - - @if [ ! -d jni ]; then mkdir jni; fi - @echo "APP_ABI := armeabi" > jni/Application.mk - @echo "#LOCAL_MODULE := OFAndroidApp" > jni/Android.mk - -afterReleaseAndroid:$(TARGET) - @if [ -f obj/$(BIN_NAME) ]; then rm obj/$(BIN_NAME); fi - - @cp $(OF_ROOT)/libs/openFrameworksCompiled/project/android/libneondetection.so libs/armeabi-v7a/ - @cp $(NDK_ROOT)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver libs/armeabi-v7a - - #create gdb.setup for armeabi-v7a - @echo "set solib-search-path $(PWD)/obj/local/armeabi-v7a:$(PWD)/libs/armeabi-v7a" > libs/armeabi-v7a/gdb.setup - @echo "directory $(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" >> libs/armeabi-v7a/gdb.setup - @echo "directory $(PWD)/src" >> libs/armeabi-v7a/gdb.setup - @echo "directory $(NDK_ROOT)/sources/cxx-stl/system" >> libs/armeabi-v7a/gdb.setup - @echo "directory $(PWD)/libs/armeabi-v7a" >> libs/armeabi-v7a/gdb.setup - @echo "" >> libs/armeabi-v7a/gdb.setup - - @if [ ! -d jni ]; then mkdir jni; fi - @echo "APP_ABI := armeabi armeabi-v7a" > jni/Application.mk - @echo "#LOCAL_MODULE := OFAndroidApp" > jni/Android.mk - -RESNAME=$(shell echo $(APPNAME)Resources | tr '[A-Z]' '[a-z]') - -AndroidInstall: - if [ -d "bin/data" ]; then \ - mkdir -p res/raw; \ - rm res/raw/$(RESNAME).zip; \ - cd bin/data; \ - zip -r ../../res/raw/$(RESNAME).zip *; \ - cd ../..; \ - fi - if [ -f obj/$(BIN_NAME) ]; then rm obj/$(BIN_NAME); fi - #touch AndroidManifest.xml - $(SDK_ROOT)/tools/android update project --target $(NDK_PLATFORM) --path $(PROJECT_PATH) - if [ -d bin/classes ]; then rm -r bin/classes; fi - if [ -d bin/classes.dex ]; then rm bin/classes.dex; fi - if [ -d bin/OFActivity.ap_ ]; then rm bin/OFActivity.ap_; fi - if [ -d bin/OFActivity-debug.apk ]; then rm bin/OFActivity-debug.apk; fi - if [ -d bin/OFActivity-debug-unaligned.apk ]; then rm bin/OFActivity-debug-unaligned.apk; fi - if [ -d bin/$(APPNAME).apk ]; then rm bin/$(APPNAME).apk; fi - ant debug - cp bin/OFActivity-debug.apk bin/$(APPNAME).apk - #if [ "$(shell $(SDK_ROOT)/platform-tools/adb get-state)" = "device" ]; then - $(SDK_ROOT)/platform-tools/adb install -r bin/$(APPNAME).apk; - #fi - $(SDK_ROOT)/platform-tools/adb shell am start -a android.intent.action.MAIN -n cc.openframeworks.$(APPNAME)/cc.openframeworks.$(APPNAME).OFActivity - - -after:$(TARGET) - cp -r $(OF_ROOT)/export/$(LIBSPATH)/libs bin/ - @echo - @echo " compiling done" - @echo " to launch the application" - @echo - @echo " cd bin" - @echo " ./$(BIN_NAME)" - @echo - - -.PHONY: help -help: - @echo - @echo openFrameworks universal makefile - @echo - @echo targets: - @echo "make Debug: builds the application with debug symbols" - @echo "make Release: builds the app 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 - @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 diff --git a/examples/android/androidFontExample/config.make b/examples/android/androidFontExample/config.make deleted file mode 100644 index 8266e5d914e..00000000000 --- a/examples/android/androidFontExample/config.make +++ /dev/null @@ -1,32 +0,0 @@ -# add custom variables to this file - -# OF_ROOT allows to move projects outside apps/* just set this variable to the -# absoulte path to the OF root folder - -OF_ROOT = ../../.. - - -# USER_CFLAGS allows to pass custom flags to the compiler -# for example search paths like: -# USER_CFLAGS = -I src/objects - -USER_CFLAGS = - - -# USER_LDFLAGS allows to pass custom flags to the linker -# for example libraries like: -# USER_LD_FLAGS = libs/libawesomelib.a - -USER_LDFLAGS = - -# android specific, in case you want to use different optimizations -USER_LIBS_ARM = -USER_LIBS_ARM7 = -USER_LIBS_NEON = - -# android optimizations - -ANDROID_COMPILER_OPTIMIZATION = -Os - - -EXCLUDE_FROM_SOURCE="bin,.xcodeproj,obj" diff --git a/examples/android/androidImageExample/Makefile b/examples/android/androidImageExample/Makefile deleted file mode 100644 index f61fe5d517a..00000000000 --- a/examples/android/androidImageExample/Makefile +++ /dev/null @@ -1,475 +0,0 @@ -# openFrameworks universal makefile -# -# make help : shows this message -# make Debug: makes the application with debug symbols -# make Release: makes the app with optimizations -# make: the same as make Release -# make CleanDebug: cleans the Debug target -# make CleanRelease: cleans the Release target -# make clean: cleans everything -# -# -# this should work with any OF app, just copy any example -# change the name of the folder and it should compile -# only .cpp support, don't use .c files -# it will look for files in any folder inside the application -# folder except that in the EXCLUDE_FROM_SOURCE variable -# it doesn't autodetect include paths yet -# add the include paths in the USER_CFLAGS variable -# using the gcc syntax: -Ipath -# -# to add addons to your application, edit the addons.make file -# in this directory and add the names of the addons you want to -# include -# -# edit the following vars to customize the makefile - -include config.make - -ifeq ($(findstring Android,$(MAKECMDGOALS)),Android) - include $(OF_ROOT)/libs/openFrameworksCompiled/project/android/paths.make - ARCH = android - ifeq ($(shell uname),Darwin) - HOST_PLATFORM = darwin-x86 - else - HOST_PLATFORM = linux-x86 - endif -endif - -ifeq ($(ARCH),android) - COMPILER_OPTIMIZATION = $(ANDROID_COMPILER_OPTIMIZATION) - NDK_PLATFORM = android-8 -else - COMPILER_OPTIMIZATION = $(USER_COMPILER_OPTIMIZATION) -endif - - - - -# you shouldn't modify anything below this line - - -SHELL = /bin/sh -ifneq ($(ARCH),android) - CXX = g++ - ARCH = $(shell uname -m) - ifeq ($(ARCH),x86_64) - LIBSPATH=linux64 - else - LIBSPATH=linux - endif -else - ifeq ($(findstring Release_arm7,$(MAKECMDGOALS)),Release_arm7) - LIBSPATH =android/armeabi-v7a - else - LIBSPATH =android/armeabi - endif - #NDK_ROOT = $(shell cat $(OF_ROOT)/libs/openFrameworksCompiled/project/android/ndk_path.make) - #SDK_ROOT = $(shell cat $(OF_ROOT)/libs/openFrameworksCompiled/project/android/sdk_path.make) - TOOLCHAIN=arm-linux-androideabi-4.4.3 - TOOLCHAIN_PATH=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/ - ANDROID_PREFIX=arm-linux-androideabi- - CC=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)gcc - CXX=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)g++ - AR=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)ar - SYSROOT=$(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/ - CFLAGS += -nostdlib --sysroot=$(SYSROOT) -fno-short-enums - CFLAGS += -I"$(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" -I"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/include/" -I"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include" - CFLAGS += -DANDROID -endif - -NODEPS = clean -SED_EXCLUDE_FROM_SRC = $(shell echo $(EXCLUDE_FROM_SOURCE) | sed s/\,/\\\\\|/g) -SOURCE_DIRS = $(shell find . -maxdepth 1 -mindepth 1 -type d | grep -v $(SED_EXCLUDE_FROM_SRC) | sed s/.\\///) -SOURCES = $(shell find $(SOURCE_DIRS) -name "*.cpp" -or -name "*.c" -or -name "*.cc") -OBJFILES = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(patsubst %.cc,%.o,$(SOURCES)))) - -ifneq (,$(USER_SOURCE_DIR)) - USER_SOURCES = $(shell find $(USER_SOURCE_DIR) -name "*.cpp" -or -name "*.c" -or -name "*.cc") - USER_OBJFILES = $(subst $(USER_SOURCE_DIR)/, ,$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(patsubst %.cc,%.o,$(USER_SOURCES))))) -endif - -APPNAME = $(shell basename `pwd`) -CORE_INCLUDES = $(shell find $(OF_ROOT)/libs/openFrameworks/ -type d) -CORE_INCLUDE_FLAGS = $(addprefix -I,$(CORE_INCLUDES)) -INCLUDES = $(shell find $(OF_ROOT)/libs/*/include -type d | grep -v glu | grep -v quicktime | grep -v poco) -INCLUDES_FLAGS = $(addprefix -I,$(INCLUDES)) -INCLUDES_FLAGS += -I$(OF_ROOT)/libs/poco/include -ifeq ($(ARCH),android) - INCLUDES_FLAGS += -I$(OF_ROOT)/libs/glu/include_android -else - INCLUDES_FLAGS += -I$(OF_ROOT)/libs/glu/include - INCLUDES_FLAGS += $(shell pkg-config glew gstreamer-0.10 gstreamer-video-0.10 gstreamer-base-0.10 libudev --cflags) - #check if gtk exists and add it - GTK = $(shell pkg-config gtk+-2.0 --exists; echo $$?) - ifeq ($(GTK),0) - CFLAGS += $(shell pkg-config gtk+-2.0 --cflags) -DOF_USING_GTK - SYSTEMLIBS += $(shell pkg-config gtk+-2.0 --libs) - endif - - #check if mpg123 exists and add it - MPG123 = $(shell pkg-config libmpg123 --exists; echo $$?) - ifeq ($(MPG123),0) - CFLAGS += -DOF_USING_MPG123 - SYSTEMLIBS += -lmpg123 - endif -endif -LIB_STATIC = $(shell ls $(OF_ROOT)/libs/*/lib/$(LIBSPATH)/*.a 2> /dev/null | grep -v openFrameworksCompiled | grep -v Poco) -LIB_SHARED = $(shell ls $(OF_ROOT)/libs/*/lib/$(LIBSPATH)/*.so 2> /dev/null | grep -v openFrameworksCompiled | sed "s/.*\\/lib\([^/]*\)\.so/-l\1/") -LIB_STATIC += $(OF_ROOT)/libs/poco/lib/$(LIBSPATH)/libPocoNet.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoXML.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoUtil.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoFoundation.a -LIB_PATHS_FLAGS = $(shell ls -d $(OF_ROOT)/libs/*/lib/$(LIBSPATH) | sed "s/\(\.*\)/-L\1/") - -CFLAGS += -Wall -fexceptions -CFLAGS += -I. -CFLAGS += $(INCLUDES_FLAGS) -CFLAGS += $(CORE_INCLUDE_FLAGS) - - - -ifeq ($(ARCH),android) - LDFLAGS = --sysroot=$(SYSROOT) -nostdlib -L"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi" - SYSTEMLIBS += -lstdc++ -lsupc++ -lgcc -lz -lGLESv1_CM -llog -ldl -lm -lc -else - LDFLAGS = -Wl,-rpath=./libs - SYSTEMLIBS += $(shell pkg-config jack glew gstreamer-0.10 gstreamer-video-0.10 gstreamer-base-0.10 gstreamer-app-0.10 libudev --libs) - SYSTEMLIBS += -lglut -lGL -lasound -lopenal -lsndfile -lvorbis -lFLAC -logg -lfreeimage -endif - - -ifeq ($(findstring addons.make,$(wildcard *.make)),addons.make) - ifneq ($(ARCH),android) - ADDONS = $(shell cat addons.make | grep -v ofxAndroid) - else - ADDONS = $(shell cat addons.make) - endif - - ifneq ($(strip $(ADDONS)),) - ADDONS_REL_DIRS = $(addsuffix /src, $(ADDONS)) - ADDONS_LIBS_REL_DIRS = $(addsuffix /libs, $(ADDONS)) - ADDONS_DIRS = $(addprefix $(OF_ROOT)/addons/, $(ADDONS_REL_DIRS) ) - ADDONS_LIBS_DIRS = $(addprefix $(OF_ROOT)/addons/, $(ADDONS_LIBS_REL_DIRS) ) - ADDONS_BIN_LIBS_DIRS = $(addsuffix /*/lib/$(LIBSPATH), $(ADDONS_LIBS_DIRS) ) - - ADDONS_INCLUDES = $(ADDONS_DIRS) - ADDONS_INCLUDES = $(ADDONS_LIBS_DIRS) - ADDONS_INCLUDES += $(shell find $(ADDONS_DIRS) -type d 2> /dev/null) - ADDONS_INCLUDES += $(shell find $(ADDONS_LIBS_DIRS) -type d 2> /dev/null) - ADDONSCFLAGS = $(addprefix -I,$(ADDONS_INCLUDES)) - - ifeq ($(findstring libsorder.make,$(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null)),libsorder.make) - ADDONS_LIBS_W_ORDER = $(shell cat $(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null)) - EXCLUDE_LIBS_FILTER = $(addprefix %,$(addsuffix .a,$(ADDONS_LIBS_W_ORDER))) - ADDONS_LIBS_STATICS = $(filter-out $(EXCLUDE_LIBS_FILTER), $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.a)) - ADDONS_LIBS_STATICS += $(addprefix -l, $(ADDONS_LIBS_W_ORDER)) - ADDONS_LIBS_STATICS += $(addprefix -L, $(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null | sed s/libsorder.make//g)) - else - ADDONS_LIBS_STATICS = $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.a 2> /dev/null) - endif - - ADDONS_LIBS_SHARED = $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.so 2> /dev/null) - ADDONSLIBS = $(ADDONS_LIBS_STATICS) - ADDONSLIBS += $(ADDONS_LIBS_SHARED) - - - ADDONS_SOURCES = $(shell find $(ADDONS_DIRS) -name "*.cpp" -or -name "*.c" 2> /dev/null) - ADDONS_SOURCES += $(shell find $(ADDONS_LIBS_DIRS) -name "*.cpp" -or -name "*.c" -or -name "*.cc" 2>/dev/null) - ADDONS_OBJFILES = $(subst $(OF_ROOT)/, ,$(patsubst %.cc,%.o,$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(ADDONS_SOURCES))))) - endif -endif - - -ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) - TARGET_CFLAGS = -g - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworksDebug.a - TARGET_NAME = Debug -endif - -ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) - TARGET_CFLAGS = $(COMPILER_OPTIMIZATION) - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworks.a - TARGET_NAME = Release -endif - -ifeq ($(ARCH),android) - ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) - TARGET = libs/armeabi/libOFAndroidApp.so - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworksDebug.a - LDFLAGS += -Wl,--fix-cortex-a8 -shared - USER_LIBS = $(USER_LIBS_ARM) - endif - - ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) - TARGET = libs/armeabi/libOFAndroidApp.so - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks.a - LDFLAGS += -Wl,--fix-cortex-a8 -shared - USER_LIBS = $(USER_LIBS_ARM) - endif - - ifeq ($(findstring Release_arm7,$(MAKECMDGOALS)),Release_arm7) - TARGET_NAME = Release_arm7 - TARGET_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mthumb - TARGET = libs/armeabi-v7a/libOFAndroidApp.so - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks_arm7.a - USER_LIBS = $(USER_LIBS_ARM7) - endif - - ifeq ($(findstring Release_neon,$(MAKECMDGOALS)),Release_neon) - TARGET_NAME = Release_neon - TARGET_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mfpu=neon - TARGET = libs/armeabi-v7a/libOFAndroidApp_neon.so - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks_neon.a - USER_LIBS = $(USER_LIBS_NEON) - endif - - ifeq ($(findstring TestLink,$(MAKECMDGOALS)),TestLink) - TARGET_NAME = Debug - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworksDebug.a - LDFLAGS += -Wl,--entry=main,--fix-cortex-a8 - BIN_NAME = $(APPNAME) - TARGET = obj/$(BIN_NAME) - USER_LIBS = $(USER_LIBS_ARM) - endif -else - ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) - BIN_NAME = $(APPNAME)_debug - TARGET = bin/$(BIN_NAME) - endif - - ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) - BIN_NAME = $(APPNAME) - TARGET = bin/$(BIN_NAME) - endif - - ifeq ($(MAKECMDGOALS),) - TARGET_NAME = Release - BIN_NAME = $(APPNAME) - TARGET = bin/$(BIN_NAME) - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworks.a - endif -endif - -ifeq ($(MAKECMDGOALS),clean) - TARGET = bin/$(APPNAME)_debug bin/$(APPNAME) - TARGET_NAME = Release -endif - -ifeq ($(MAKECMDGOALS),AndroidInstall) - TARGET_NAME = Install -endif - -OBJ_OUTPUT = obj/$(ARCH)$(TARGET_NAME)/ -CLEANTARGET = clean$(TARGET_NAME) - -OBJS = $(addprefix $(OBJ_OUTPUT), $(OBJFILES)) -DEPFILES = $(patsubst %.o,%.d,$(OBJS)) - -USER_OBJS = $(addprefix $(OBJ_OUTPUT), $(USER_OBJFILES)) -DEPFILES += $(patsubst %.o,%.d,$(USER_OBJS)) - -ifeq ($(findstring addons.make,$(wildcard *.make)),addons.make) - ADDONS_OBJS = $(addprefix $(OBJ_OUTPUT), $(ADDONS_OBJFILES)) - DEPFILES += $(patsubst %.o,%.d,$(ADDONS_OBJS)) -endif - -.PHONY: Debug Release all after afterDebugAndroid afterReleaseAndroid - -Release: $(TARGET) after - -Debug: $(TARGET) after - -all: - $(MAKE) Release - -DebugAndroid: $(TARGET) - -ReleaseAndroid: $(TARGET) - -Release_arm7Android: $(TARGET) - -Release_neonAndroid: $(TARGET) afterReleaseAndroid - -TestLinkAndroid: $(TARGET) afterDebugAndroid - -AndroidDebug: - $(MAKE) DebugAndroid - $(MAKE) TestLinkAndroid - -AndroidRelease: - $(MAKE) ReleaseAndroid - $(MAKE) Release_arm7Android - $(MAKE) Release_neonAndroid - - -#This rule does the compilation -#$(OBJS): $(SOURCES) -$(OBJ_OUTPUT)%.o: %.cpp - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CXX) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: %.c - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CC) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: %.cc - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CC) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.cpp - @echo "compiling addon object for" $< - mkdir -p $(@D) - $(CXX) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< - -$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.c - @echo "compiling addon object for" $< - mkdir -p $(@D) - $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< - -$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.cc - @echo "compiling addon object for" $< - mkdir -p $(@D) - $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< - -$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.c - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.cc - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.cpp - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CXX) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(TARGET): $(OBJS) $(ADDONS_OBJS) $(USER_OBJS) $(TARGET_LIBS) $(LIB_STATIC) - @echo 'linking $(TARGET)' - mkdir -p $(@D) - $(CXX) -o $@ $(OBJS) $(ADDONS_OBJS) $(USER_OBJS) $(LDFLAGS) $(USER_LDFLAGS) $(TARGET_LIBS) $(ADDONSLIBS) $(USER_LIBS) $(LIB_STATIC) $(LIB_PATHS_FLAGS) $(LIB_SHARED) $(SYSTEMLIBS) - --include $(DEPFILES) - -.PHONY: clean cleanDebug cleanRelease CleanAndroid -clean: - rm -rf $(OBJ_OUTPUT) - rm -f $(TARGET) - rm -r bin/libs - -$(CLEANTARGET): - rm -rf $(OBJ_OUTPUT) - rm -f $(TARGET) - rm -rf bin/libs - -CleanAndroid: - rm -Rf obj - rm -f libs/armeabi-v7a/libOFAndroidApp.so - rm -f libs/armeabi/libOFAndroidApp.so - rm -f obj/$(APPNAME) - - -afterDebugAndroid:$(TARGET) - @if [ -d libs/armeabi-v7a ]; then rm -r libs/armeabi-v7a; fi - - @cp $(NDK_ROOT)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver libs/armeabi - - #create gdb.setup for armeabi - @echo "set solib-search-path $(PWD)/obj/local/armeabi:$(PWD)/libs/armeabi" > libs/armeabi/gdb.setup - @echo "directory $(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" >> libs/armeabi/gdb.setup - @echo "directory $(PWD)/src" >> libs/armeabi/gdb.setup - @echo "directory $(NDK_ROOT)/sources/cxx-stl/system" >> libs/armeabi/gdb.setup - @echo "directory $(PWD)/libs/armeabi" >> libs/armeabi/gdb.setup - @echo "" >> libs/armeabi/gdb.setup - - @if [ ! -d jni ]; then mkdir jni; fi - @echo "APP_ABI := armeabi" > jni/Application.mk - @echo "#LOCAL_MODULE := OFAndroidApp" > jni/Android.mk - -afterReleaseAndroid:$(TARGET) - @if [ -f obj/$(BIN_NAME) ]; then rm obj/$(BIN_NAME); fi - - @cp $(OF_ROOT)/libs/openFrameworksCompiled/project/android/libneondetection.so libs/armeabi-v7a/ - @cp $(NDK_ROOT)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver libs/armeabi-v7a - - #create gdb.setup for armeabi-v7a - @echo "set solib-search-path $(PWD)/obj/local/armeabi-v7a:$(PWD)/libs/armeabi-v7a" > libs/armeabi-v7a/gdb.setup - @echo "directory $(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" >> libs/armeabi-v7a/gdb.setup - @echo "directory $(PWD)/src" >> libs/armeabi-v7a/gdb.setup - @echo "directory $(NDK_ROOT)/sources/cxx-stl/system" >> libs/armeabi-v7a/gdb.setup - @echo "directory $(PWD)/libs/armeabi-v7a" >> libs/armeabi-v7a/gdb.setup - @echo "" >> libs/armeabi-v7a/gdb.setup - - @if [ ! -d jni ]; then mkdir jni; fi - @echo "APP_ABI := armeabi armeabi-v7a" > jni/Application.mk - @echo "#LOCAL_MODULE := OFAndroidApp" > jni/Android.mk - -RESNAME=$(shell echo $(APPNAME)Resources | tr '[A-Z]' '[a-z]') - -AndroidInstall: - if [ -d "bin/data" ]; then \ - mkdir -p res/raw; \ - rm res/raw/$(RESNAME).zip; \ - cd bin/data; \ - zip -r ../../res/raw/$(RESNAME).zip *; \ - cd ../..; \ - fi - if [ -f obj/$(BIN_NAME) ]; then rm obj/$(BIN_NAME); fi - #touch AndroidManifest.xml - $(SDK_ROOT)/tools/android update project --target $(NDK_PLATFORM) --path $(PROJECT_PATH) - if [ -d bin/classes ]; then rm -r bin/classes; fi - if [ -d bin/classes.dex ]; then rm bin/classes.dex; fi - if [ -d bin/OFActivity.ap_ ]; then rm bin/OFActivity.ap_; fi - if [ -d bin/OFActivity-debug.apk ]; then rm bin/OFActivity-debug.apk; fi - if [ -d bin/OFActivity-debug-unaligned.apk ]; then rm bin/OFActivity-debug-unaligned.apk; fi - if [ -d bin/$(APPNAME).apk ]; then rm bin/$(APPNAME).apk; fi - ant debug - cp bin/OFActivity-debug.apk bin/$(APPNAME).apk - #if [ "$(shell $(SDK_ROOT)/platform-tools/adb get-state)" = "device" ]; then - $(SDK_ROOT)/platform-tools/adb install -r bin/$(APPNAME).apk; - #fi - $(SDK_ROOT)/platform-tools/adb shell am start -a android.intent.action.MAIN -n cc.openframeworks.$(APPNAME)/cc.openframeworks.$(APPNAME).OFActivity - - -after:$(TARGET) - cp -r $(OF_ROOT)/export/$(LIBSPATH)/libs bin/ - @echo - @echo " compiling done" - @echo " to launch the application" - @echo - @echo " cd bin" - @echo " ./$(BIN_NAME)" - @echo - - -.PHONY: help -help: - @echo - @echo openFrameworks universal makefile - @echo - @echo targets: - @echo "make Debug: builds the application with debug symbols" - @echo "make Release: builds the app 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 - @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 diff --git a/examples/android/androidImageExample/config.make b/examples/android/androidImageExample/config.make deleted file mode 100644 index 8266e5d914e..00000000000 --- a/examples/android/androidImageExample/config.make +++ /dev/null @@ -1,32 +0,0 @@ -# add custom variables to this file - -# OF_ROOT allows to move projects outside apps/* just set this variable to the -# absoulte path to the OF root folder - -OF_ROOT = ../../.. - - -# USER_CFLAGS allows to pass custom flags to the compiler -# for example search paths like: -# USER_CFLAGS = -I src/objects - -USER_CFLAGS = - - -# USER_LDFLAGS allows to pass custom flags to the linker -# for example libraries like: -# USER_LD_FLAGS = libs/libawesomelib.a - -USER_LDFLAGS = - -# android specific, in case you want to use different optimizations -USER_LIBS_ARM = -USER_LIBS_ARM7 = -USER_LIBS_NEON = - -# android optimizations - -ANDROID_COMPILER_OPTIMIZATION = -Os - - -EXCLUDE_FROM_SOURCE="bin,.xcodeproj,obj" diff --git a/examples/android/androidOpenCVExample/Makefile b/examples/android/androidOpenCVExample/Makefile deleted file mode 100644 index f61fe5d517a..00000000000 --- a/examples/android/androidOpenCVExample/Makefile +++ /dev/null @@ -1,475 +0,0 @@ -# openFrameworks universal makefile -# -# make help : shows this message -# make Debug: makes the application with debug symbols -# make Release: makes the app with optimizations -# make: the same as make Release -# make CleanDebug: cleans the Debug target -# make CleanRelease: cleans the Release target -# make clean: cleans everything -# -# -# this should work with any OF app, just copy any example -# change the name of the folder and it should compile -# only .cpp support, don't use .c files -# it will look for files in any folder inside the application -# folder except that in the EXCLUDE_FROM_SOURCE variable -# it doesn't autodetect include paths yet -# add the include paths in the USER_CFLAGS variable -# using the gcc syntax: -Ipath -# -# to add addons to your application, edit the addons.make file -# in this directory and add the names of the addons you want to -# include -# -# edit the following vars to customize the makefile - -include config.make - -ifeq ($(findstring Android,$(MAKECMDGOALS)),Android) - include $(OF_ROOT)/libs/openFrameworksCompiled/project/android/paths.make - ARCH = android - ifeq ($(shell uname),Darwin) - HOST_PLATFORM = darwin-x86 - else - HOST_PLATFORM = linux-x86 - endif -endif - -ifeq ($(ARCH),android) - COMPILER_OPTIMIZATION = $(ANDROID_COMPILER_OPTIMIZATION) - NDK_PLATFORM = android-8 -else - COMPILER_OPTIMIZATION = $(USER_COMPILER_OPTIMIZATION) -endif - - - - -# you shouldn't modify anything below this line - - -SHELL = /bin/sh -ifneq ($(ARCH),android) - CXX = g++ - ARCH = $(shell uname -m) - ifeq ($(ARCH),x86_64) - LIBSPATH=linux64 - else - LIBSPATH=linux - endif -else - ifeq ($(findstring Release_arm7,$(MAKECMDGOALS)),Release_arm7) - LIBSPATH =android/armeabi-v7a - else - LIBSPATH =android/armeabi - endif - #NDK_ROOT = $(shell cat $(OF_ROOT)/libs/openFrameworksCompiled/project/android/ndk_path.make) - #SDK_ROOT = $(shell cat $(OF_ROOT)/libs/openFrameworksCompiled/project/android/sdk_path.make) - TOOLCHAIN=arm-linux-androideabi-4.4.3 - TOOLCHAIN_PATH=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/ - ANDROID_PREFIX=arm-linux-androideabi- - CC=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)gcc - CXX=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)g++ - AR=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)ar - SYSROOT=$(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/ - CFLAGS += -nostdlib --sysroot=$(SYSROOT) -fno-short-enums - CFLAGS += -I"$(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" -I"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/include/" -I"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include" - CFLAGS += -DANDROID -endif - -NODEPS = clean -SED_EXCLUDE_FROM_SRC = $(shell echo $(EXCLUDE_FROM_SOURCE) | sed s/\,/\\\\\|/g) -SOURCE_DIRS = $(shell find . -maxdepth 1 -mindepth 1 -type d | grep -v $(SED_EXCLUDE_FROM_SRC) | sed s/.\\///) -SOURCES = $(shell find $(SOURCE_DIRS) -name "*.cpp" -or -name "*.c" -or -name "*.cc") -OBJFILES = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(patsubst %.cc,%.o,$(SOURCES)))) - -ifneq (,$(USER_SOURCE_DIR)) - USER_SOURCES = $(shell find $(USER_SOURCE_DIR) -name "*.cpp" -or -name "*.c" -or -name "*.cc") - USER_OBJFILES = $(subst $(USER_SOURCE_DIR)/, ,$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(patsubst %.cc,%.o,$(USER_SOURCES))))) -endif - -APPNAME = $(shell basename `pwd`) -CORE_INCLUDES = $(shell find $(OF_ROOT)/libs/openFrameworks/ -type d) -CORE_INCLUDE_FLAGS = $(addprefix -I,$(CORE_INCLUDES)) -INCLUDES = $(shell find $(OF_ROOT)/libs/*/include -type d | grep -v glu | grep -v quicktime | grep -v poco) -INCLUDES_FLAGS = $(addprefix -I,$(INCLUDES)) -INCLUDES_FLAGS += -I$(OF_ROOT)/libs/poco/include -ifeq ($(ARCH),android) - INCLUDES_FLAGS += -I$(OF_ROOT)/libs/glu/include_android -else - INCLUDES_FLAGS += -I$(OF_ROOT)/libs/glu/include - INCLUDES_FLAGS += $(shell pkg-config glew gstreamer-0.10 gstreamer-video-0.10 gstreamer-base-0.10 libudev --cflags) - #check if gtk exists and add it - GTK = $(shell pkg-config gtk+-2.0 --exists; echo $$?) - ifeq ($(GTK),0) - CFLAGS += $(shell pkg-config gtk+-2.0 --cflags) -DOF_USING_GTK - SYSTEMLIBS += $(shell pkg-config gtk+-2.0 --libs) - endif - - #check if mpg123 exists and add it - MPG123 = $(shell pkg-config libmpg123 --exists; echo $$?) - ifeq ($(MPG123),0) - CFLAGS += -DOF_USING_MPG123 - SYSTEMLIBS += -lmpg123 - endif -endif -LIB_STATIC = $(shell ls $(OF_ROOT)/libs/*/lib/$(LIBSPATH)/*.a 2> /dev/null | grep -v openFrameworksCompiled | grep -v Poco) -LIB_SHARED = $(shell ls $(OF_ROOT)/libs/*/lib/$(LIBSPATH)/*.so 2> /dev/null | grep -v openFrameworksCompiled | sed "s/.*\\/lib\([^/]*\)\.so/-l\1/") -LIB_STATIC += $(OF_ROOT)/libs/poco/lib/$(LIBSPATH)/libPocoNet.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoXML.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoUtil.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoFoundation.a -LIB_PATHS_FLAGS = $(shell ls -d $(OF_ROOT)/libs/*/lib/$(LIBSPATH) | sed "s/\(\.*\)/-L\1/") - -CFLAGS += -Wall -fexceptions -CFLAGS += -I. -CFLAGS += $(INCLUDES_FLAGS) -CFLAGS += $(CORE_INCLUDE_FLAGS) - - - -ifeq ($(ARCH),android) - LDFLAGS = --sysroot=$(SYSROOT) -nostdlib -L"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi" - SYSTEMLIBS += -lstdc++ -lsupc++ -lgcc -lz -lGLESv1_CM -llog -ldl -lm -lc -else - LDFLAGS = -Wl,-rpath=./libs - SYSTEMLIBS += $(shell pkg-config jack glew gstreamer-0.10 gstreamer-video-0.10 gstreamer-base-0.10 gstreamer-app-0.10 libudev --libs) - SYSTEMLIBS += -lglut -lGL -lasound -lopenal -lsndfile -lvorbis -lFLAC -logg -lfreeimage -endif - - -ifeq ($(findstring addons.make,$(wildcard *.make)),addons.make) - ifneq ($(ARCH),android) - ADDONS = $(shell cat addons.make | grep -v ofxAndroid) - else - ADDONS = $(shell cat addons.make) - endif - - ifneq ($(strip $(ADDONS)),) - ADDONS_REL_DIRS = $(addsuffix /src, $(ADDONS)) - ADDONS_LIBS_REL_DIRS = $(addsuffix /libs, $(ADDONS)) - ADDONS_DIRS = $(addprefix $(OF_ROOT)/addons/, $(ADDONS_REL_DIRS) ) - ADDONS_LIBS_DIRS = $(addprefix $(OF_ROOT)/addons/, $(ADDONS_LIBS_REL_DIRS) ) - ADDONS_BIN_LIBS_DIRS = $(addsuffix /*/lib/$(LIBSPATH), $(ADDONS_LIBS_DIRS) ) - - ADDONS_INCLUDES = $(ADDONS_DIRS) - ADDONS_INCLUDES = $(ADDONS_LIBS_DIRS) - ADDONS_INCLUDES += $(shell find $(ADDONS_DIRS) -type d 2> /dev/null) - ADDONS_INCLUDES += $(shell find $(ADDONS_LIBS_DIRS) -type d 2> /dev/null) - ADDONSCFLAGS = $(addprefix -I,$(ADDONS_INCLUDES)) - - ifeq ($(findstring libsorder.make,$(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null)),libsorder.make) - ADDONS_LIBS_W_ORDER = $(shell cat $(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null)) - EXCLUDE_LIBS_FILTER = $(addprefix %,$(addsuffix .a,$(ADDONS_LIBS_W_ORDER))) - ADDONS_LIBS_STATICS = $(filter-out $(EXCLUDE_LIBS_FILTER), $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.a)) - ADDONS_LIBS_STATICS += $(addprefix -l, $(ADDONS_LIBS_W_ORDER)) - ADDONS_LIBS_STATICS += $(addprefix -L, $(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null | sed s/libsorder.make//g)) - else - ADDONS_LIBS_STATICS = $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.a 2> /dev/null) - endif - - ADDONS_LIBS_SHARED = $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.so 2> /dev/null) - ADDONSLIBS = $(ADDONS_LIBS_STATICS) - ADDONSLIBS += $(ADDONS_LIBS_SHARED) - - - ADDONS_SOURCES = $(shell find $(ADDONS_DIRS) -name "*.cpp" -or -name "*.c" 2> /dev/null) - ADDONS_SOURCES += $(shell find $(ADDONS_LIBS_DIRS) -name "*.cpp" -or -name "*.c" -or -name "*.cc" 2>/dev/null) - ADDONS_OBJFILES = $(subst $(OF_ROOT)/, ,$(patsubst %.cc,%.o,$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(ADDONS_SOURCES))))) - endif -endif - - -ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) - TARGET_CFLAGS = -g - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworksDebug.a - TARGET_NAME = Debug -endif - -ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) - TARGET_CFLAGS = $(COMPILER_OPTIMIZATION) - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworks.a - TARGET_NAME = Release -endif - -ifeq ($(ARCH),android) - ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) - TARGET = libs/armeabi/libOFAndroidApp.so - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworksDebug.a - LDFLAGS += -Wl,--fix-cortex-a8 -shared - USER_LIBS = $(USER_LIBS_ARM) - endif - - ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) - TARGET = libs/armeabi/libOFAndroidApp.so - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks.a - LDFLAGS += -Wl,--fix-cortex-a8 -shared - USER_LIBS = $(USER_LIBS_ARM) - endif - - ifeq ($(findstring Release_arm7,$(MAKECMDGOALS)),Release_arm7) - TARGET_NAME = Release_arm7 - TARGET_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mthumb - TARGET = libs/armeabi-v7a/libOFAndroidApp.so - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks_arm7.a - USER_LIBS = $(USER_LIBS_ARM7) - endif - - ifeq ($(findstring Release_neon,$(MAKECMDGOALS)),Release_neon) - TARGET_NAME = Release_neon - TARGET_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mfpu=neon - TARGET = libs/armeabi-v7a/libOFAndroidApp_neon.so - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks_neon.a - USER_LIBS = $(USER_LIBS_NEON) - endif - - ifeq ($(findstring TestLink,$(MAKECMDGOALS)),TestLink) - TARGET_NAME = Debug - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworksDebug.a - LDFLAGS += -Wl,--entry=main,--fix-cortex-a8 - BIN_NAME = $(APPNAME) - TARGET = obj/$(BIN_NAME) - USER_LIBS = $(USER_LIBS_ARM) - endif -else - ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) - BIN_NAME = $(APPNAME)_debug - TARGET = bin/$(BIN_NAME) - endif - - ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) - BIN_NAME = $(APPNAME) - TARGET = bin/$(BIN_NAME) - endif - - ifeq ($(MAKECMDGOALS),) - TARGET_NAME = Release - BIN_NAME = $(APPNAME) - TARGET = bin/$(BIN_NAME) - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworks.a - endif -endif - -ifeq ($(MAKECMDGOALS),clean) - TARGET = bin/$(APPNAME)_debug bin/$(APPNAME) - TARGET_NAME = Release -endif - -ifeq ($(MAKECMDGOALS),AndroidInstall) - TARGET_NAME = Install -endif - -OBJ_OUTPUT = obj/$(ARCH)$(TARGET_NAME)/ -CLEANTARGET = clean$(TARGET_NAME) - -OBJS = $(addprefix $(OBJ_OUTPUT), $(OBJFILES)) -DEPFILES = $(patsubst %.o,%.d,$(OBJS)) - -USER_OBJS = $(addprefix $(OBJ_OUTPUT), $(USER_OBJFILES)) -DEPFILES += $(patsubst %.o,%.d,$(USER_OBJS)) - -ifeq ($(findstring addons.make,$(wildcard *.make)),addons.make) - ADDONS_OBJS = $(addprefix $(OBJ_OUTPUT), $(ADDONS_OBJFILES)) - DEPFILES += $(patsubst %.o,%.d,$(ADDONS_OBJS)) -endif - -.PHONY: Debug Release all after afterDebugAndroid afterReleaseAndroid - -Release: $(TARGET) after - -Debug: $(TARGET) after - -all: - $(MAKE) Release - -DebugAndroid: $(TARGET) - -ReleaseAndroid: $(TARGET) - -Release_arm7Android: $(TARGET) - -Release_neonAndroid: $(TARGET) afterReleaseAndroid - -TestLinkAndroid: $(TARGET) afterDebugAndroid - -AndroidDebug: - $(MAKE) DebugAndroid - $(MAKE) TestLinkAndroid - -AndroidRelease: - $(MAKE) ReleaseAndroid - $(MAKE) Release_arm7Android - $(MAKE) Release_neonAndroid - - -#This rule does the compilation -#$(OBJS): $(SOURCES) -$(OBJ_OUTPUT)%.o: %.cpp - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CXX) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: %.c - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CC) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: %.cc - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CC) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.cpp - @echo "compiling addon object for" $< - mkdir -p $(@D) - $(CXX) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< - -$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.c - @echo "compiling addon object for" $< - mkdir -p $(@D) - $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< - -$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.cc - @echo "compiling addon object for" $< - mkdir -p $(@D) - $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< - -$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.c - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.cc - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.cpp - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CXX) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(TARGET): $(OBJS) $(ADDONS_OBJS) $(USER_OBJS) $(TARGET_LIBS) $(LIB_STATIC) - @echo 'linking $(TARGET)' - mkdir -p $(@D) - $(CXX) -o $@ $(OBJS) $(ADDONS_OBJS) $(USER_OBJS) $(LDFLAGS) $(USER_LDFLAGS) $(TARGET_LIBS) $(ADDONSLIBS) $(USER_LIBS) $(LIB_STATIC) $(LIB_PATHS_FLAGS) $(LIB_SHARED) $(SYSTEMLIBS) - --include $(DEPFILES) - -.PHONY: clean cleanDebug cleanRelease CleanAndroid -clean: - rm -rf $(OBJ_OUTPUT) - rm -f $(TARGET) - rm -r bin/libs - -$(CLEANTARGET): - rm -rf $(OBJ_OUTPUT) - rm -f $(TARGET) - rm -rf bin/libs - -CleanAndroid: - rm -Rf obj - rm -f libs/armeabi-v7a/libOFAndroidApp.so - rm -f libs/armeabi/libOFAndroidApp.so - rm -f obj/$(APPNAME) - - -afterDebugAndroid:$(TARGET) - @if [ -d libs/armeabi-v7a ]; then rm -r libs/armeabi-v7a; fi - - @cp $(NDK_ROOT)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver libs/armeabi - - #create gdb.setup for armeabi - @echo "set solib-search-path $(PWD)/obj/local/armeabi:$(PWD)/libs/armeabi" > libs/armeabi/gdb.setup - @echo "directory $(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" >> libs/armeabi/gdb.setup - @echo "directory $(PWD)/src" >> libs/armeabi/gdb.setup - @echo "directory $(NDK_ROOT)/sources/cxx-stl/system" >> libs/armeabi/gdb.setup - @echo "directory $(PWD)/libs/armeabi" >> libs/armeabi/gdb.setup - @echo "" >> libs/armeabi/gdb.setup - - @if [ ! -d jni ]; then mkdir jni; fi - @echo "APP_ABI := armeabi" > jni/Application.mk - @echo "#LOCAL_MODULE := OFAndroidApp" > jni/Android.mk - -afterReleaseAndroid:$(TARGET) - @if [ -f obj/$(BIN_NAME) ]; then rm obj/$(BIN_NAME); fi - - @cp $(OF_ROOT)/libs/openFrameworksCompiled/project/android/libneondetection.so libs/armeabi-v7a/ - @cp $(NDK_ROOT)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver libs/armeabi-v7a - - #create gdb.setup for armeabi-v7a - @echo "set solib-search-path $(PWD)/obj/local/armeabi-v7a:$(PWD)/libs/armeabi-v7a" > libs/armeabi-v7a/gdb.setup - @echo "directory $(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" >> libs/armeabi-v7a/gdb.setup - @echo "directory $(PWD)/src" >> libs/armeabi-v7a/gdb.setup - @echo "directory $(NDK_ROOT)/sources/cxx-stl/system" >> libs/armeabi-v7a/gdb.setup - @echo "directory $(PWD)/libs/armeabi-v7a" >> libs/armeabi-v7a/gdb.setup - @echo "" >> libs/armeabi-v7a/gdb.setup - - @if [ ! -d jni ]; then mkdir jni; fi - @echo "APP_ABI := armeabi armeabi-v7a" > jni/Application.mk - @echo "#LOCAL_MODULE := OFAndroidApp" > jni/Android.mk - -RESNAME=$(shell echo $(APPNAME)Resources | tr '[A-Z]' '[a-z]') - -AndroidInstall: - if [ -d "bin/data" ]; then \ - mkdir -p res/raw; \ - rm res/raw/$(RESNAME).zip; \ - cd bin/data; \ - zip -r ../../res/raw/$(RESNAME).zip *; \ - cd ../..; \ - fi - if [ -f obj/$(BIN_NAME) ]; then rm obj/$(BIN_NAME); fi - #touch AndroidManifest.xml - $(SDK_ROOT)/tools/android update project --target $(NDK_PLATFORM) --path $(PROJECT_PATH) - if [ -d bin/classes ]; then rm -r bin/classes; fi - if [ -d bin/classes.dex ]; then rm bin/classes.dex; fi - if [ -d bin/OFActivity.ap_ ]; then rm bin/OFActivity.ap_; fi - if [ -d bin/OFActivity-debug.apk ]; then rm bin/OFActivity-debug.apk; fi - if [ -d bin/OFActivity-debug-unaligned.apk ]; then rm bin/OFActivity-debug-unaligned.apk; fi - if [ -d bin/$(APPNAME).apk ]; then rm bin/$(APPNAME).apk; fi - ant debug - cp bin/OFActivity-debug.apk bin/$(APPNAME).apk - #if [ "$(shell $(SDK_ROOT)/platform-tools/adb get-state)" = "device" ]; then - $(SDK_ROOT)/platform-tools/adb install -r bin/$(APPNAME).apk; - #fi - $(SDK_ROOT)/platform-tools/adb shell am start -a android.intent.action.MAIN -n cc.openframeworks.$(APPNAME)/cc.openframeworks.$(APPNAME).OFActivity - - -after:$(TARGET) - cp -r $(OF_ROOT)/export/$(LIBSPATH)/libs bin/ - @echo - @echo " compiling done" - @echo " to launch the application" - @echo - @echo " cd bin" - @echo " ./$(BIN_NAME)" - @echo - - -.PHONY: help -help: - @echo - @echo openFrameworks universal makefile - @echo - @echo targets: - @echo "make Debug: builds the application with debug symbols" - @echo "make Release: builds the app 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 - @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 diff --git a/examples/android/androidOpenCVExample/config.make b/examples/android/androidOpenCVExample/config.make deleted file mode 100644 index 8266e5d914e..00000000000 --- a/examples/android/androidOpenCVExample/config.make +++ /dev/null @@ -1,32 +0,0 @@ -# add custom variables to this file - -# OF_ROOT allows to move projects outside apps/* just set this variable to the -# absoulte path to the OF root folder - -OF_ROOT = ../../.. - - -# USER_CFLAGS allows to pass custom flags to the compiler -# for example search paths like: -# USER_CFLAGS = -I src/objects - -USER_CFLAGS = - - -# USER_LDFLAGS allows to pass custom flags to the linker -# for example libraries like: -# USER_LD_FLAGS = libs/libawesomelib.a - -USER_LDFLAGS = - -# android specific, in case you want to use different optimizations -USER_LIBS_ARM = -USER_LIBS_ARM7 = -USER_LIBS_NEON = - -# android optimizations - -ANDROID_COMPILER_OPTIMIZATION = -Os - - -EXCLUDE_FROM_SOURCE="bin,.xcodeproj,obj" diff --git a/examples/android/androidPolygonExample/Makefile b/examples/android/androidPolygonExample/Makefile deleted file mode 100644 index f61fe5d517a..00000000000 --- a/examples/android/androidPolygonExample/Makefile +++ /dev/null @@ -1,475 +0,0 @@ -# openFrameworks universal makefile -# -# make help : shows this message -# make Debug: makes the application with debug symbols -# make Release: makes the app with optimizations -# make: the same as make Release -# make CleanDebug: cleans the Debug target -# make CleanRelease: cleans the Release target -# make clean: cleans everything -# -# -# this should work with any OF app, just copy any example -# change the name of the folder and it should compile -# only .cpp support, don't use .c files -# it will look for files in any folder inside the application -# folder except that in the EXCLUDE_FROM_SOURCE variable -# it doesn't autodetect include paths yet -# add the include paths in the USER_CFLAGS variable -# using the gcc syntax: -Ipath -# -# to add addons to your application, edit the addons.make file -# in this directory and add the names of the addons you want to -# include -# -# edit the following vars to customize the makefile - -include config.make - -ifeq ($(findstring Android,$(MAKECMDGOALS)),Android) - include $(OF_ROOT)/libs/openFrameworksCompiled/project/android/paths.make - ARCH = android - ifeq ($(shell uname),Darwin) - HOST_PLATFORM = darwin-x86 - else - HOST_PLATFORM = linux-x86 - endif -endif - -ifeq ($(ARCH),android) - COMPILER_OPTIMIZATION = $(ANDROID_COMPILER_OPTIMIZATION) - NDK_PLATFORM = android-8 -else - COMPILER_OPTIMIZATION = $(USER_COMPILER_OPTIMIZATION) -endif - - - - -# you shouldn't modify anything below this line - - -SHELL = /bin/sh -ifneq ($(ARCH),android) - CXX = g++ - ARCH = $(shell uname -m) - ifeq ($(ARCH),x86_64) - LIBSPATH=linux64 - else - LIBSPATH=linux - endif -else - ifeq ($(findstring Release_arm7,$(MAKECMDGOALS)),Release_arm7) - LIBSPATH =android/armeabi-v7a - else - LIBSPATH =android/armeabi - endif - #NDK_ROOT = $(shell cat $(OF_ROOT)/libs/openFrameworksCompiled/project/android/ndk_path.make) - #SDK_ROOT = $(shell cat $(OF_ROOT)/libs/openFrameworksCompiled/project/android/sdk_path.make) - TOOLCHAIN=arm-linux-androideabi-4.4.3 - TOOLCHAIN_PATH=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/ - ANDROID_PREFIX=arm-linux-androideabi- - CC=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)gcc - CXX=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)g++ - AR=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)ar - SYSROOT=$(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/ - CFLAGS += -nostdlib --sysroot=$(SYSROOT) -fno-short-enums - CFLAGS += -I"$(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" -I"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/include/" -I"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include" - CFLAGS += -DANDROID -endif - -NODEPS = clean -SED_EXCLUDE_FROM_SRC = $(shell echo $(EXCLUDE_FROM_SOURCE) | sed s/\,/\\\\\|/g) -SOURCE_DIRS = $(shell find . -maxdepth 1 -mindepth 1 -type d | grep -v $(SED_EXCLUDE_FROM_SRC) | sed s/.\\///) -SOURCES = $(shell find $(SOURCE_DIRS) -name "*.cpp" -or -name "*.c" -or -name "*.cc") -OBJFILES = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(patsubst %.cc,%.o,$(SOURCES)))) - -ifneq (,$(USER_SOURCE_DIR)) - USER_SOURCES = $(shell find $(USER_SOURCE_DIR) -name "*.cpp" -or -name "*.c" -or -name "*.cc") - USER_OBJFILES = $(subst $(USER_SOURCE_DIR)/, ,$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(patsubst %.cc,%.o,$(USER_SOURCES))))) -endif - -APPNAME = $(shell basename `pwd`) -CORE_INCLUDES = $(shell find $(OF_ROOT)/libs/openFrameworks/ -type d) -CORE_INCLUDE_FLAGS = $(addprefix -I,$(CORE_INCLUDES)) -INCLUDES = $(shell find $(OF_ROOT)/libs/*/include -type d | grep -v glu | grep -v quicktime | grep -v poco) -INCLUDES_FLAGS = $(addprefix -I,$(INCLUDES)) -INCLUDES_FLAGS += -I$(OF_ROOT)/libs/poco/include -ifeq ($(ARCH),android) - INCLUDES_FLAGS += -I$(OF_ROOT)/libs/glu/include_android -else - INCLUDES_FLAGS += -I$(OF_ROOT)/libs/glu/include - INCLUDES_FLAGS += $(shell pkg-config glew gstreamer-0.10 gstreamer-video-0.10 gstreamer-base-0.10 libudev --cflags) - #check if gtk exists and add it - GTK = $(shell pkg-config gtk+-2.0 --exists; echo $$?) - ifeq ($(GTK),0) - CFLAGS += $(shell pkg-config gtk+-2.0 --cflags) -DOF_USING_GTK - SYSTEMLIBS += $(shell pkg-config gtk+-2.0 --libs) - endif - - #check if mpg123 exists and add it - MPG123 = $(shell pkg-config libmpg123 --exists; echo $$?) - ifeq ($(MPG123),0) - CFLAGS += -DOF_USING_MPG123 - SYSTEMLIBS += -lmpg123 - endif -endif -LIB_STATIC = $(shell ls $(OF_ROOT)/libs/*/lib/$(LIBSPATH)/*.a 2> /dev/null | grep -v openFrameworksCompiled | grep -v Poco) -LIB_SHARED = $(shell ls $(OF_ROOT)/libs/*/lib/$(LIBSPATH)/*.so 2> /dev/null | grep -v openFrameworksCompiled | sed "s/.*\\/lib\([^/]*\)\.so/-l\1/") -LIB_STATIC += $(OF_ROOT)/libs/poco/lib/$(LIBSPATH)/libPocoNet.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoXML.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoUtil.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoFoundation.a -LIB_PATHS_FLAGS = $(shell ls -d $(OF_ROOT)/libs/*/lib/$(LIBSPATH) | sed "s/\(\.*\)/-L\1/") - -CFLAGS += -Wall -fexceptions -CFLAGS += -I. -CFLAGS += $(INCLUDES_FLAGS) -CFLAGS += $(CORE_INCLUDE_FLAGS) - - - -ifeq ($(ARCH),android) - LDFLAGS = --sysroot=$(SYSROOT) -nostdlib -L"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi" - SYSTEMLIBS += -lstdc++ -lsupc++ -lgcc -lz -lGLESv1_CM -llog -ldl -lm -lc -else - LDFLAGS = -Wl,-rpath=./libs - SYSTEMLIBS += $(shell pkg-config jack glew gstreamer-0.10 gstreamer-video-0.10 gstreamer-base-0.10 gstreamer-app-0.10 libudev --libs) - SYSTEMLIBS += -lglut -lGL -lasound -lopenal -lsndfile -lvorbis -lFLAC -logg -lfreeimage -endif - - -ifeq ($(findstring addons.make,$(wildcard *.make)),addons.make) - ifneq ($(ARCH),android) - ADDONS = $(shell cat addons.make | grep -v ofxAndroid) - else - ADDONS = $(shell cat addons.make) - endif - - ifneq ($(strip $(ADDONS)),) - ADDONS_REL_DIRS = $(addsuffix /src, $(ADDONS)) - ADDONS_LIBS_REL_DIRS = $(addsuffix /libs, $(ADDONS)) - ADDONS_DIRS = $(addprefix $(OF_ROOT)/addons/, $(ADDONS_REL_DIRS) ) - ADDONS_LIBS_DIRS = $(addprefix $(OF_ROOT)/addons/, $(ADDONS_LIBS_REL_DIRS) ) - ADDONS_BIN_LIBS_DIRS = $(addsuffix /*/lib/$(LIBSPATH), $(ADDONS_LIBS_DIRS) ) - - ADDONS_INCLUDES = $(ADDONS_DIRS) - ADDONS_INCLUDES = $(ADDONS_LIBS_DIRS) - ADDONS_INCLUDES += $(shell find $(ADDONS_DIRS) -type d 2> /dev/null) - ADDONS_INCLUDES += $(shell find $(ADDONS_LIBS_DIRS) -type d 2> /dev/null) - ADDONSCFLAGS = $(addprefix -I,$(ADDONS_INCLUDES)) - - ifeq ($(findstring libsorder.make,$(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null)),libsorder.make) - ADDONS_LIBS_W_ORDER = $(shell cat $(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null)) - EXCLUDE_LIBS_FILTER = $(addprefix %,$(addsuffix .a,$(ADDONS_LIBS_W_ORDER))) - ADDONS_LIBS_STATICS = $(filter-out $(EXCLUDE_LIBS_FILTER), $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.a)) - ADDONS_LIBS_STATICS += $(addprefix -l, $(ADDONS_LIBS_W_ORDER)) - ADDONS_LIBS_STATICS += $(addprefix -L, $(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null | sed s/libsorder.make//g)) - else - ADDONS_LIBS_STATICS = $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.a 2> /dev/null) - endif - - ADDONS_LIBS_SHARED = $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.so 2> /dev/null) - ADDONSLIBS = $(ADDONS_LIBS_STATICS) - ADDONSLIBS += $(ADDONS_LIBS_SHARED) - - - ADDONS_SOURCES = $(shell find $(ADDONS_DIRS) -name "*.cpp" -or -name "*.c" 2> /dev/null) - ADDONS_SOURCES += $(shell find $(ADDONS_LIBS_DIRS) -name "*.cpp" -or -name "*.c" -or -name "*.cc" 2>/dev/null) - ADDONS_OBJFILES = $(subst $(OF_ROOT)/, ,$(patsubst %.cc,%.o,$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(ADDONS_SOURCES))))) - endif -endif - - -ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) - TARGET_CFLAGS = -g - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworksDebug.a - TARGET_NAME = Debug -endif - -ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) - TARGET_CFLAGS = $(COMPILER_OPTIMIZATION) - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworks.a - TARGET_NAME = Release -endif - -ifeq ($(ARCH),android) - ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) - TARGET = libs/armeabi/libOFAndroidApp.so - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworksDebug.a - LDFLAGS += -Wl,--fix-cortex-a8 -shared - USER_LIBS = $(USER_LIBS_ARM) - endif - - ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) - TARGET = libs/armeabi/libOFAndroidApp.so - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks.a - LDFLAGS += -Wl,--fix-cortex-a8 -shared - USER_LIBS = $(USER_LIBS_ARM) - endif - - ifeq ($(findstring Release_arm7,$(MAKECMDGOALS)),Release_arm7) - TARGET_NAME = Release_arm7 - TARGET_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mthumb - TARGET = libs/armeabi-v7a/libOFAndroidApp.so - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks_arm7.a - USER_LIBS = $(USER_LIBS_ARM7) - endif - - ifeq ($(findstring Release_neon,$(MAKECMDGOALS)),Release_neon) - TARGET_NAME = Release_neon - TARGET_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mfpu=neon - TARGET = libs/armeabi-v7a/libOFAndroidApp_neon.so - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks_neon.a - USER_LIBS = $(USER_LIBS_NEON) - endif - - ifeq ($(findstring TestLink,$(MAKECMDGOALS)),TestLink) - TARGET_NAME = Debug - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworksDebug.a - LDFLAGS += -Wl,--entry=main,--fix-cortex-a8 - BIN_NAME = $(APPNAME) - TARGET = obj/$(BIN_NAME) - USER_LIBS = $(USER_LIBS_ARM) - endif -else - ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) - BIN_NAME = $(APPNAME)_debug - TARGET = bin/$(BIN_NAME) - endif - - ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) - BIN_NAME = $(APPNAME) - TARGET = bin/$(BIN_NAME) - endif - - ifeq ($(MAKECMDGOALS),) - TARGET_NAME = Release - BIN_NAME = $(APPNAME) - TARGET = bin/$(BIN_NAME) - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworks.a - endif -endif - -ifeq ($(MAKECMDGOALS),clean) - TARGET = bin/$(APPNAME)_debug bin/$(APPNAME) - TARGET_NAME = Release -endif - -ifeq ($(MAKECMDGOALS),AndroidInstall) - TARGET_NAME = Install -endif - -OBJ_OUTPUT = obj/$(ARCH)$(TARGET_NAME)/ -CLEANTARGET = clean$(TARGET_NAME) - -OBJS = $(addprefix $(OBJ_OUTPUT), $(OBJFILES)) -DEPFILES = $(patsubst %.o,%.d,$(OBJS)) - -USER_OBJS = $(addprefix $(OBJ_OUTPUT), $(USER_OBJFILES)) -DEPFILES += $(patsubst %.o,%.d,$(USER_OBJS)) - -ifeq ($(findstring addons.make,$(wildcard *.make)),addons.make) - ADDONS_OBJS = $(addprefix $(OBJ_OUTPUT), $(ADDONS_OBJFILES)) - DEPFILES += $(patsubst %.o,%.d,$(ADDONS_OBJS)) -endif - -.PHONY: Debug Release all after afterDebugAndroid afterReleaseAndroid - -Release: $(TARGET) after - -Debug: $(TARGET) after - -all: - $(MAKE) Release - -DebugAndroid: $(TARGET) - -ReleaseAndroid: $(TARGET) - -Release_arm7Android: $(TARGET) - -Release_neonAndroid: $(TARGET) afterReleaseAndroid - -TestLinkAndroid: $(TARGET) afterDebugAndroid - -AndroidDebug: - $(MAKE) DebugAndroid - $(MAKE) TestLinkAndroid - -AndroidRelease: - $(MAKE) ReleaseAndroid - $(MAKE) Release_arm7Android - $(MAKE) Release_neonAndroid - - -#This rule does the compilation -#$(OBJS): $(SOURCES) -$(OBJ_OUTPUT)%.o: %.cpp - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CXX) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: %.c - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CC) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: %.cc - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CC) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.cpp - @echo "compiling addon object for" $< - mkdir -p $(@D) - $(CXX) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< - -$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.c - @echo "compiling addon object for" $< - mkdir -p $(@D) - $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< - -$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.cc - @echo "compiling addon object for" $< - mkdir -p $(@D) - $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< - -$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.c - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.cc - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.cpp - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CXX) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(TARGET): $(OBJS) $(ADDONS_OBJS) $(USER_OBJS) $(TARGET_LIBS) $(LIB_STATIC) - @echo 'linking $(TARGET)' - mkdir -p $(@D) - $(CXX) -o $@ $(OBJS) $(ADDONS_OBJS) $(USER_OBJS) $(LDFLAGS) $(USER_LDFLAGS) $(TARGET_LIBS) $(ADDONSLIBS) $(USER_LIBS) $(LIB_STATIC) $(LIB_PATHS_FLAGS) $(LIB_SHARED) $(SYSTEMLIBS) - --include $(DEPFILES) - -.PHONY: clean cleanDebug cleanRelease CleanAndroid -clean: - rm -rf $(OBJ_OUTPUT) - rm -f $(TARGET) - rm -r bin/libs - -$(CLEANTARGET): - rm -rf $(OBJ_OUTPUT) - rm -f $(TARGET) - rm -rf bin/libs - -CleanAndroid: - rm -Rf obj - rm -f libs/armeabi-v7a/libOFAndroidApp.so - rm -f libs/armeabi/libOFAndroidApp.so - rm -f obj/$(APPNAME) - - -afterDebugAndroid:$(TARGET) - @if [ -d libs/armeabi-v7a ]; then rm -r libs/armeabi-v7a; fi - - @cp $(NDK_ROOT)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver libs/armeabi - - #create gdb.setup for armeabi - @echo "set solib-search-path $(PWD)/obj/local/armeabi:$(PWD)/libs/armeabi" > libs/armeabi/gdb.setup - @echo "directory $(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" >> libs/armeabi/gdb.setup - @echo "directory $(PWD)/src" >> libs/armeabi/gdb.setup - @echo "directory $(NDK_ROOT)/sources/cxx-stl/system" >> libs/armeabi/gdb.setup - @echo "directory $(PWD)/libs/armeabi" >> libs/armeabi/gdb.setup - @echo "" >> libs/armeabi/gdb.setup - - @if [ ! -d jni ]; then mkdir jni; fi - @echo "APP_ABI := armeabi" > jni/Application.mk - @echo "#LOCAL_MODULE := OFAndroidApp" > jni/Android.mk - -afterReleaseAndroid:$(TARGET) - @if [ -f obj/$(BIN_NAME) ]; then rm obj/$(BIN_NAME); fi - - @cp $(OF_ROOT)/libs/openFrameworksCompiled/project/android/libneondetection.so libs/armeabi-v7a/ - @cp $(NDK_ROOT)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver libs/armeabi-v7a - - #create gdb.setup for armeabi-v7a - @echo "set solib-search-path $(PWD)/obj/local/armeabi-v7a:$(PWD)/libs/armeabi-v7a" > libs/armeabi-v7a/gdb.setup - @echo "directory $(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" >> libs/armeabi-v7a/gdb.setup - @echo "directory $(PWD)/src" >> libs/armeabi-v7a/gdb.setup - @echo "directory $(NDK_ROOT)/sources/cxx-stl/system" >> libs/armeabi-v7a/gdb.setup - @echo "directory $(PWD)/libs/armeabi-v7a" >> libs/armeabi-v7a/gdb.setup - @echo "" >> libs/armeabi-v7a/gdb.setup - - @if [ ! -d jni ]; then mkdir jni; fi - @echo "APP_ABI := armeabi armeabi-v7a" > jni/Application.mk - @echo "#LOCAL_MODULE := OFAndroidApp" > jni/Android.mk - -RESNAME=$(shell echo $(APPNAME)Resources | tr '[A-Z]' '[a-z]') - -AndroidInstall: - if [ -d "bin/data" ]; then \ - mkdir -p res/raw; \ - rm res/raw/$(RESNAME).zip; \ - cd bin/data; \ - zip -r ../../res/raw/$(RESNAME).zip *; \ - cd ../..; \ - fi - if [ -f obj/$(BIN_NAME) ]; then rm obj/$(BIN_NAME); fi - #touch AndroidManifest.xml - $(SDK_ROOT)/tools/android update project --target $(NDK_PLATFORM) --path $(PROJECT_PATH) - if [ -d bin/classes ]; then rm -r bin/classes; fi - if [ -d bin/classes.dex ]; then rm bin/classes.dex; fi - if [ -d bin/OFActivity.ap_ ]; then rm bin/OFActivity.ap_; fi - if [ -d bin/OFActivity-debug.apk ]; then rm bin/OFActivity-debug.apk; fi - if [ -d bin/OFActivity-debug-unaligned.apk ]; then rm bin/OFActivity-debug-unaligned.apk; fi - if [ -d bin/$(APPNAME).apk ]; then rm bin/$(APPNAME).apk; fi - ant debug - cp bin/OFActivity-debug.apk bin/$(APPNAME).apk - #if [ "$(shell $(SDK_ROOT)/platform-tools/adb get-state)" = "device" ]; then - $(SDK_ROOT)/platform-tools/adb install -r bin/$(APPNAME).apk; - #fi - $(SDK_ROOT)/platform-tools/adb shell am start -a android.intent.action.MAIN -n cc.openframeworks.$(APPNAME)/cc.openframeworks.$(APPNAME).OFActivity - - -after:$(TARGET) - cp -r $(OF_ROOT)/export/$(LIBSPATH)/libs bin/ - @echo - @echo " compiling done" - @echo " to launch the application" - @echo - @echo " cd bin" - @echo " ./$(BIN_NAME)" - @echo - - -.PHONY: help -help: - @echo - @echo openFrameworks universal makefile - @echo - @echo targets: - @echo "make Debug: builds the application with debug symbols" - @echo "make Release: builds the app 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 - @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 diff --git a/examples/android/androidPolygonExample/config.make b/examples/android/androidPolygonExample/config.make deleted file mode 100644 index 8266e5d914e..00000000000 --- a/examples/android/androidPolygonExample/config.make +++ /dev/null @@ -1,32 +0,0 @@ -# add custom variables to this file - -# OF_ROOT allows to move projects outside apps/* just set this variable to the -# absoulte path to the OF root folder - -OF_ROOT = ../../.. - - -# USER_CFLAGS allows to pass custom flags to the compiler -# for example search paths like: -# USER_CFLAGS = -I src/objects - -USER_CFLAGS = - - -# USER_LDFLAGS allows to pass custom flags to the linker -# for example libraries like: -# USER_LD_FLAGS = libs/libawesomelib.a - -USER_LDFLAGS = - -# android specific, in case you want to use different optimizations -USER_LIBS_ARM = -USER_LIBS_ARM7 = -USER_LIBS_NEON = - -# android optimizations - -ANDROID_COMPILER_OPTIMIZATION = -Os - - -EXCLUDE_FROM_SOURCE="bin,.xcodeproj,obj" diff --git a/examples/android/androidSoundPlayerExample/Makefile b/examples/android/androidSoundPlayerExample/Makefile deleted file mode 100644 index f61fe5d517a..00000000000 --- a/examples/android/androidSoundPlayerExample/Makefile +++ /dev/null @@ -1,475 +0,0 @@ -# openFrameworks universal makefile -# -# make help : shows this message -# make Debug: makes the application with debug symbols -# make Release: makes the app with optimizations -# make: the same as make Release -# make CleanDebug: cleans the Debug target -# make CleanRelease: cleans the Release target -# make clean: cleans everything -# -# -# this should work with any OF app, just copy any example -# change the name of the folder and it should compile -# only .cpp support, don't use .c files -# it will look for files in any folder inside the application -# folder except that in the EXCLUDE_FROM_SOURCE variable -# it doesn't autodetect include paths yet -# add the include paths in the USER_CFLAGS variable -# using the gcc syntax: -Ipath -# -# to add addons to your application, edit the addons.make file -# in this directory and add the names of the addons you want to -# include -# -# edit the following vars to customize the makefile - -include config.make - -ifeq ($(findstring Android,$(MAKECMDGOALS)),Android) - include $(OF_ROOT)/libs/openFrameworksCompiled/project/android/paths.make - ARCH = android - ifeq ($(shell uname),Darwin) - HOST_PLATFORM = darwin-x86 - else - HOST_PLATFORM = linux-x86 - endif -endif - -ifeq ($(ARCH),android) - COMPILER_OPTIMIZATION = $(ANDROID_COMPILER_OPTIMIZATION) - NDK_PLATFORM = android-8 -else - COMPILER_OPTIMIZATION = $(USER_COMPILER_OPTIMIZATION) -endif - - - - -# you shouldn't modify anything below this line - - -SHELL = /bin/sh -ifneq ($(ARCH),android) - CXX = g++ - ARCH = $(shell uname -m) - ifeq ($(ARCH),x86_64) - LIBSPATH=linux64 - else - LIBSPATH=linux - endif -else - ifeq ($(findstring Release_arm7,$(MAKECMDGOALS)),Release_arm7) - LIBSPATH =android/armeabi-v7a - else - LIBSPATH =android/armeabi - endif - #NDK_ROOT = $(shell cat $(OF_ROOT)/libs/openFrameworksCompiled/project/android/ndk_path.make) - #SDK_ROOT = $(shell cat $(OF_ROOT)/libs/openFrameworksCompiled/project/android/sdk_path.make) - TOOLCHAIN=arm-linux-androideabi-4.4.3 - TOOLCHAIN_PATH=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/ - ANDROID_PREFIX=arm-linux-androideabi- - CC=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)gcc - CXX=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)g++ - AR=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)ar - SYSROOT=$(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/ - CFLAGS += -nostdlib --sysroot=$(SYSROOT) -fno-short-enums - CFLAGS += -I"$(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" -I"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/include/" -I"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include" - CFLAGS += -DANDROID -endif - -NODEPS = clean -SED_EXCLUDE_FROM_SRC = $(shell echo $(EXCLUDE_FROM_SOURCE) | sed s/\,/\\\\\|/g) -SOURCE_DIRS = $(shell find . -maxdepth 1 -mindepth 1 -type d | grep -v $(SED_EXCLUDE_FROM_SRC) | sed s/.\\///) -SOURCES = $(shell find $(SOURCE_DIRS) -name "*.cpp" -or -name "*.c" -or -name "*.cc") -OBJFILES = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(patsubst %.cc,%.o,$(SOURCES)))) - -ifneq (,$(USER_SOURCE_DIR)) - USER_SOURCES = $(shell find $(USER_SOURCE_DIR) -name "*.cpp" -or -name "*.c" -or -name "*.cc") - USER_OBJFILES = $(subst $(USER_SOURCE_DIR)/, ,$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(patsubst %.cc,%.o,$(USER_SOURCES))))) -endif - -APPNAME = $(shell basename `pwd`) -CORE_INCLUDES = $(shell find $(OF_ROOT)/libs/openFrameworks/ -type d) -CORE_INCLUDE_FLAGS = $(addprefix -I,$(CORE_INCLUDES)) -INCLUDES = $(shell find $(OF_ROOT)/libs/*/include -type d | grep -v glu | grep -v quicktime | grep -v poco) -INCLUDES_FLAGS = $(addprefix -I,$(INCLUDES)) -INCLUDES_FLAGS += -I$(OF_ROOT)/libs/poco/include -ifeq ($(ARCH),android) - INCLUDES_FLAGS += -I$(OF_ROOT)/libs/glu/include_android -else - INCLUDES_FLAGS += -I$(OF_ROOT)/libs/glu/include - INCLUDES_FLAGS += $(shell pkg-config glew gstreamer-0.10 gstreamer-video-0.10 gstreamer-base-0.10 libudev --cflags) - #check if gtk exists and add it - GTK = $(shell pkg-config gtk+-2.0 --exists; echo $$?) - ifeq ($(GTK),0) - CFLAGS += $(shell pkg-config gtk+-2.0 --cflags) -DOF_USING_GTK - SYSTEMLIBS += $(shell pkg-config gtk+-2.0 --libs) - endif - - #check if mpg123 exists and add it - MPG123 = $(shell pkg-config libmpg123 --exists; echo $$?) - ifeq ($(MPG123),0) - CFLAGS += -DOF_USING_MPG123 - SYSTEMLIBS += -lmpg123 - endif -endif -LIB_STATIC = $(shell ls $(OF_ROOT)/libs/*/lib/$(LIBSPATH)/*.a 2> /dev/null | grep -v openFrameworksCompiled | grep -v Poco) -LIB_SHARED = $(shell ls $(OF_ROOT)/libs/*/lib/$(LIBSPATH)/*.so 2> /dev/null | grep -v openFrameworksCompiled | sed "s/.*\\/lib\([^/]*\)\.so/-l\1/") -LIB_STATIC += $(OF_ROOT)/libs/poco/lib/$(LIBSPATH)/libPocoNet.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoXML.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoUtil.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoFoundation.a -LIB_PATHS_FLAGS = $(shell ls -d $(OF_ROOT)/libs/*/lib/$(LIBSPATH) | sed "s/\(\.*\)/-L\1/") - -CFLAGS += -Wall -fexceptions -CFLAGS += -I. -CFLAGS += $(INCLUDES_FLAGS) -CFLAGS += $(CORE_INCLUDE_FLAGS) - - - -ifeq ($(ARCH),android) - LDFLAGS = --sysroot=$(SYSROOT) -nostdlib -L"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi" - SYSTEMLIBS += -lstdc++ -lsupc++ -lgcc -lz -lGLESv1_CM -llog -ldl -lm -lc -else - LDFLAGS = -Wl,-rpath=./libs - SYSTEMLIBS += $(shell pkg-config jack glew gstreamer-0.10 gstreamer-video-0.10 gstreamer-base-0.10 gstreamer-app-0.10 libudev --libs) - SYSTEMLIBS += -lglut -lGL -lasound -lopenal -lsndfile -lvorbis -lFLAC -logg -lfreeimage -endif - - -ifeq ($(findstring addons.make,$(wildcard *.make)),addons.make) - ifneq ($(ARCH),android) - ADDONS = $(shell cat addons.make | grep -v ofxAndroid) - else - ADDONS = $(shell cat addons.make) - endif - - ifneq ($(strip $(ADDONS)),) - ADDONS_REL_DIRS = $(addsuffix /src, $(ADDONS)) - ADDONS_LIBS_REL_DIRS = $(addsuffix /libs, $(ADDONS)) - ADDONS_DIRS = $(addprefix $(OF_ROOT)/addons/, $(ADDONS_REL_DIRS) ) - ADDONS_LIBS_DIRS = $(addprefix $(OF_ROOT)/addons/, $(ADDONS_LIBS_REL_DIRS) ) - ADDONS_BIN_LIBS_DIRS = $(addsuffix /*/lib/$(LIBSPATH), $(ADDONS_LIBS_DIRS) ) - - ADDONS_INCLUDES = $(ADDONS_DIRS) - ADDONS_INCLUDES = $(ADDONS_LIBS_DIRS) - ADDONS_INCLUDES += $(shell find $(ADDONS_DIRS) -type d 2> /dev/null) - ADDONS_INCLUDES += $(shell find $(ADDONS_LIBS_DIRS) -type d 2> /dev/null) - ADDONSCFLAGS = $(addprefix -I,$(ADDONS_INCLUDES)) - - ifeq ($(findstring libsorder.make,$(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null)),libsorder.make) - ADDONS_LIBS_W_ORDER = $(shell cat $(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null)) - EXCLUDE_LIBS_FILTER = $(addprefix %,$(addsuffix .a,$(ADDONS_LIBS_W_ORDER))) - ADDONS_LIBS_STATICS = $(filter-out $(EXCLUDE_LIBS_FILTER), $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.a)) - ADDONS_LIBS_STATICS += $(addprefix -l, $(ADDONS_LIBS_W_ORDER)) - ADDONS_LIBS_STATICS += $(addprefix -L, $(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null | sed s/libsorder.make//g)) - else - ADDONS_LIBS_STATICS = $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.a 2> /dev/null) - endif - - ADDONS_LIBS_SHARED = $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.so 2> /dev/null) - ADDONSLIBS = $(ADDONS_LIBS_STATICS) - ADDONSLIBS += $(ADDONS_LIBS_SHARED) - - - ADDONS_SOURCES = $(shell find $(ADDONS_DIRS) -name "*.cpp" -or -name "*.c" 2> /dev/null) - ADDONS_SOURCES += $(shell find $(ADDONS_LIBS_DIRS) -name "*.cpp" -or -name "*.c" -or -name "*.cc" 2>/dev/null) - ADDONS_OBJFILES = $(subst $(OF_ROOT)/, ,$(patsubst %.cc,%.o,$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(ADDONS_SOURCES))))) - endif -endif - - -ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) - TARGET_CFLAGS = -g - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworksDebug.a - TARGET_NAME = Debug -endif - -ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) - TARGET_CFLAGS = $(COMPILER_OPTIMIZATION) - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworks.a - TARGET_NAME = Release -endif - -ifeq ($(ARCH),android) - ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) - TARGET = libs/armeabi/libOFAndroidApp.so - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworksDebug.a - LDFLAGS += -Wl,--fix-cortex-a8 -shared - USER_LIBS = $(USER_LIBS_ARM) - endif - - ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) - TARGET = libs/armeabi/libOFAndroidApp.so - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks.a - LDFLAGS += -Wl,--fix-cortex-a8 -shared - USER_LIBS = $(USER_LIBS_ARM) - endif - - ifeq ($(findstring Release_arm7,$(MAKECMDGOALS)),Release_arm7) - TARGET_NAME = Release_arm7 - TARGET_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mthumb - TARGET = libs/armeabi-v7a/libOFAndroidApp.so - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks_arm7.a - USER_LIBS = $(USER_LIBS_ARM7) - endif - - ifeq ($(findstring Release_neon,$(MAKECMDGOALS)),Release_neon) - TARGET_NAME = Release_neon - TARGET_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mfpu=neon - TARGET = libs/armeabi-v7a/libOFAndroidApp_neon.so - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks_neon.a - USER_LIBS = $(USER_LIBS_NEON) - endif - - ifeq ($(findstring TestLink,$(MAKECMDGOALS)),TestLink) - TARGET_NAME = Debug - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworksDebug.a - LDFLAGS += -Wl,--entry=main,--fix-cortex-a8 - BIN_NAME = $(APPNAME) - TARGET = obj/$(BIN_NAME) - USER_LIBS = $(USER_LIBS_ARM) - endif -else - ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) - BIN_NAME = $(APPNAME)_debug - TARGET = bin/$(BIN_NAME) - endif - - ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) - BIN_NAME = $(APPNAME) - TARGET = bin/$(BIN_NAME) - endif - - ifeq ($(MAKECMDGOALS),) - TARGET_NAME = Release - BIN_NAME = $(APPNAME) - TARGET = bin/$(BIN_NAME) - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworks.a - endif -endif - -ifeq ($(MAKECMDGOALS),clean) - TARGET = bin/$(APPNAME)_debug bin/$(APPNAME) - TARGET_NAME = Release -endif - -ifeq ($(MAKECMDGOALS),AndroidInstall) - TARGET_NAME = Install -endif - -OBJ_OUTPUT = obj/$(ARCH)$(TARGET_NAME)/ -CLEANTARGET = clean$(TARGET_NAME) - -OBJS = $(addprefix $(OBJ_OUTPUT), $(OBJFILES)) -DEPFILES = $(patsubst %.o,%.d,$(OBJS)) - -USER_OBJS = $(addprefix $(OBJ_OUTPUT), $(USER_OBJFILES)) -DEPFILES += $(patsubst %.o,%.d,$(USER_OBJS)) - -ifeq ($(findstring addons.make,$(wildcard *.make)),addons.make) - ADDONS_OBJS = $(addprefix $(OBJ_OUTPUT), $(ADDONS_OBJFILES)) - DEPFILES += $(patsubst %.o,%.d,$(ADDONS_OBJS)) -endif - -.PHONY: Debug Release all after afterDebugAndroid afterReleaseAndroid - -Release: $(TARGET) after - -Debug: $(TARGET) after - -all: - $(MAKE) Release - -DebugAndroid: $(TARGET) - -ReleaseAndroid: $(TARGET) - -Release_arm7Android: $(TARGET) - -Release_neonAndroid: $(TARGET) afterReleaseAndroid - -TestLinkAndroid: $(TARGET) afterDebugAndroid - -AndroidDebug: - $(MAKE) DebugAndroid - $(MAKE) TestLinkAndroid - -AndroidRelease: - $(MAKE) ReleaseAndroid - $(MAKE) Release_arm7Android - $(MAKE) Release_neonAndroid - - -#This rule does the compilation -#$(OBJS): $(SOURCES) -$(OBJ_OUTPUT)%.o: %.cpp - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CXX) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: %.c - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CC) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: %.cc - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CC) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.cpp - @echo "compiling addon object for" $< - mkdir -p $(@D) - $(CXX) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< - -$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.c - @echo "compiling addon object for" $< - mkdir -p $(@D) - $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< - -$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.cc - @echo "compiling addon object for" $< - mkdir -p $(@D) - $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< - -$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.c - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.cc - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.cpp - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CXX) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(TARGET): $(OBJS) $(ADDONS_OBJS) $(USER_OBJS) $(TARGET_LIBS) $(LIB_STATIC) - @echo 'linking $(TARGET)' - mkdir -p $(@D) - $(CXX) -o $@ $(OBJS) $(ADDONS_OBJS) $(USER_OBJS) $(LDFLAGS) $(USER_LDFLAGS) $(TARGET_LIBS) $(ADDONSLIBS) $(USER_LIBS) $(LIB_STATIC) $(LIB_PATHS_FLAGS) $(LIB_SHARED) $(SYSTEMLIBS) - --include $(DEPFILES) - -.PHONY: clean cleanDebug cleanRelease CleanAndroid -clean: - rm -rf $(OBJ_OUTPUT) - rm -f $(TARGET) - rm -r bin/libs - -$(CLEANTARGET): - rm -rf $(OBJ_OUTPUT) - rm -f $(TARGET) - rm -rf bin/libs - -CleanAndroid: - rm -Rf obj - rm -f libs/armeabi-v7a/libOFAndroidApp.so - rm -f libs/armeabi/libOFAndroidApp.so - rm -f obj/$(APPNAME) - - -afterDebugAndroid:$(TARGET) - @if [ -d libs/armeabi-v7a ]; then rm -r libs/armeabi-v7a; fi - - @cp $(NDK_ROOT)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver libs/armeabi - - #create gdb.setup for armeabi - @echo "set solib-search-path $(PWD)/obj/local/armeabi:$(PWD)/libs/armeabi" > libs/armeabi/gdb.setup - @echo "directory $(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" >> libs/armeabi/gdb.setup - @echo "directory $(PWD)/src" >> libs/armeabi/gdb.setup - @echo "directory $(NDK_ROOT)/sources/cxx-stl/system" >> libs/armeabi/gdb.setup - @echo "directory $(PWD)/libs/armeabi" >> libs/armeabi/gdb.setup - @echo "" >> libs/armeabi/gdb.setup - - @if [ ! -d jni ]; then mkdir jni; fi - @echo "APP_ABI := armeabi" > jni/Application.mk - @echo "#LOCAL_MODULE := OFAndroidApp" > jni/Android.mk - -afterReleaseAndroid:$(TARGET) - @if [ -f obj/$(BIN_NAME) ]; then rm obj/$(BIN_NAME); fi - - @cp $(OF_ROOT)/libs/openFrameworksCompiled/project/android/libneondetection.so libs/armeabi-v7a/ - @cp $(NDK_ROOT)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver libs/armeabi-v7a - - #create gdb.setup for armeabi-v7a - @echo "set solib-search-path $(PWD)/obj/local/armeabi-v7a:$(PWD)/libs/armeabi-v7a" > libs/armeabi-v7a/gdb.setup - @echo "directory $(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" >> libs/armeabi-v7a/gdb.setup - @echo "directory $(PWD)/src" >> libs/armeabi-v7a/gdb.setup - @echo "directory $(NDK_ROOT)/sources/cxx-stl/system" >> libs/armeabi-v7a/gdb.setup - @echo "directory $(PWD)/libs/armeabi-v7a" >> libs/armeabi-v7a/gdb.setup - @echo "" >> libs/armeabi-v7a/gdb.setup - - @if [ ! -d jni ]; then mkdir jni; fi - @echo "APP_ABI := armeabi armeabi-v7a" > jni/Application.mk - @echo "#LOCAL_MODULE := OFAndroidApp" > jni/Android.mk - -RESNAME=$(shell echo $(APPNAME)Resources | tr '[A-Z]' '[a-z]') - -AndroidInstall: - if [ -d "bin/data" ]; then \ - mkdir -p res/raw; \ - rm res/raw/$(RESNAME).zip; \ - cd bin/data; \ - zip -r ../../res/raw/$(RESNAME).zip *; \ - cd ../..; \ - fi - if [ -f obj/$(BIN_NAME) ]; then rm obj/$(BIN_NAME); fi - #touch AndroidManifest.xml - $(SDK_ROOT)/tools/android update project --target $(NDK_PLATFORM) --path $(PROJECT_PATH) - if [ -d bin/classes ]; then rm -r bin/classes; fi - if [ -d bin/classes.dex ]; then rm bin/classes.dex; fi - if [ -d bin/OFActivity.ap_ ]; then rm bin/OFActivity.ap_; fi - if [ -d bin/OFActivity-debug.apk ]; then rm bin/OFActivity-debug.apk; fi - if [ -d bin/OFActivity-debug-unaligned.apk ]; then rm bin/OFActivity-debug-unaligned.apk; fi - if [ -d bin/$(APPNAME).apk ]; then rm bin/$(APPNAME).apk; fi - ant debug - cp bin/OFActivity-debug.apk bin/$(APPNAME).apk - #if [ "$(shell $(SDK_ROOT)/platform-tools/adb get-state)" = "device" ]; then - $(SDK_ROOT)/platform-tools/adb install -r bin/$(APPNAME).apk; - #fi - $(SDK_ROOT)/platform-tools/adb shell am start -a android.intent.action.MAIN -n cc.openframeworks.$(APPNAME)/cc.openframeworks.$(APPNAME).OFActivity - - -after:$(TARGET) - cp -r $(OF_ROOT)/export/$(LIBSPATH)/libs bin/ - @echo - @echo " compiling done" - @echo " to launch the application" - @echo - @echo " cd bin" - @echo " ./$(BIN_NAME)" - @echo - - -.PHONY: help -help: - @echo - @echo openFrameworks universal makefile - @echo - @echo targets: - @echo "make Debug: builds the application with debug symbols" - @echo "make Release: builds the app 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 - @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 diff --git a/examples/android/androidSoundPlayerExample/config.make b/examples/android/androidSoundPlayerExample/config.make deleted file mode 100644 index 8266e5d914e..00000000000 --- a/examples/android/androidSoundPlayerExample/config.make +++ /dev/null @@ -1,32 +0,0 @@ -# add custom variables to this file - -# OF_ROOT allows to move projects outside apps/* just set this variable to the -# absoulte path to the OF root folder - -OF_ROOT = ../../.. - - -# USER_CFLAGS allows to pass custom flags to the compiler -# for example search paths like: -# USER_CFLAGS = -I src/objects - -USER_CFLAGS = - - -# USER_LDFLAGS allows to pass custom flags to the linker -# for example libraries like: -# USER_LD_FLAGS = libs/libawesomelib.a - -USER_LDFLAGS = - -# android specific, in case you want to use different optimizations -USER_LIBS_ARM = -USER_LIBS_ARM7 = -USER_LIBS_NEON = - -# android optimizations - -ANDROID_COMPILER_OPTIMIZATION = -Os - - -EXCLUDE_FROM_SOURCE="bin,.xcodeproj,obj" diff --git a/examples/android/androidTouchExample/Makefile b/examples/android/androidTouchExample/Makefile deleted file mode 100644 index f61fe5d517a..00000000000 --- a/examples/android/androidTouchExample/Makefile +++ /dev/null @@ -1,475 +0,0 @@ -# openFrameworks universal makefile -# -# make help : shows this message -# make Debug: makes the application with debug symbols -# make Release: makes the app with optimizations -# make: the same as make Release -# make CleanDebug: cleans the Debug target -# make CleanRelease: cleans the Release target -# make clean: cleans everything -# -# -# this should work with any OF app, just copy any example -# change the name of the folder and it should compile -# only .cpp support, don't use .c files -# it will look for files in any folder inside the application -# folder except that in the EXCLUDE_FROM_SOURCE variable -# it doesn't autodetect include paths yet -# add the include paths in the USER_CFLAGS variable -# using the gcc syntax: -Ipath -# -# to add addons to your application, edit the addons.make file -# in this directory and add the names of the addons you want to -# include -# -# edit the following vars to customize the makefile - -include config.make - -ifeq ($(findstring Android,$(MAKECMDGOALS)),Android) - include $(OF_ROOT)/libs/openFrameworksCompiled/project/android/paths.make - ARCH = android - ifeq ($(shell uname),Darwin) - HOST_PLATFORM = darwin-x86 - else - HOST_PLATFORM = linux-x86 - endif -endif - -ifeq ($(ARCH),android) - COMPILER_OPTIMIZATION = $(ANDROID_COMPILER_OPTIMIZATION) - NDK_PLATFORM = android-8 -else - COMPILER_OPTIMIZATION = $(USER_COMPILER_OPTIMIZATION) -endif - - - - -# you shouldn't modify anything below this line - - -SHELL = /bin/sh -ifneq ($(ARCH),android) - CXX = g++ - ARCH = $(shell uname -m) - ifeq ($(ARCH),x86_64) - LIBSPATH=linux64 - else - LIBSPATH=linux - endif -else - ifeq ($(findstring Release_arm7,$(MAKECMDGOALS)),Release_arm7) - LIBSPATH =android/armeabi-v7a - else - LIBSPATH =android/armeabi - endif - #NDK_ROOT = $(shell cat $(OF_ROOT)/libs/openFrameworksCompiled/project/android/ndk_path.make) - #SDK_ROOT = $(shell cat $(OF_ROOT)/libs/openFrameworksCompiled/project/android/sdk_path.make) - TOOLCHAIN=arm-linux-androideabi-4.4.3 - TOOLCHAIN_PATH=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/ - ANDROID_PREFIX=arm-linux-androideabi- - CC=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)gcc - CXX=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)g++ - AR=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)ar - SYSROOT=$(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/ - CFLAGS += -nostdlib --sysroot=$(SYSROOT) -fno-short-enums - CFLAGS += -I"$(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" -I"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/include/" -I"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include" - CFLAGS += -DANDROID -endif - -NODEPS = clean -SED_EXCLUDE_FROM_SRC = $(shell echo $(EXCLUDE_FROM_SOURCE) | sed s/\,/\\\\\|/g) -SOURCE_DIRS = $(shell find . -maxdepth 1 -mindepth 1 -type d | grep -v $(SED_EXCLUDE_FROM_SRC) | sed s/.\\///) -SOURCES = $(shell find $(SOURCE_DIRS) -name "*.cpp" -or -name "*.c" -or -name "*.cc") -OBJFILES = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(patsubst %.cc,%.o,$(SOURCES)))) - -ifneq (,$(USER_SOURCE_DIR)) - USER_SOURCES = $(shell find $(USER_SOURCE_DIR) -name "*.cpp" -or -name "*.c" -or -name "*.cc") - USER_OBJFILES = $(subst $(USER_SOURCE_DIR)/, ,$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(patsubst %.cc,%.o,$(USER_SOURCES))))) -endif - -APPNAME = $(shell basename `pwd`) -CORE_INCLUDES = $(shell find $(OF_ROOT)/libs/openFrameworks/ -type d) -CORE_INCLUDE_FLAGS = $(addprefix -I,$(CORE_INCLUDES)) -INCLUDES = $(shell find $(OF_ROOT)/libs/*/include -type d | grep -v glu | grep -v quicktime | grep -v poco) -INCLUDES_FLAGS = $(addprefix -I,$(INCLUDES)) -INCLUDES_FLAGS += -I$(OF_ROOT)/libs/poco/include -ifeq ($(ARCH),android) - INCLUDES_FLAGS += -I$(OF_ROOT)/libs/glu/include_android -else - INCLUDES_FLAGS += -I$(OF_ROOT)/libs/glu/include - INCLUDES_FLAGS += $(shell pkg-config glew gstreamer-0.10 gstreamer-video-0.10 gstreamer-base-0.10 libudev --cflags) - #check if gtk exists and add it - GTK = $(shell pkg-config gtk+-2.0 --exists; echo $$?) - ifeq ($(GTK),0) - CFLAGS += $(shell pkg-config gtk+-2.0 --cflags) -DOF_USING_GTK - SYSTEMLIBS += $(shell pkg-config gtk+-2.0 --libs) - endif - - #check if mpg123 exists and add it - MPG123 = $(shell pkg-config libmpg123 --exists; echo $$?) - ifeq ($(MPG123),0) - CFLAGS += -DOF_USING_MPG123 - SYSTEMLIBS += -lmpg123 - endif -endif -LIB_STATIC = $(shell ls $(OF_ROOT)/libs/*/lib/$(LIBSPATH)/*.a 2> /dev/null | grep -v openFrameworksCompiled | grep -v Poco) -LIB_SHARED = $(shell ls $(OF_ROOT)/libs/*/lib/$(LIBSPATH)/*.so 2> /dev/null | grep -v openFrameworksCompiled | sed "s/.*\\/lib\([^/]*\)\.so/-l\1/") -LIB_STATIC += $(OF_ROOT)/libs/poco/lib/$(LIBSPATH)/libPocoNet.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoXML.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoUtil.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoFoundation.a -LIB_PATHS_FLAGS = $(shell ls -d $(OF_ROOT)/libs/*/lib/$(LIBSPATH) | sed "s/\(\.*\)/-L\1/") - -CFLAGS += -Wall -fexceptions -CFLAGS += -I. -CFLAGS += $(INCLUDES_FLAGS) -CFLAGS += $(CORE_INCLUDE_FLAGS) - - - -ifeq ($(ARCH),android) - LDFLAGS = --sysroot=$(SYSROOT) -nostdlib -L"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi" - SYSTEMLIBS += -lstdc++ -lsupc++ -lgcc -lz -lGLESv1_CM -llog -ldl -lm -lc -else - LDFLAGS = -Wl,-rpath=./libs - SYSTEMLIBS += $(shell pkg-config jack glew gstreamer-0.10 gstreamer-video-0.10 gstreamer-base-0.10 gstreamer-app-0.10 libudev --libs) - SYSTEMLIBS += -lglut -lGL -lasound -lopenal -lsndfile -lvorbis -lFLAC -logg -lfreeimage -endif - - -ifeq ($(findstring addons.make,$(wildcard *.make)),addons.make) - ifneq ($(ARCH),android) - ADDONS = $(shell cat addons.make | grep -v ofxAndroid) - else - ADDONS = $(shell cat addons.make) - endif - - ifneq ($(strip $(ADDONS)),) - ADDONS_REL_DIRS = $(addsuffix /src, $(ADDONS)) - ADDONS_LIBS_REL_DIRS = $(addsuffix /libs, $(ADDONS)) - ADDONS_DIRS = $(addprefix $(OF_ROOT)/addons/, $(ADDONS_REL_DIRS) ) - ADDONS_LIBS_DIRS = $(addprefix $(OF_ROOT)/addons/, $(ADDONS_LIBS_REL_DIRS) ) - ADDONS_BIN_LIBS_DIRS = $(addsuffix /*/lib/$(LIBSPATH), $(ADDONS_LIBS_DIRS) ) - - ADDONS_INCLUDES = $(ADDONS_DIRS) - ADDONS_INCLUDES = $(ADDONS_LIBS_DIRS) - ADDONS_INCLUDES += $(shell find $(ADDONS_DIRS) -type d 2> /dev/null) - ADDONS_INCLUDES += $(shell find $(ADDONS_LIBS_DIRS) -type d 2> /dev/null) - ADDONSCFLAGS = $(addprefix -I,$(ADDONS_INCLUDES)) - - ifeq ($(findstring libsorder.make,$(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null)),libsorder.make) - ADDONS_LIBS_W_ORDER = $(shell cat $(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null)) - EXCLUDE_LIBS_FILTER = $(addprefix %,$(addsuffix .a,$(ADDONS_LIBS_W_ORDER))) - ADDONS_LIBS_STATICS = $(filter-out $(EXCLUDE_LIBS_FILTER), $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.a)) - ADDONS_LIBS_STATICS += $(addprefix -l, $(ADDONS_LIBS_W_ORDER)) - ADDONS_LIBS_STATICS += $(addprefix -L, $(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null | sed s/libsorder.make//g)) - else - ADDONS_LIBS_STATICS = $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.a 2> /dev/null) - endif - - ADDONS_LIBS_SHARED = $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.so 2> /dev/null) - ADDONSLIBS = $(ADDONS_LIBS_STATICS) - ADDONSLIBS += $(ADDONS_LIBS_SHARED) - - - ADDONS_SOURCES = $(shell find $(ADDONS_DIRS) -name "*.cpp" -or -name "*.c" 2> /dev/null) - ADDONS_SOURCES += $(shell find $(ADDONS_LIBS_DIRS) -name "*.cpp" -or -name "*.c" -or -name "*.cc" 2>/dev/null) - ADDONS_OBJFILES = $(subst $(OF_ROOT)/, ,$(patsubst %.cc,%.o,$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(ADDONS_SOURCES))))) - endif -endif - - -ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) - TARGET_CFLAGS = -g - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworksDebug.a - TARGET_NAME = Debug -endif - -ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) - TARGET_CFLAGS = $(COMPILER_OPTIMIZATION) - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworks.a - TARGET_NAME = Release -endif - -ifeq ($(ARCH),android) - ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) - TARGET = libs/armeabi/libOFAndroidApp.so - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworksDebug.a - LDFLAGS += -Wl,--fix-cortex-a8 -shared - USER_LIBS = $(USER_LIBS_ARM) - endif - - ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) - TARGET = libs/armeabi/libOFAndroidApp.so - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks.a - LDFLAGS += -Wl,--fix-cortex-a8 -shared - USER_LIBS = $(USER_LIBS_ARM) - endif - - ifeq ($(findstring Release_arm7,$(MAKECMDGOALS)),Release_arm7) - TARGET_NAME = Release_arm7 - TARGET_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mthumb - TARGET = libs/armeabi-v7a/libOFAndroidApp.so - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks_arm7.a - USER_LIBS = $(USER_LIBS_ARM7) - endif - - ifeq ($(findstring Release_neon,$(MAKECMDGOALS)),Release_neon) - TARGET_NAME = Release_neon - TARGET_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mfpu=neon - TARGET = libs/armeabi-v7a/libOFAndroidApp_neon.so - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks_neon.a - USER_LIBS = $(USER_LIBS_NEON) - endif - - ifeq ($(findstring TestLink,$(MAKECMDGOALS)),TestLink) - TARGET_NAME = Debug - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworksDebug.a - LDFLAGS += -Wl,--entry=main,--fix-cortex-a8 - BIN_NAME = $(APPNAME) - TARGET = obj/$(BIN_NAME) - USER_LIBS = $(USER_LIBS_ARM) - endif -else - ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) - BIN_NAME = $(APPNAME)_debug - TARGET = bin/$(BIN_NAME) - endif - - ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) - BIN_NAME = $(APPNAME) - TARGET = bin/$(BIN_NAME) - endif - - ifeq ($(MAKECMDGOALS),) - TARGET_NAME = Release - BIN_NAME = $(APPNAME) - TARGET = bin/$(BIN_NAME) - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworks.a - endif -endif - -ifeq ($(MAKECMDGOALS),clean) - TARGET = bin/$(APPNAME)_debug bin/$(APPNAME) - TARGET_NAME = Release -endif - -ifeq ($(MAKECMDGOALS),AndroidInstall) - TARGET_NAME = Install -endif - -OBJ_OUTPUT = obj/$(ARCH)$(TARGET_NAME)/ -CLEANTARGET = clean$(TARGET_NAME) - -OBJS = $(addprefix $(OBJ_OUTPUT), $(OBJFILES)) -DEPFILES = $(patsubst %.o,%.d,$(OBJS)) - -USER_OBJS = $(addprefix $(OBJ_OUTPUT), $(USER_OBJFILES)) -DEPFILES += $(patsubst %.o,%.d,$(USER_OBJS)) - -ifeq ($(findstring addons.make,$(wildcard *.make)),addons.make) - ADDONS_OBJS = $(addprefix $(OBJ_OUTPUT), $(ADDONS_OBJFILES)) - DEPFILES += $(patsubst %.o,%.d,$(ADDONS_OBJS)) -endif - -.PHONY: Debug Release all after afterDebugAndroid afterReleaseAndroid - -Release: $(TARGET) after - -Debug: $(TARGET) after - -all: - $(MAKE) Release - -DebugAndroid: $(TARGET) - -ReleaseAndroid: $(TARGET) - -Release_arm7Android: $(TARGET) - -Release_neonAndroid: $(TARGET) afterReleaseAndroid - -TestLinkAndroid: $(TARGET) afterDebugAndroid - -AndroidDebug: - $(MAKE) DebugAndroid - $(MAKE) TestLinkAndroid - -AndroidRelease: - $(MAKE) ReleaseAndroid - $(MAKE) Release_arm7Android - $(MAKE) Release_neonAndroid - - -#This rule does the compilation -#$(OBJS): $(SOURCES) -$(OBJ_OUTPUT)%.o: %.cpp - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CXX) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: %.c - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CC) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: %.cc - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CC) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.cpp - @echo "compiling addon object for" $< - mkdir -p $(@D) - $(CXX) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< - -$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.c - @echo "compiling addon object for" $< - mkdir -p $(@D) - $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< - -$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.cc - @echo "compiling addon object for" $< - mkdir -p $(@D) - $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< - -$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.c - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.cc - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.cpp - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CXX) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(TARGET): $(OBJS) $(ADDONS_OBJS) $(USER_OBJS) $(TARGET_LIBS) $(LIB_STATIC) - @echo 'linking $(TARGET)' - mkdir -p $(@D) - $(CXX) -o $@ $(OBJS) $(ADDONS_OBJS) $(USER_OBJS) $(LDFLAGS) $(USER_LDFLAGS) $(TARGET_LIBS) $(ADDONSLIBS) $(USER_LIBS) $(LIB_STATIC) $(LIB_PATHS_FLAGS) $(LIB_SHARED) $(SYSTEMLIBS) - --include $(DEPFILES) - -.PHONY: clean cleanDebug cleanRelease CleanAndroid -clean: - rm -rf $(OBJ_OUTPUT) - rm -f $(TARGET) - rm -r bin/libs - -$(CLEANTARGET): - rm -rf $(OBJ_OUTPUT) - rm -f $(TARGET) - rm -rf bin/libs - -CleanAndroid: - rm -Rf obj - rm -f libs/armeabi-v7a/libOFAndroidApp.so - rm -f libs/armeabi/libOFAndroidApp.so - rm -f obj/$(APPNAME) - - -afterDebugAndroid:$(TARGET) - @if [ -d libs/armeabi-v7a ]; then rm -r libs/armeabi-v7a; fi - - @cp $(NDK_ROOT)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver libs/armeabi - - #create gdb.setup for armeabi - @echo "set solib-search-path $(PWD)/obj/local/armeabi:$(PWD)/libs/armeabi" > libs/armeabi/gdb.setup - @echo "directory $(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" >> libs/armeabi/gdb.setup - @echo "directory $(PWD)/src" >> libs/armeabi/gdb.setup - @echo "directory $(NDK_ROOT)/sources/cxx-stl/system" >> libs/armeabi/gdb.setup - @echo "directory $(PWD)/libs/armeabi" >> libs/armeabi/gdb.setup - @echo "" >> libs/armeabi/gdb.setup - - @if [ ! -d jni ]; then mkdir jni; fi - @echo "APP_ABI := armeabi" > jni/Application.mk - @echo "#LOCAL_MODULE := OFAndroidApp" > jni/Android.mk - -afterReleaseAndroid:$(TARGET) - @if [ -f obj/$(BIN_NAME) ]; then rm obj/$(BIN_NAME); fi - - @cp $(OF_ROOT)/libs/openFrameworksCompiled/project/android/libneondetection.so libs/armeabi-v7a/ - @cp $(NDK_ROOT)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver libs/armeabi-v7a - - #create gdb.setup for armeabi-v7a - @echo "set solib-search-path $(PWD)/obj/local/armeabi-v7a:$(PWD)/libs/armeabi-v7a" > libs/armeabi-v7a/gdb.setup - @echo "directory $(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" >> libs/armeabi-v7a/gdb.setup - @echo "directory $(PWD)/src" >> libs/armeabi-v7a/gdb.setup - @echo "directory $(NDK_ROOT)/sources/cxx-stl/system" >> libs/armeabi-v7a/gdb.setup - @echo "directory $(PWD)/libs/armeabi-v7a" >> libs/armeabi-v7a/gdb.setup - @echo "" >> libs/armeabi-v7a/gdb.setup - - @if [ ! -d jni ]; then mkdir jni; fi - @echo "APP_ABI := armeabi armeabi-v7a" > jni/Application.mk - @echo "#LOCAL_MODULE := OFAndroidApp" > jni/Android.mk - -RESNAME=$(shell echo $(APPNAME)Resources | tr '[A-Z]' '[a-z]') - -AndroidInstall: - if [ -d "bin/data" ]; then \ - mkdir -p res/raw; \ - rm res/raw/$(RESNAME).zip; \ - cd bin/data; \ - zip -r ../../res/raw/$(RESNAME).zip *; \ - cd ../..; \ - fi - if [ -f obj/$(BIN_NAME) ]; then rm obj/$(BIN_NAME); fi - #touch AndroidManifest.xml - $(SDK_ROOT)/tools/android update project --target $(NDK_PLATFORM) --path $(PROJECT_PATH) - if [ -d bin/classes ]; then rm -r bin/classes; fi - if [ -d bin/classes.dex ]; then rm bin/classes.dex; fi - if [ -d bin/OFActivity.ap_ ]; then rm bin/OFActivity.ap_; fi - if [ -d bin/OFActivity-debug.apk ]; then rm bin/OFActivity-debug.apk; fi - if [ -d bin/OFActivity-debug-unaligned.apk ]; then rm bin/OFActivity-debug-unaligned.apk; fi - if [ -d bin/$(APPNAME).apk ]; then rm bin/$(APPNAME).apk; fi - ant debug - cp bin/OFActivity-debug.apk bin/$(APPNAME).apk - #if [ "$(shell $(SDK_ROOT)/platform-tools/adb get-state)" = "device" ]; then - $(SDK_ROOT)/platform-tools/adb install -r bin/$(APPNAME).apk; - #fi - $(SDK_ROOT)/platform-tools/adb shell am start -a android.intent.action.MAIN -n cc.openframeworks.$(APPNAME)/cc.openframeworks.$(APPNAME).OFActivity - - -after:$(TARGET) - cp -r $(OF_ROOT)/export/$(LIBSPATH)/libs bin/ - @echo - @echo " compiling done" - @echo " to launch the application" - @echo - @echo " cd bin" - @echo " ./$(BIN_NAME)" - @echo - - -.PHONY: help -help: - @echo - @echo openFrameworks universal makefile - @echo - @echo targets: - @echo "make Debug: builds the application with debug symbols" - @echo "make Release: builds the app 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 - @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 diff --git a/examples/android/androidTouchExample/config.make b/examples/android/androidTouchExample/config.make deleted file mode 100644 index 8266e5d914e..00000000000 --- a/examples/android/androidTouchExample/config.make +++ /dev/null @@ -1,32 +0,0 @@ -# add custom variables to this file - -# OF_ROOT allows to move projects outside apps/* just set this variable to the -# absoulte path to the OF root folder - -OF_ROOT = ../../.. - - -# USER_CFLAGS allows to pass custom flags to the compiler -# for example search paths like: -# USER_CFLAGS = -I src/objects - -USER_CFLAGS = - - -# USER_LDFLAGS allows to pass custom flags to the linker -# for example libraries like: -# USER_LD_FLAGS = libs/libawesomelib.a - -USER_LDFLAGS = - -# android specific, in case you want to use different optimizations -USER_LIBS_ARM = -USER_LIBS_ARM7 = -USER_LIBS_NEON = - -# android optimizations - -ANDROID_COMPILER_OPTIMIZATION = -Os - - -EXCLUDE_FROM_SOURCE="bin,.xcodeproj,obj" diff --git a/examples/android/androidVBOExample/Makefile b/examples/android/androidVBOExample/Makefile deleted file mode 100644 index f61fe5d517a..00000000000 --- a/examples/android/androidVBOExample/Makefile +++ /dev/null @@ -1,475 +0,0 @@ -# openFrameworks universal makefile -# -# make help : shows this message -# make Debug: makes the application with debug symbols -# make Release: makes the app with optimizations -# make: the same as make Release -# make CleanDebug: cleans the Debug target -# make CleanRelease: cleans the Release target -# make clean: cleans everything -# -# -# this should work with any OF app, just copy any example -# change the name of the folder and it should compile -# only .cpp support, don't use .c files -# it will look for files in any folder inside the application -# folder except that in the EXCLUDE_FROM_SOURCE variable -# it doesn't autodetect include paths yet -# add the include paths in the USER_CFLAGS variable -# using the gcc syntax: -Ipath -# -# to add addons to your application, edit the addons.make file -# in this directory and add the names of the addons you want to -# include -# -# edit the following vars to customize the makefile - -include config.make - -ifeq ($(findstring Android,$(MAKECMDGOALS)),Android) - include $(OF_ROOT)/libs/openFrameworksCompiled/project/android/paths.make - ARCH = android - ifeq ($(shell uname),Darwin) - HOST_PLATFORM = darwin-x86 - else - HOST_PLATFORM = linux-x86 - endif -endif - -ifeq ($(ARCH),android) - COMPILER_OPTIMIZATION = $(ANDROID_COMPILER_OPTIMIZATION) - NDK_PLATFORM = android-8 -else - COMPILER_OPTIMIZATION = $(USER_COMPILER_OPTIMIZATION) -endif - - - - -# you shouldn't modify anything below this line - - -SHELL = /bin/sh -ifneq ($(ARCH),android) - CXX = g++ - ARCH = $(shell uname -m) - ifeq ($(ARCH),x86_64) - LIBSPATH=linux64 - else - LIBSPATH=linux - endif -else - ifeq ($(findstring Release_arm7,$(MAKECMDGOALS)),Release_arm7) - LIBSPATH =android/armeabi-v7a - else - LIBSPATH =android/armeabi - endif - #NDK_ROOT = $(shell cat $(OF_ROOT)/libs/openFrameworksCompiled/project/android/ndk_path.make) - #SDK_ROOT = $(shell cat $(OF_ROOT)/libs/openFrameworksCompiled/project/android/sdk_path.make) - TOOLCHAIN=arm-linux-androideabi-4.4.3 - TOOLCHAIN_PATH=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/ - ANDROID_PREFIX=arm-linux-androideabi- - CC=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)gcc - CXX=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)g++ - AR=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)ar - SYSROOT=$(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/ - CFLAGS += -nostdlib --sysroot=$(SYSROOT) -fno-short-enums - CFLAGS += -I"$(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" -I"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/include/" -I"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include" - CFLAGS += -DANDROID -endif - -NODEPS = clean -SED_EXCLUDE_FROM_SRC = $(shell echo $(EXCLUDE_FROM_SOURCE) | sed s/\,/\\\\\|/g) -SOURCE_DIRS = $(shell find . -maxdepth 1 -mindepth 1 -type d | grep -v $(SED_EXCLUDE_FROM_SRC) | sed s/.\\///) -SOURCES = $(shell find $(SOURCE_DIRS) -name "*.cpp" -or -name "*.c" -or -name "*.cc") -OBJFILES = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(patsubst %.cc,%.o,$(SOURCES)))) - -ifneq (,$(USER_SOURCE_DIR)) - USER_SOURCES = $(shell find $(USER_SOURCE_DIR) -name "*.cpp" -or -name "*.c" -or -name "*.cc") - USER_OBJFILES = $(subst $(USER_SOURCE_DIR)/, ,$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(patsubst %.cc,%.o,$(USER_SOURCES))))) -endif - -APPNAME = $(shell basename `pwd`) -CORE_INCLUDES = $(shell find $(OF_ROOT)/libs/openFrameworks/ -type d) -CORE_INCLUDE_FLAGS = $(addprefix -I,$(CORE_INCLUDES)) -INCLUDES = $(shell find $(OF_ROOT)/libs/*/include -type d | grep -v glu | grep -v quicktime | grep -v poco) -INCLUDES_FLAGS = $(addprefix -I,$(INCLUDES)) -INCLUDES_FLAGS += -I$(OF_ROOT)/libs/poco/include -ifeq ($(ARCH),android) - INCLUDES_FLAGS += -I$(OF_ROOT)/libs/glu/include_android -else - INCLUDES_FLAGS += -I$(OF_ROOT)/libs/glu/include - INCLUDES_FLAGS += $(shell pkg-config glew gstreamer-0.10 gstreamer-video-0.10 gstreamer-base-0.10 libudev --cflags) - #check if gtk exists and add it - GTK = $(shell pkg-config gtk+-2.0 --exists; echo $$?) - ifeq ($(GTK),0) - CFLAGS += $(shell pkg-config gtk+-2.0 --cflags) -DOF_USING_GTK - SYSTEMLIBS += $(shell pkg-config gtk+-2.0 --libs) - endif - - #check if mpg123 exists and add it - MPG123 = $(shell pkg-config libmpg123 --exists; echo $$?) - ifeq ($(MPG123),0) - CFLAGS += -DOF_USING_MPG123 - SYSTEMLIBS += -lmpg123 - endif -endif -LIB_STATIC = $(shell ls $(OF_ROOT)/libs/*/lib/$(LIBSPATH)/*.a 2> /dev/null | grep -v openFrameworksCompiled | grep -v Poco) -LIB_SHARED = $(shell ls $(OF_ROOT)/libs/*/lib/$(LIBSPATH)/*.so 2> /dev/null | grep -v openFrameworksCompiled | sed "s/.*\\/lib\([^/]*\)\.so/-l\1/") -LIB_STATIC += $(OF_ROOT)/libs/poco/lib/$(LIBSPATH)/libPocoNet.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoXML.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoUtil.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoFoundation.a -LIB_PATHS_FLAGS = $(shell ls -d $(OF_ROOT)/libs/*/lib/$(LIBSPATH) | sed "s/\(\.*\)/-L\1/") - -CFLAGS += -Wall -fexceptions -CFLAGS += -I. -CFLAGS += $(INCLUDES_FLAGS) -CFLAGS += $(CORE_INCLUDE_FLAGS) - - - -ifeq ($(ARCH),android) - LDFLAGS = --sysroot=$(SYSROOT) -nostdlib -L"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi" - SYSTEMLIBS += -lstdc++ -lsupc++ -lgcc -lz -lGLESv1_CM -llog -ldl -lm -lc -else - LDFLAGS = -Wl,-rpath=./libs - SYSTEMLIBS += $(shell pkg-config jack glew gstreamer-0.10 gstreamer-video-0.10 gstreamer-base-0.10 gstreamer-app-0.10 libudev --libs) - SYSTEMLIBS += -lglut -lGL -lasound -lopenal -lsndfile -lvorbis -lFLAC -logg -lfreeimage -endif - - -ifeq ($(findstring addons.make,$(wildcard *.make)),addons.make) - ifneq ($(ARCH),android) - ADDONS = $(shell cat addons.make | grep -v ofxAndroid) - else - ADDONS = $(shell cat addons.make) - endif - - ifneq ($(strip $(ADDONS)),) - ADDONS_REL_DIRS = $(addsuffix /src, $(ADDONS)) - ADDONS_LIBS_REL_DIRS = $(addsuffix /libs, $(ADDONS)) - ADDONS_DIRS = $(addprefix $(OF_ROOT)/addons/, $(ADDONS_REL_DIRS) ) - ADDONS_LIBS_DIRS = $(addprefix $(OF_ROOT)/addons/, $(ADDONS_LIBS_REL_DIRS) ) - ADDONS_BIN_LIBS_DIRS = $(addsuffix /*/lib/$(LIBSPATH), $(ADDONS_LIBS_DIRS) ) - - ADDONS_INCLUDES = $(ADDONS_DIRS) - ADDONS_INCLUDES = $(ADDONS_LIBS_DIRS) - ADDONS_INCLUDES += $(shell find $(ADDONS_DIRS) -type d 2> /dev/null) - ADDONS_INCLUDES += $(shell find $(ADDONS_LIBS_DIRS) -type d 2> /dev/null) - ADDONSCFLAGS = $(addprefix -I,$(ADDONS_INCLUDES)) - - ifeq ($(findstring libsorder.make,$(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null)),libsorder.make) - ADDONS_LIBS_W_ORDER = $(shell cat $(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null)) - EXCLUDE_LIBS_FILTER = $(addprefix %,$(addsuffix .a,$(ADDONS_LIBS_W_ORDER))) - ADDONS_LIBS_STATICS = $(filter-out $(EXCLUDE_LIBS_FILTER), $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.a)) - ADDONS_LIBS_STATICS += $(addprefix -l, $(ADDONS_LIBS_W_ORDER)) - ADDONS_LIBS_STATICS += $(addprefix -L, $(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null | sed s/libsorder.make//g)) - else - ADDONS_LIBS_STATICS = $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.a 2> /dev/null) - endif - - ADDONS_LIBS_SHARED = $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.so 2> /dev/null) - ADDONSLIBS = $(ADDONS_LIBS_STATICS) - ADDONSLIBS += $(ADDONS_LIBS_SHARED) - - - ADDONS_SOURCES = $(shell find $(ADDONS_DIRS) -name "*.cpp" -or -name "*.c" 2> /dev/null) - ADDONS_SOURCES += $(shell find $(ADDONS_LIBS_DIRS) -name "*.cpp" -or -name "*.c" -or -name "*.cc" 2>/dev/null) - ADDONS_OBJFILES = $(subst $(OF_ROOT)/, ,$(patsubst %.cc,%.o,$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(ADDONS_SOURCES))))) - endif -endif - - -ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) - TARGET_CFLAGS = -g - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworksDebug.a - TARGET_NAME = Debug -endif - -ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) - TARGET_CFLAGS = $(COMPILER_OPTIMIZATION) - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworks.a - TARGET_NAME = Release -endif - -ifeq ($(ARCH),android) - ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) - TARGET = libs/armeabi/libOFAndroidApp.so - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworksDebug.a - LDFLAGS += -Wl,--fix-cortex-a8 -shared - USER_LIBS = $(USER_LIBS_ARM) - endif - - ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) - TARGET = libs/armeabi/libOFAndroidApp.so - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks.a - LDFLAGS += -Wl,--fix-cortex-a8 -shared - USER_LIBS = $(USER_LIBS_ARM) - endif - - ifeq ($(findstring Release_arm7,$(MAKECMDGOALS)),Release_arm7) - TARGET_NAME = Release_arm7 - TARGET_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mthumb - TARGET = libs/armeabi-v7a/libOFAndroidApp.so - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks_arm7.a - USER_LIBS = $(USER_LIBS_ARM7) - endif - - ifeq ($(findstring Release_neon,$(MAKECMDGOALS)),Release_neon) - TARGET_NAME = Release_neon - TARGET_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mfpu=neon - TARGET = libs/armeabi-v7a/libOFAndroidApp_neon.so - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks_neon.a - USER_LIBS = $(USER_LIBS_NEON) - endif - - ifeq ($(findstring TestLink,$(MAKECMDGOALS)),TestLink) - TARGET_NAME = Debug - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworksDebug.a - LDFLAGS += -Wl,--entry=main,--fix-cortex-a8 - BIN_NAME = $(APPNAME) - TARGET = obj/$(BIN_NAME) - USER_LIBS = $(USER_LIBS_ARM) - endif -else - ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) - BIN_NAME = $(APPNAME)_debug - TARGET = bin/$(BIN_NAME) - endif - - ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) - BIN_NAME = $(APPNAME) - TARGET = bin/$(BIN_NAME) - endif - - ifeq ($(MAKECMDGOALS),) - TARGET_NAME = Release - BIN_NAME = $(APPNAME) - TARGET = bin/$(BIN_NAME) - TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworks.a - endif -endif - -ifeq ($(MAKECMDGOALS),clean) - TARGET = bin/$(APPNAME)_debug bin/$(APPNAME) - TARGET_NAME = Release -endif - -ifeq ($(MAKECMDGOALS),AndroidInstall) - TARGET_NAME = Install -endif - -OBJ_OUTPUT = obj/$(ARCH)$(TARGET_NAME)/ -CLEANTARGET = clean$(TARGET_NAME) - -OBJS = $(addprefix $(OBJ_OUTPUT), $(OBJFILES)) -DEPFILES = $(patsubst %.o,%.d,$(OBJS)) - -USER_OBJS = $(addprefix $(OBJ_OUTPUT), $(USER_OBJFILES)) -DEPFILES += $(patsubst %.o,%.d,$(USER_OBJS)) - -ifeq ($(findstring addons.make,$(wildcard *.make)),addons.make) - ADDONS_OBJS = $(addprefix $(OBJ_OUTPUT), $(ADDONS_OBJFILES)) - DEPFILES += $(patsubst %.o,%.d,$(ADDONS_OBJS)) -endif - -.PHONY: Debug Release all after afterDebugAndroid afterReleaseAndroid - -Release: $(TARGET) after - -Debug: $(TARGET) after - -all: - $(MAKE) Release - -DebugAndroid: $(TARGET) - -ReleaseAndroid: $(TARGET) - -Release_arm7Android: $(TARGET) - -Release_neonAndroid: $(TARGET) afterReleaseAndroid - -TestLinkAndroid: $(TARGET) afterDebugAndroid - -AndroidDebug: - $(MAKE) DebugAndroid - $(MAKE) TestLinkAndroid - -AndroidRelease: - $(MAKE) ReleaseAndroid - $(MAKE) Release_arm7Android - $(MAKE) Release_neonAndroid - - -#This rule does the compilation -#$(OBJS): $(SOURCES) -$(OBJ_OUTPUT)%.o: %.cpp - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CXX) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: %.c - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CC) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: %.cc - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CC) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.cpp - @echo "compiling addon object for" $< - mkdir -p $(@D) - $(CXX) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< - -$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.c - @echo "compiling addon object for" $< - mkdir -p $(@D) - $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< - -$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.cc - @echo "compiling addon object for" $< - mkdir -p $(@D) - $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< - -$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.c - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.cc - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.cpp - @echo "compiling object for: " $< - mkdir -p $(@D) - $(CXX) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< - -$(TARGET): $(OBJS) $(ADDONS_OBJS) $(USER_OBJS) $(TARGET_LIBS) $(LIB_STATIC) - @echo 'linking $(TARGET)' - mkdir -p $(@D) - $(CXX) -o $@ $(OBJS) $(ADDONS_OBJS) $(USER_OBJS) $(LDFLAGS) $(USER_LDFLAGS) $(TARGET_LIBS) $(ADDONSLIBS) $(USER_LIBS) $(LIB_STATIC) $(LIB_PATHS_FLAGS) $(LIB_SHARED) $(SYSTEMLIBS) - --include $(DEPFILES) - -.PHONY: clean cleanDebug cleanRelease CleanAndroid -clean: - rm -rf $(OBJ_OUTPUT) - rm -f $(TARGET) - rm -r bin/libs - -$(CLEANTARGET): - rm -rf $(OBJ_OUTPUT) - rm -f $(TARGET) - rm -rf bin/libs - -CleanAndroid: - rm -Rf obj - rm -f libs/armeabi-v7a/libOFAndroidApp.so - rm -f libs/armeabi/libOFAndroidApp.so - rm -f obj/$(APPNAME) - - -afterDebugAndroid:$(TARGET) - @if [ -d libs/armeabi-v7a ]; then rm -r libs/armeabi-v7a; fi - - @cp $(NDK_ROOT)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver libs/armeabi - - #create gdb.setup for armeabi - @echo "set solib-search-path $(PWD)/obj/local/armeabi:$(PWD)/libs/armeabi" > libs/armeabi/gdb.setup - @echo "directory $(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" >> libs/armeabi/gdb.setup - @echo "directory $(PWD)/src" >> libs/armeabi/gdb.setup - @echo "directory $(NDK_ROOT)/sources/cxx-stl/system" >> libs/armeabi/gdb.setup - @echo "directory $(PWD)/libs/armeabi" >> libs/armeabi/gdb.setup - @echo "" >> libs/armeabi/gdb.setup - - @if [ ! -d jni ]; then mkdir jni; fi - @echo "APP_ABI := armeabi" > jni/Application.mk - @echo "#LOCAL_MODULE := OFAndroidApp" > jni/Android.mk - -afterReleaseAndroid:$(TARGET) - @if [ -f obj/$(BIN_NAME) ]; then rm obj/$(BIN_NAME); fi - - @cp $(OF_ROOT)/libs/openFrameworksCompiled/project/android/libneondetection.so libs/armeabi-v7a/ - @cp $(NDK_ROOT)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver libs/armeabi-v7a - - #create gdb.setup for armeabi-v7a - @echo "set solib-search-path $(PWD)/obj/local/armeabi-v7a:$(PWD)/libs/armeabi-v7a" > libs/armeabi-v7a/gdb.setup - @echo "directory $(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" >> libs/armeabi-v7a/gdb.setup - @echo "directory $(PWD)/src" >> libs/armeabi-v7a/gdb.setup - @echo "directory $(NDK_ROOT)/sources/cxx-stl/system" >> libs/armeabi-v7a/gdb.setup - @echo "directory $(PWD)/libs/armeabi-v7a" >> libs/armeabi-v7a/gdb.setup - @echo "" >> libs/armeabi-v7a/gdb.setup - - @if [ ! -d jni ]; then mkdir jni; fi - @echo "APP_ABI := armeabi armeabi-v7a" > jni/Application.mk - @echo "#LOCAL_MODULE := OFAndroidApp" > jni/Android.mk - -RESNAME=$(shell echo $(APPNAME)Resources | tr '[A-Z]' '[a-z]') - -AndroidInstall: - if [ -d "bin/data" ]; then \ - mkdir -p res/raw; \ - rm res/raw/$(RESNAME).zip; \ - cd bin/data; \ - zip -r ../../res/raw/$(RESNAME).zip *; \ - cd ../..; \ - fi - if [ -f obj/$(BIN_NAME) ]; then rm obj/$(BIN_NAME); fi - #touch AndroidManifest.xml - $(SDK_ROOT)/tools/android update project --target $(NDK_PLATFORM) --path $(PROJECT_PATH) - if [ -d bin/classes ]; then rm -r bin/classes; fi - if [ -d bin/classes.dex ]; then rm bin/classes.dex; fi - if [ -d bin/OFActivity.ap_ ]; then rm bin/OFActivity.ap_; fi - if [ -d bin/OFActivity-debug.apk ]; then rm bin/OFActivity-debug.apk; fi - if [ -d bin/OFActivity-debug-unaligned.apk ]; then rm bin/OFActivity-debug-unaligned.apk; fi - if [ -d bin/$(APPNAME).apk ]; then rm bin/$(APPNAME).apk; fi - ant debug - cp bin/OFActivity-debug.apk bin/$(APPNAME).apk - #if [ "$(shell $(SDK_ROOT)/platform-tools/adb get-state)" = "device" ]; then - $(SDK_ROOT)/platform-tools/adb install -r bin/$(APPNAME).apk; - #fi - $(SDK_ROOT)/platform-tools/adb shell am start -a android.intent.action.MAIN -n cc.openframeworks.$(APPNAME)/cc.openframeworks.$(APPNAME).OFActivity - - -after:$(TARGET) - cp -r $(OF_ROOT)/export/$(LIBSPATH)/libs bin/ - @echo - @echo " compiling done" - @echo " to launch the application" - @echo - @echo " cd bin" - @echo " ./$(BIN_NAME)" - @echo - - -.PHONY: help -help: - @echo - @echo openFrameworks universal makefile - @echo - @echo targets: - @echo "make Debug: builds the application with debug symbols" - @echo "make Release: builds the app 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 - @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 diff --git a/examples/android/androidVBOExample/config.make b/examples/android/androidVBOExample/config.make deleted file mode 100644 index 8266e5d914e..00000000000 --- a/examples/android/androidVBOExample/config.make +++ /dev/null @@ -1,32 +0,0 @@ -# add custom variables to this file - -# OF_ROOT allows to move projects outside apps/* just set this variable to the -# absoulte path to the OF root folder - -OF_ROOT = ../../.. - - -# USER_CFLAGS allows to pass custom flags to the compiler -# for example search paths like: -# USER_CFLAGS = -I src/objects - -USER_CFLAGS = - - -# USER_LDFLAGS allows to pass custom flags to the linker -# for example libraries like: -# USER_LD_FLAGS = libs/libawesomelib.a - -USER_LDFLAGS = - -# android specific, in case you want to use different optimizations -USER_LIBS_ARM = -USER_LIBS_ARM7 = -USER_LIBS_NEON = - -# android optimizations - -ANDROID_COMPILER_OPTIMIZATION = -Os - - -EXCLUDE_FROM_SOURCE="bin,.xcodeproj,obj" From 40fe662d3f78ae20247ec2096a33052cf154a9d1 Mon Sep 17 00:00:00 2001 From: bilderbuchi Date: Wed, 28 Mar 2012 14:15:39 +0200 Subject: [PATCH 04/13] Clean up rest, so that repo contents and gitignore agree with each other. --- .gitignore | 1 - .../Objects-normal/i386/pugixml.o | Bin 672956 -> 0 bytes .../Objects-normal/x86_64/pugixml.o | Bin 779044 -> 0 bytes .../QuaternionLatLongExample/Project.xcconfig | 9 --------- 4 files changed, 10 deletions(-) delete mode 100644 apps/devApps/projectGenerator/src/pugixmlLib/scripts/xcode3/Universal/Debug/pugixml.build/Objects-normal/i386/pugixml.o delete mode 100644 apps/devApps/projectGenerator/src/pugixmlLib/scripts/xcode3/Universal/Debug/pugixml.build/Objects-normal/x86_64/pugixml.o delete mode 100644 examples/3d/QuaternionLatLongExample/Project.xcconfig diff --git a/.gitignore b/.gitignore index 82f4776c46e..9ef4e868852 100644 --- a/.gitignore +++ b/.gitignore @@ -98,7 +98,6 @@ examples/*/*/Release_arm7 examples/*/*/test link examples/*/*/obj .csettings -paths.make !examples/android/*/.cproject !examples/android/*/.project !examples/android/*/.settings diff --git a/apps/devApps/projectGenerator/src/pugixmlLib/scripts/xcode3/Universal/Debug/pugixml.build/Objects-normal/i386/pugixml.o b/apps/devApps/projectGenerator/src/pugixmlLib/scripts/xcode3/Universal/Debug/pugixml.build/Objects-normal/i386/pugixml.o deleted file mode 100644 index 93bbc27a5a5dd4ddcff0cf752021779dc1bf83a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 672956 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 Ys~{=KIm>F+?32AErXH4Vvkwl-UAr-{^ejuN?v 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

#&(hO1B4V;XKQ7#@UQ}~_S0!6fk_qiRsnlls zxaZ($pMiFuaWbc)2kY?8pQ>m`aCzdnJb&;W^C4N%qAPMzE9X@!8Ra6E93{n3UJ6#V zv{tK}y{l=d#?6V7u#=e7H6AsuV#oq4otJRVucn0^GYM{dden4Ppb58-+t$N;!!v($ zM*rv4MsZXswy#%k-Y>FftG2Xgr+c*2260c_jONi(r4I6FFu2LtdD`S*iP9NMSQlffcPboSfzgA(eZgrvs^`6S-k$yqvSm@t61}F(&GJG5e#$%rM1*1t@lXv#vPqh z;`;%Hgb%ROw0mi=7swYkEM|Ia>hF5gBERk~thJftJk6%R-=k-PCfje<_N6xUKRs$} zi(0TZ*@Tm!3Rnq{#y7LS$EMrKqce#fw}@&xf_lYyW-F|1O8=w2m>?Cw3%Ci=3@UZ1 z3yUkA7FOyfe$49gJ>1igo>^%&)sCp)$5@&jDW$BK+^PpR?aoe#FEW*-CGw8oKd zWPRs{Pvee9K(QR*RdjaUnSg+@ueR{n3T%0A^)M-phLr%v5Zd3{jT^?FZKZFD*Y<|x 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 Kybx46t3n!f2>#m0 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 v)R~i>6;%tdu?j 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

- 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 qx>@phxedgq2bUJSA%%+$;iC|Yfa0TY{?$l1* Date: Sat, 7 Apr 2012 13:15:52 +0200 Subject: [PATCH 05/13] Factor out gitignore example rules into examples/.gitignore --- .gitignore | 57 ++++++--------------------------------------- examples/.gitignore | 52 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 50 deletions(-) diff --git a/.gitignore b/.gitignore index 9ef4e868852..a785e04ddf8 100644 --- a/.gitignore +++ b/.gitignore @@ -7,34 +7,16 @@ openFrameworksDebug.a openFrameworksUniversal.a *.app/ -#rule to avoid non-official addons going into git -#see addons/.gitignore -addons/** - #xcode files *.pbxuser *.perspectivev3 -examples/*/*/*.xcodeproj -examples/*/*/Project.xcconfig -examples/*/*/openFrameworks-Info.plist -examples/*/*/ofxiphone-Info.plist -examples/*/*/iPhone_Prefix.pch -examples/*/*/*/*/Default.png -examples/*/*/*/*/Icon.png - -#codeblocks files -examples/*/*/*.layout -examples/*/*/*.depend -examples/*/*/bin/clickToLaunch* -examples/*/*/bin/libs -examples/*/*/obj -examples/*/*/*.cbp -examples/*/*/*.workspace +xcuserdata +project.xcworkspace +.DS_Store -#vs files -examples/*/*/*.sln -examples/*/*/*.vcxproj -examples/*/*/*.vcxproj.user +#rule to avoid non-official addons going into git +#see addons/.gitignore +addons/** #rule to avoid non-official apps going into git #see apps/.gitignore @@ -58,30 +40,14 @@ addons/Debug Mac OS X addons/Release Mac OS X libs/openFrameworks/Debug Mac OS X libs/openFrameworks/Release Mac OS X -examples/*/*/Debug Mac OS X -examples/*/*/Release Mac OS X -xcuserdata -project.xcworkspace -.DS_Store #Linux addons/Debug Linux addons/Release Linux libs/openFrameworks/Debug Linux libs/openFrameworks/Release Linux -examples/*/*/Debug Linux -examples/*/*/Release Linux -examples/*/*/Debug Linux64 -examples/*/*/Release Linux64 -examples/*/*/Makefile -examples/*/*/config.make *.pyc -#eclipse -examples/*/*/.cproject -examples/*/*/.project -examples/*/*/.settings - #Android addons/Debug Android addons/Release Android @@ -90,14 +56,5 @@ libs/openFrameworks/Release Android libs/openFrameworks/Release libs/openFrameworks/Debug libs/openFrameworks/Release_arm7 -examples/*/*/Debug Android -examples/*/*/Release Android -examples/*/*/Debug -examples/*/*/Release -examples/*/*/Release_arm7 -examples/*/*/test link -examples/*/*/obj .csettings -!examples/android/*/.cproject -!examples/android/*/.project -!examples/android/*/.settings + diff --git a/examples/.gitignore b/examples/.gitignore index 509daa6a4f9..04353bebc9b 100644 --- a/examples/.gitignore +++ b/examples/.gitignore @@ -19,3 +19,55 @@ Application.mk Android.mk */*/bin/* !*/*/bin/data/ + +#xcode files +/*/*/*.xcodeproj +/*/*/Project.xcconfig +/*/*/openFrameworks-Info.plist +/*/*/ofxiphone-Info.plist +/*/*/iPhone_Prefix.pch +/*/*/*/*/Default.png +/*/*/*/*/Icon.png + +#codeblocks files +/*/*/*.layout +/*/*/*.depend +/*/*/bin/clickToLaunch* +/*/*/bin/libs +/*/*/obj +/*/*/*.cbp +/*/*/*.workspace + +#vs files +/*/*/*.sln +/*/*/*.vcxproj +/*/*/*.vcxproj.user + +#MacOS +/*/*/Debug Mac OS X +/*/*/Release Mac OS X + +# linux +/*/*/Debug Linux +/*/*/Release Linux +/*/*/Debug Linux64 +/*/*/Release Linux64 +/*/*/Makefile +/*/*/config.make + +#eclipse +/*/*/.cproject +/*/*/.project +/*/*/.settings + +#Android +/*/*/Debug Android +/*/*/Release Android +/*/*/Debug +/*/*/Release +/*/*/Release_arm7 +/*/*/test link +/*/*/obj +!/android/*/.cproject +!/android/*/.project +!/android/*/.settings From 41b5d94e5ea711d508c20741b0cab0312803db73 Mon Sep 17 00:00:00 2001 From: bilderbuchi Date: Sat, 7 Apr 2012 16:56:11 +0200 Subject: [PATCH 06/13] Simpler pattern for the Debug and Release folders. --- .gitignore | 22 ++++------------------ examples/.gitignore | 16 ---------------- 2 files changed, 4 insertions(+), 34 deletions(-) diff --git a/.gitignore b/.gitignore index a785e04ddf8..879ca634aa2 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,10 @@ addons/** #see apps/.gitignore apps/* +# debug and release folders +Debug*/ +Release*/ + #codeblocks OF lib files libs/openFrameworksCompiled/project/*/*.depend libs/openFrameworksCompiled/project/*/*.layout @@ -34,27 +38,9 @@ libs/openFrameworksCompiled/project/*/*.layout *.opensdf *.suo -#eclipse build folders -#Mac OS X -addons/Debug Mac OS X -addons/Release Mac OS X -libs/openFrameworks/Debug Mac OS X -libs/openFrameworks/Release Mac OS X - #Linux -addons/Debug Linux -addons/Release Linux -libs/openFrameworks/Debug Linux -libs/openFrameworks/Release Linux *.pyc #Android -addons/Debug Android -addons/Release Android -libs/openFrameworks/Debug Android -libs/openFrameworks/Release Android -libs/openFrameworks/Release -libs/openFrameworks/Debug -libs/openFrameworks/Release_arm7 .csettings diff --git a/examples/.gitignore b/examples/.gitignore index 04353bebc9b..5cab896f4f5 100644 --- a/examples/.gitignore +++ b/examples/.gitignore @@ -1,7 +1,4 @@ */.metadata -android/*/Debug -android/*/Release -android/*/Release_arm7 android/*/test link android/*/bin android/*/obj @@ -43,15 +40,7 @@ Android.mk /*/*/*.vcxproj /*/*/*.vcxproj.user -#MacOS -/*/*/Debug Mac OS X -/*/*/Release Mac OS X - # linux -/*/*/Debug Linux -/*/*/Release Linux -/*/*/Debug Linux64 -/*/*/Release Linux64 /*/*/Makefile /*/*/config.make @@ -61,11 +50,6 @@ Android.mk /*/*/.settings #Android -/*/*/Debug Android -/*/*/Release Android -/*/*/Debug -/*/*/Release -/*/*/Release_arm7 /*/*/test link /*/*/obj !/android/*/.cproject From 5f43d4252c985f9b402ad0715a3806a43c298556 Mon Sep 17 00:00:00 2001 From: bilderbuchi Date: Sat, 7 Apr 2012 17:58:00 +0200 Subject: [PATCH 07/13] Fix gitignore addons redundancies. --- .gitignore | 2 +- addons/.gitignore | 20 ++------------------ 2 files changed, 3 insertions(+), 19 deletions(-) diff --git a/.gitignore b/.gitignore index 879ca634aa2..9f4efee8cc3 100644 --- a/.gitignore +++ b/.gitignore @@ -16,7 +16,7 @@ project.xcworkspace #rule to avoid non-official addons going into git #see addons/.gitignore -addons/** +addons/* #rule to avoid non-official apps going into git #see apps/.gitignore diff --git a/addons/.gitignore b/addons/.gitignore index 41e6fe65046..7e24b86347c 100644 --- a/addons/.gitignore +++ b/addons/.gitignore @@ -1,38 +1,22 @@ !ofAddons.h !.project !ofx3DModelLoader -!ofx3DModelLoader/** !ofxAccelerometer -!ofxAccelerometer/** !ofxDirList -!ofxDirList/** !ofxiPhone -!ofxiPhone/** !ofxMultiTouch -!ofxMultiTouch/** !ofxNetwork -!ofxNetwork/** !ofxOpenCv -!ofxOpenCv/** !ofxOsc -!ofxOsc/** !ofxThread -!ofxThread/** !ofxVectorGraphics -!ofxVectorGraphics/** !ofxVectorMath -!ofxVectorMath/** !ofxXmlSettings -!ofxXmlSettings/** !ofxAndroid -!ofxAndroid/** -!ofxAssimpModelLoader -!ofxAssimpModelLoader/** -!ofxGui -!ofxGui/** -!ofxGui/*/** ofxAndroid/ofAndroidLib/bin ofxAndroid/ofAndroidLib/gen +!ofxAssimpModelLoader +!ofxGui # don't ignore the .gitignore file !.gitignore From 94b82f358fbaa9235daa1435fc8b18ff610f80cd Mon Sep 17 00:00:00 2001 From: bilderbuchi Date: Mon, 9 Apr 2012 18:21:09 +0200 Subject: [PATCH 08/13] Clean up structure, correct redundancies. --- .gitignore | 66 ++++++++++++------ apps/.gitignore | 2 +- examples/.gitignore | 36 ++++------ .../openframeworks/Thumbs.db | Bin 6144 -> 0 bytes .../openframeworks/Thumbs.db | Bin 6144 -> 0 bytes 5 files changed, 62 insertions(+), 42 deletions(-) delete mode 100644 scripts/linux/codeblocks_wizard/openframeworks/Thumbs.db delete mode 100644 scripts/win_cb/codeblocks_wizard/openframeworks/Thumbs.db diff --git a/.gitignore b/.gitignore index 9f4efee8cc3..ea73bc8511b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,18 +1,9 @@ -*.mode* -build/ -obj/ -*.o + +# OF-specific ignore patterns + openFrameworks.a openFrameworksDebug.a openFrameworksUniversal.a -*.app/ - -#xcode files -*.pbxuser -*.perspectivev3 -xcuserdata -project.xcworkspace -.DS_Store #rule to avoid non-official addons going into git #see addons/.gitignore @@ -22,24 +13,59 @@ addons/* #see apps/.gitignore apps/* -# debug and release folders +#also, see examples/.gitignore + +# Some general ignore patterns + +build/ +obj/ +*.o Debug*/ Release*/ +*.mode* +*.app/ +*.pyc -#codeblocks OF lib files -libs/openFrameworksCompiled/project/*/*.depend -libs/openFrameworksCompiled/project/*/*.layout +# IDE-specific ignore patterns -#linux temporary files -*~ +#XCode +*.pbxuser +*.perspectivev3 +xcuserdata +project.xcworkspace -#vs2010 user files +#Code::Blocks +*.depend +*.layout + +#Visual Studio *.sdf *.opensdf *.suo +ipch/ + +#Eclipse +.metadata +local.properties +.externalToolBuilders + +# OS-specific ignore patterns #Linux -*.pyc +*~ +# KDE +.directory + +#OSX +.DS_Store +# Thumbnails +._* + +#Windows +# Windows image file caches +Thumbs.db +# Folder config file +Desktop.ini #Android .csettings diff --git a/apps/.gitignore b/apps/.gitignore index c615082f938..ebf64edbea4 100644 --- a/apps/.gitignore +++ b/apps/.gitignore @@ -7,7 +7,7 @@ /devApps/*/.cproject /devApps/*/.project -/devApps/*/.settings +/devApps/*/.settings/ # don't ignore the .gitignore file !.gitignore diff --git a/examples/.gitignore b/examples/.gitignore index 5cab896f4f5..4040dfc3ae9 100644 --- a/examples/.gitignore +++ b/examples/.gitignore @@ -1,11 +1,5 @@ -*/.metadata android/*/test link -android/*/bin -android/*/obj android/*/gen -android/*/local.properties -android/*/.settings -android/*/.externalToolBuilders android/*/res/raw libOFAndroidApp.so libOFAndroidApp_neon.so @@ -14,10 +8,13 @@ gdb.setup libneondetection.so Application.mk Android.mk + */*/bin/* !*/*/bin/data/ -#xcode files +# IDE-specific ignore patterns + +#XCode /*/*/*.xcodeproj /*/*/Project.xcconfig /*/*/openFrameworks-Info.plist @@ -26,32 +23,29 @@ Android.mk /*/*/*/*/Default.png /*/*/*/*/Icon.png -#codeblocks files -/*/*/*.layout -/*/*/*.depend -/*/*/bin/clickToLaunch* -/*/*/bin/libs -/*/*/obj +#Code::Blocks /*/*/*.cbp /*/*/*.workspace -#vs files +#Visual Studio /*/*/*.sln /*/*/*.vcxproj /*/*/*.vcxproj.user +/*/*/*.vcxproj.filters -# linux -/*/*/Makefile -/*/*/config.make - -#eclipse +#Eclipse /*/*/.cproject /*/*/.project -/*/*/.settings +/*/*/.settings/ + +# OS-specific ignore patterns + +#Linux +/*/*/Makefile +/*/*/config.make #Android /*/*/test link -/*/*/obj !/android/*/.cproject !/android/*/.project !/android/*/.settings diff --git a/scripts/linux/codeblocks_wizard/openframeworks/Thumbs.db b/scripts/linux/codeblocks_wizard/openframeworks/Thumbs.db deleted file mode 100644 index 151dde14f6586e6b58b6f3209c9ef3c8535f4f49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6144 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 diff --git a/scripts/win_cb/codeblocks_wizard/openframeworks/Thumbs.db b/scripts/win_cb/codeblocks_wizard/openframeworks/Thumbs.db deleted file mode 100644 index a8ed67e3626a231676a99f4373399f76ffb0d804..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6144 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 Date: Wed, 18 Apr 2012 17:31:41 +0200 Subject: [PATCH 09/13] Additions to XCode gitignores. List according to http://stackoverflow.com/questions/3066698/what-is-the-standard-content-of-gitignore-for-an-iphone-xcode-project --- .gitignore | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index ea73bc8511b..7e72165dcf4 100644 --- a/.gitignore +++ b/.gitignore @@ -30,9 +30,13 @@ Release*/ #XCode *.pbxuser +*.perspective *.perspectivev3 +*.mode1v3 +*.mode2v3 +#XCode 4 xcuserdata -project.xcworkspace +*.xcworkspace #Code::Blocks *.depend @@ -58,6 +62,8 @@ local.properties #OSX .DS_Store +*.swp +*~.nib # Thumbnails ._* From 0d1e7978f0db91ffd962a99a17e34d9ca907f422 Mon Sep 17 00:00:00 2001 From: bilderbuchi Date: Wed, 18 Apr 2012 17:34:51 +0200 Subject: [PATCH 10/13] Remove superfluous vcxproj.filters files. Wouldn't have made sense without vcxproj files, and should be generated by PG. --- ...DModelLoaderExample_vs2010.vcxproj.filters | 45 ---- .../allAddonsExample_vs2010.vcxproj.filters | 252 ------------------ .../ofxAssimpExample_vs2010.vcxproj.filters | 33 --- ...orkTcpClientExample_vs2010.vcxproj.filters | 48 ---- ...orkTcpServerExample_vs2010.vcxproj.filters | 48 ---- ...kUdpReceiverExample_vs2010.vcxproj.filters | 48 ---- ...orkUdpSenderExample_vs2010.vcxproj.filters | 48 ---- .../opencvExample_vs2010.vcxproj.filters | 75 ------ ...CvHaarFinderExample_vs2010.vcxproj.filters | 75 ------ .../oscReceiveExample_vs2010.vcxproj.filters | 51 ---- .../oscSenderExample_vs2010.vcxproj.filters | 51 ---- ...dImageLoaderExample_vs2010.vcxproj.filters | 27 -- ...ctorGraphicsExample_vs2010.vcxproj.filters | 36 --- .../xmlSettingsExample_vs2010.vcxproj.filters | 42 --- .../vectorMathExample_vs2010.vcxproj.filters | 57 ---- .../dirListExample_vs2010.vcxproj.filters | 27 -- 16 files changed, 963 deletions(-) delete mode 100644 examples/addons/3DModelLoaderExample/3DModelLoaderExample_vs2010.vcxproj.filters delete mode 100644 examples/addons/allAddonsExample/allAddonsExample_vs2010.vcxproj.filters delete mode 100644 examples/addons/assimpExample/ofxAssimpExample_vs2010.vcxproj.filters delete mode 100644 examples/addons/networkTcpClientExample/networkTcpClientExample_vs2010.vcxproj.filters delete mode 100644 examples/addons/networkTcpServerExample/networkTcpServerExample_vs2010.vcxproj.filters delete mode 100644 examples/addons/networkUdpReceiverExample/networkUdpReceiverExample_vs2010.vcxproj.filters delete mode 100644 examples/addons/networkUdpSenderExample/networkUdpSenderExample_vs2010.vcxproj.filters delete mode 100755 examples/addons/opencvExample/opencvExample_vs2010.vcxproj.filters delete mode 100644 examples/addons/opencvHaarFinderExample/ofxCvHaarFinderExample_vs2010.vcxproj.filters delete mode 100644 examples/addons/oscReceiveExample/oscReceiveExample_vs2010.vcxproj.filters delete mode 100644 examples/addons/oscSenderExample/oscSenderExample_vs2010.vcxproj.filters delete mode 100644 examples/addons/threadedImageLoaderExample/threadedImageLoaderExample_vs2010.vcxproj.filters delete mode 100644 examples/addons/vectorGraphicsExample/vectorGraphicsExample_vs2010.vcxproj.filters delete mode 100644 examples/addons/xmlSettingsExample/xmlSettingsExample_vs2010.vcxproj.filters delete mode 100644 examples/math/vectorMathExample/vectorMathExample_vs2010.vcxproj.filters delete mode 100644 examples/utils/dirListExample/dirListExample_vs2010.vcxproj.filters diff --git a/examples/addons/3DModelLoaderExample/3DModelLoaderExample_vs2010.vcxproj.filters b/examples/addons/3DModelLoaderExample/3DModelLoaderExample_vs2010.vcxproj.filters deleted file mode 100644 index fec48416703..00000000000 --- a/examples/addons/3DModelLoaderExample/3DModelLoaderExample_vs2010.vcxproj.filters +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - addons\ofx3dModelLoader\src - - - addons\ofx3dModelLoader\src - - - addons\ofx3dModelLoader\src - - - - - - addons\ofx3dModelLoader\src - - - addons\ofx3dModelLoader\src - - - addons\ofx3dModelLoader\src - - - addons\ofx3dModelLoader\src - - - addons\ofx3dModelLoader\src - - - - - {d79abca0-5b91-4000-9e03-3b535f96d5b9} - - - {ada8fb27-85cb-4972-bf41-4763b23a30d2} - - - {6da16e37-f1fb-485b-bbc8-5020596fb209} - - - \ No newline at end of file diff --git a/examples/addons/allAddonsExample/allAddonsExample_vs2010.vcxproj.filters b/examples/addons/allAddonsExample/allAddonsExample_vs2010.vcxproj.filters deleted file mode 100644 index 249834277a0..00000000000 --- a/examples/addons/allAddonsExample/allAddonsExample_vs2010.vcxproj.filters +++ /dev/null @@ -1,252 +0,0 @@ - - - - - - - addons\ofxXmlSettings\src - - - addons\ofxXmlSettings\libs - - - addons\ofxXmlSettings\libs - - - addons\ofxXmlSettings\libs - - - addons\ofxVectorGraphics\libs - - - addons\ofxVectorGraphics\src - - - addons\ofxNetwork\src - - - addons\ofxNetwork\src - - - addons\ofxNetwork\src - - - addons\ofxNetwork\src - - - addons\ofxOsc\src - - - addons\ofxOsc\src - - - addons\ofxOsc\src - - - addons\ofxOsc\src - - - addons\ofxOpenCv\src - - - addons\ofxOpenCv\src - - - addons\ofxOpenCv\src - - - addons\ofxOpenCv\src - - - addons\ofxOpenCv\src - - - addons\ofxOpenCv\src - - - addons\ofx3dModelLoader\src - - - addons\ofx3dModelLoader\src - - - addons\ofx3dModelLoader\src - - - addons\ofxAssimpLoader\src - - - addons\ofxThreadedImageLoader\src - - - addons\ofxOpenCv\src - - - - - - addons\ofxXmlSettings\src - - - addons\ofxXmlSettings\libs - - - addons\ofxVectorGraphics\libs - - - addons\ofxVectorGraphics\src - - - addons\ofxNetwork\src - - - addons\ofxNetwork\src - - - addons\ofxNetwork\src - - - addons\ofxNetwork\src - - - addons\ofxNetwork\src - - - addons\ofxOsc\src - - - addons\ofxOsc\src - - - addons\ofxOsc\src - - - addons\ofxOsc\src - - - addons\ofxOsc\src - - - addons\ofxOsc\src - - - addons\ofxOpenCv\src - - - addons\ofxOpenCv\src - - - addons\ofxOpenCv\src - - - addons\ofxOpenCv\src - - - addons\ofxOpenCv\src - - - addons\ofxOpenCv\src - - - addons\ofxOpenCv\src - - - addons\ofxOpenCv\src - - - addons\ofxOpenCv\src - - - addons\ofxOpenCv\src - - - addons\ofx3dModelLoader\src - - - addons\ofx3dModelLoader\src - - - addons\ofx3dModelLoader\src - - - addons\ofx3dModelLoader\src - - - addons\ofx3dModelLoader\src - - - addons\ofxAssimpLoader\src - - - addons\ofxAssimpLoader\src - - - addons\ofxAssimpLoader\src - - - addons\ofxThreadedImageLoader\src - - - addons\ofxOpenCv\src - - - - - {d79abca0-5b91-4000-9e03-3b535f96d5b9} - - - {bc41cbd5-9cdc-4132-a2f3-3296b66eb6df} - - - {41a2b0ca-3ef8-475b-97c2-628cf256ce13} - - - {2fd87af0-f487-43df-bd72-856adfbd24b0} - - - {1c7bb1b0-9ed3-4f3b-a662-e17f9aaffbbf} - - - {ada8fb27-85cb-4972-bf41-4763b23a30d2} - - - {7baf9072-e077-4f20-8ff5-c77ca024a50b} - - - {c29adf01-929c-488a-905b-4ea5e58a895c} - - - {526df9d7-c9b8-47b9-a5d8-0bd0f7abfabf} - - - {4986beaf-605c-471a-8870-91ad7967ce90} - - - {809c12a3-2279-4bd9-bbb6-c3240fd0cb4c} - - - {6da16e37-f1fb-485b-bbc8-5020596fb209} - - - {58e01360-6f41-4cc9-ba3a-e1e0ffd3e8cb} - - - {3a0e3e4d-5f79-4a70-acc5-11ccc4383a46} - - - {d818a970-759f-4cdc-9543-d175f3988094} - - - {639fdce7-74c9-4f98-8993-aaa7755fb1b6} - - - {ddf7c392-0ae8-4c9a-a3c3-c6d8edbe7a6c} - - - {9638235e-886e-4974-a501-72550d8508dd} - - - {c07b8ca9-988e-4ae0-80c6-77d9dc8767c6} - - - \ No newline at end of file diff --git a/examples/addons/assimpExample/ofxAssimpExample_vs2010.vcxproj.filters b/examples/addons/assimpExample/ofxAssimpExample_vs2010.vcxproj.filters deleted file mode 100644 index 3f8ddc1299c..00000000000 --- a/examples/addons/assimpExample/ofxAssimpExample_vs2010.vcxproj.filters +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - addons\ofxAssimpLoader\src - - - - - - addons\ofxAssimpLoader\src - - - addons\ofxAssimpLoader\src - - - addons\ofxAssimpLoader\src - - - - - {d79abca0-5b91-4000-9e03-3b535f96d5b9} - - - {639fdce7-74c9-4f98-8993-aaa7755fb1b6} - - - {ddf7c392-0ae8-4c9a-a3c3-c6d8edbe7a6c} - - - \ No newline at end of file diff --git a/examples/addons/networkTcpClientExample/networkTcpClientExample_vs2010.vcxproj.filters b/examples/addons/networkTcpClientExample/networkTcpClientExample_vs2010.vcxproj.filters deleted file mode 100644 index 5a42610cedd..00000000000 --- a/examples/addons/networkTcpClientExample/networkTcpClientExample_vs2010.vcxproj.filters +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - addons\ofxNetwork\src - - - addons\ofxNetwork\src - - - addons\ofxNetwork\src - - - addons\ofxNetwork\src - - - - - - addons\ofxNetwork\src - - - addons\ofxNetwork\src - - - addons\ofxNetwork\src - - - addons\ofxNetwork\src - - - addons\ofxNetwork\src - - - - - {d79abca0-5b91-4000-9e03-3b535f96d5b9} - - - {1c7bb1b0-9ed3-4f3b-a662-e17f9aaffbbf} - - - {526df9d7-c9b8-47b9-a5d8-0bd0f7abfabf} - - - \ No newline at end of file diff --git a/examples/addons/networkTcpServerExample/networkTcpServerExample_vs2010.vcxproj.filters b/examples/addons/networkTcpServerExample/networkTcpServerExample_vs2010.vcxproj.filters deleted file mode 100644 index 5a42610cedd..00000000000 --- a/examples/addons/networkTcpServerExample/networkTcpServerExample_vs2010.vcxproj.filters +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - addons\ofxNetwork\src - - - addons\ofxNetwork\src - - - addons\ofxNetwork\src - - - addons\ofxNetwork\src - - - - - - addons\ofxNetwork\src - - - addons\ofxNetwork\src - - - addons\ofxNetwork\src - - - addons\ofxNetwork\src - - - addons\ofxNetwork\src - - - - - {d79abca0-5b91-4000-9e03-3b535f96d5b9} - - - {1c7bb1b0-9ed3-4f3b-a662-e17f9aaffbbf} - - - {526df9d7-c9b8-47b9-a5d8-0bd0f7abfabf} - - - \ No newline at end of file diff --git a/examples/addons/networkUdpReceiverExample/networkUdpReceiverExample_vs2010.vcxproj.filters b/examples/addons/networkUdpReceiverExample/networkUdpReceiverExample_vs2010.vcxproj.filters deleted file mode 100644 index 5a42610cedd..00000000000 --- a/examples/addons/networkUdpReceiverExample/networkUdpReceiverExample_vs2010.vcxproj.filters +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - addons\ofxNetwork\src - - - addons\ofxNetwork\src - - - addons\ofxNetwork\src - - - addons\ofxNetwork\src - - - - - - addons\ofxNetwork\src - - - addons\ofxNetwork\src - - - addons\ofxNetwork\src - - - addons\ofxNetwork\src - - - addons\ofxNetwork\src - - - - - {d79abca0-5b91-4000-9e03-3b535f96d5b9} - - - {1c7bb1b0-9ed3-4f3b-a662-e17f9aaffbbf} - - - {526df9d7-c9b8-47b9-a5d8-0bd0f7abfabf} - - - \ No newline at end of file diff --git a/examples/addons/networkUdpSenderExample/networkUdpSenderExample_vs2010.vcxproj.filters b/examples/addons/networkUdpSenderExample/networkUdpSenderExample_vs2010.vcxproj.filters deleted file mode 100644 index 5a42610cedd..00000000000 --- a/examples/addons/networkUdpSenderExample/networkUdpSenderExample_vs2010.vcxproj.filters +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - addons\ofxNetwork\src - - - addons\ofxNetwork\src - - - addons\ofxNetwork\src - - - addons\ofxNetwork\src - - - - - - addons\ofxNetwork\src - - - addons\ofxNetwork\src - - - addons\ofxNetwork\src - - - addons\ofxNetwork\src - - - addons\ofxNetwork\src - - - - - {d79abca0-5b91-4000-9e03-3b535f96d5b9} - - - {1c7bb1b0-9ed3-4f3b-a662-e17f9aaffbbf} - - - {526df9d7-c9b8-47b9-a5d8-0bd0f7abfabf} - - - \ No newline at end of file diff --git a/examples/addons/opencvExample/opencvExample_vs2010.vcxproj.filters b/examples/addons/opencvExample/opencvExample_vs2010.vcxproj.filters deleted file mode 100755 index 76d93ee431c..00000000000 --- a/examples/addons/opencvExample/opencvExample_vs2010.vcxproj.filters +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - - addons\ofxOpenCv\src - - - addons\ofxOpenCv\src - - - addons\ofxOpenCv\src - - - addons\ofxOpenCv\src - - - addons\ofxOpenCv\src - - - addons\ofxOpenCv\src - - - addons\ofxOpenCv\src - - - - - - addons\ofxOpenCv\src - - - addons\ofxOpenCv\src - - - addons\ofxOpenCv\src - - - addons\ofxOpenCv\src - - - addons\ofxOpenCv\src - - - addons\ofxOpenCv\src - - - addons\ofxOpenCv\src - - - addons\ofxOpenCv\src - - - addons\ofxOpenCv\src - - - addons\ofxOpenCv\src - - - addons\ofxOpenCv\src - - - - - {d79abca0-5b91-4000-9e03-3b535f96d5b9} - - - {41a2b0ca-3ef8-475b-97c2-628cf256ce13} - - - {809c12a3-2279-4bd9-bbb6-c3240fd0cb4c} - - - \ No newline at end of file diff --git a/examples/addons/opencvHaarFinderExample/ofxCvHaarFinderExample_vs2010.vcxproj.filters b/examples/addons/opencvHaarFinderExample/ofxCvHaarFinderExample_vs2010.vcxproj.filters deleted file mode 100644 index 76d93ee431c..00000000000 --- a/examples/addons/opencvHaarFinderExample/ofxCvHaarFinderExample_vs2010.vcxproj.filters +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - - addons\ofxOpenCv\src - - - addons\ofxOpenCv\src - - - addons\ofxOpenCv\src - - - addons\ofxOpenCv\src - - - addons\ofxOpenCv\src - - - addons\ofxOpenCv\src - - - addons\ofxOpenCv\src - - - - - - addons\ofxOpenCv\src - - - addons\ofxOpenCv\src - - - addons\ofxOpenCv\src - - - addons\ofxOpenCv\src - - - addons\ofxOpenCv\src - - - addons\ofxOpenCv\src - - - addons\ofxOpenCv\src - - - addons\ofxOpenCv\src - - - addons\ofxOpenCv\src - - - addons\ofxOpenCv\src - - - addons\ofxOpenCv\src - - - - - {d79abca0-5b91-4000-9e03-3b535f96d5b9} - - - {41a2b0ca-3ef8-475b-97c2-628cf256ce13} - - - {809c12a3-2279-4bd9-bbb6-c3240fd0cb4c} - - - \ No newline at end of file diff --git a/examples/addons/oscReceiveExample/oscReceiveExample_vs2010.vcxproj.filters b/examples/addons/oscReceiveExample/oscReceiveExample_vs2010.vcxproj.filters deleted file mode 100644 index 8235e9e0a86..00000000000 --- a/examples/addons/oscReceiveExample/oscReceiveExample_vs2010.vcxproj.filters +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - addons\ofxOsc\src - - - addons\ofxOsc\src - - - addons\ofxOsc\src - - - addons\ofxOsc\src - - - - - - addons\ofxOsc\src - - - addons\ofxOsc\src - - - addons\ofxOsc\src - - - addons\ofxOsc\src - - - addons\ofxOsc\src - - - addons\ofxOsc\src - - - - - {d79abca0-5b91-4000-9e03-3b535f96d5b9} - - - {2fd87af0-f487-43df-bd72-856adfbd24b0} - - - {4986beaf-605c-471a-8870-91ad7967ce90} - - - \ No newline at end of file diff --git a/examples/addons/oscSenderExample/oscSenderExample_vs2010.vcxproj.filters b/examples/addons/oscSenderExample/oscSenderExample_vs2010.vcxproj.filters deleted file mode 100644 index 8235e9e0a86..00000000000 --- a/examples/addons/oscSenderExample/oscSenderExample_vs2010.vcxproj.filters +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - addons\ofxOsc\src - - - addons\ofxOsc\src - - - addons\ofxOsc\src - - - addons\ofxOsc\src - - - - - - addons\ofxOsc\src - - - addons\ofxOsc\src - - - addons\ofxOsc\src - - - addons\ofxOsc\src - - - addons\ofxOsc\src - - - addons\ofxOsc\src - - - - - {d79abca0-5b91-4000-9e03-3b535f96d5b9} - - - {2fd87af0-f487-43df-bd72-856adfbd24b0} - - - {4986beaf-605c-471a-8870-91ad7967ce90} - - - \ No newline at end of file diff --git a/examples/addons/threadedImageLoaderExample/threadedImageLoaderExample_vs2010.vcxproj.filters b/examples/addons/threadedImageLoaderExample/threadedImageLoaderExample_vs2010.vcxproj.filters deleted file mode 100644 index b08ea028a4a..00000000000 --- a/examples/addons/threadedImageLoaderExample/threadedImageLoaderExample_vs2010.vcxproj.filters +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - addons\ofxThreadedImageLoader\src - - - - - - addons\ofxThreadedImageLoader\src - - - - - {d79abca0-5b91-4000-9e03-3b535f96d5b9} - - - {9638235e-886e-4974-a501-72550d8508dd} - - - {c07b8ca9-988e-4ae0-80c6-77d9dc8767c6} - - - \ No newline at end of file diff --git a/examples/addons/vectorGraphicsExample/vectorGraphicsExample_vs2010.vcxproj.filters b/examples/addons/vectorGraphicsExample/vectorGraphicsExample_vs2010.vcxproj.filters deleted file mode 100644 index b7961127825..00000000000 --- a/examples/addons/vectorGraphicsExample/vectorGraphicsExample_vs2010.vcxproj.filters +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - addons\ofxVectorGraphics\libs - - - addons\ofxVectorGraphics\src - - - - - - addons\ofxVectorGraphics\libs - - - addons\ofxVectorGraphics\src - - - - - {d79abca0-5b91-4000-9e03-3b535f96d5b9} - - - {bc41cbd5-9cdc-4132-a2f3-3296b66eb6df} - - - {7baf9072-e077-4f20-8ff5-c77ca024a50b} - - - {c29adf01-929c-488a-905b-4ea5e58a895c} - - - \ No newline at end of file diff --git a/examples/addons/xmlSettingsExample/xmlSettingsExample_vs2010.vcxproj.filters b/examples/addons/xmlSettingsExample/xmlSettingsExample_vs2010.vcxproj.filters deleted file mode 100644 index 1699449ba2c..00000000000 --- a/examples/addons/xmlSettingsExample/xmlSettingsExample_vs2010.vcxproj.filters +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - addons\ofxXmlSettings\src - - - addons\ofxXmlSettings\libs - - - addons\ofxXmlSettings\libs - - - addons\ofxXmlSettings\libs - - - - - - addons\ofxXmlSettings\src - - - addons\ofxXmlSettings\libs - - - - - {d79abca0-5b91-4000-9e03-3b535f96d5b9} - - - {58e01360-6f41-4cc9-ba3a-e1e0ffd3e8cb} - - - {3a0e3e4d-5f79-4a70-acc5-11ccc4383a46} - - - {d818a970-759f-4cdc-9543-d175f3988094} - - - \ No newline at end of file diff --git a/examples/math/vectorMathExample/vectorMathExample_vs2010.vcxproj.filters b/examples/math/vectorMathExample/vectorMathExample_vs2010.vcxproj.filters deleted file mode 100644 index 412dfe54836..00000000000 --- a/examples/math/vectorMathExample/vectorMathExample_vs2010.vcxproj.filters +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - addons\ofxVectorMath\src - - - addons\ofxVectorMath\src - - - - - - addons\ofxVectorMath\src - - - addons\ofxVectorMath\src - - - addons\ofxVectorMath\src - - - addons\ofxVectorMath\src - - - addons\ofxVectorMath\src - - - addons\ofxVectorMath\src - - - addons\ofxVectorMath\src - - - addons\ofxVectorMath\src - - - addons\ofxVectorMath\src - - - addons\ofxVectorMath\src - - - - - {d79abca0-5b91-4000-9e03-3b535f96d5b9} - - - {47810f4a-2c4c-42ed-b8a5-35657491c4ee} - - - {a757a915-b92d-49f5-b795-ccc4d4c3015a} - - - \ No newline at end of file diff --git a/examples/utils/dirListExample/dirListExample_vs2010.vcxproj.filters b/examples/utils/dirListExample/dirListExample_vs2010.vcxproj.filters deleted file mode 100644 index 459adb5046c..00000000000 --- a/examples/utils/dirListExample/dirListExample_vs2010.vcxproj.filters +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - addons\ofxDirList\src - - - - - - addons\ofxDirList\src - - - - - {d79abca0-5b91-4000-9e03-3b535f96d5b9} - - - {0fab281c-c04c-4e5d-a93e-5a9095820a41} - - - {931fbf73-7dac-4432-b9d1-d18e5baf44a8} - - - \ No newline at end of file From 4f6a0f65cc84d51d3d68ca7b7289d168b53bf65c Mon Sep 17 00:00:00 2001 From: Christoph Buchner Date: Sun, 22 Apr 2012 22:15:50 +0200 Subject: [PATCH 11/13] Remove wrongly committed local.properties file. --- addons/ofxAndroid/ofAndroidLib/local.properties | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 addons/ofxAndroid/ofAndroidLib/local.properties diff --git a/addons/ofxAndroid/ofAndroidLib/local.properties b/addons/ofxAndroid/ofAndroidLib/local.properties deleted file mode 100644 index 7d35be1bf12..00000000000 --- a/addons/ofxAndroid/ofAndroidLib/local.properties +++ /dev/null @@ -1,10 +0,0 @@ -# This file is automatically generated by Android Tools. -# Do not modify this file -- YOUR CHANGES WILL BE ERASED! -# -# This file must *NOT* be checked in Version Control Systems, -# as it contains information specific to your local configuration. - -# location of the SDK. This is only used by Ant -# For customization when using a Version Control System, please read the -# header note. -sdk.dir=/home/arturo/Downloads/android-sdk-linux From 2f849f20e67610f3fb956099522359ee6200e7fa Mon Sep 17 00:00:00 2001 From: Christoph Buchner Date: Tue, 24 Apr 2012 20:58:36 +0200 Subject: [PATCH 12/13] Revert "Remove Android examples' config.make and Makefile." This reverts commit 3c4d32191fd66023123c955632bede9cfa1d5857. Conflicts: examples/android/androidEmptyExample/Makefile examples/android/androidEmptyExample/config.make --- .../androidAdvanced3DExample/config.make | 32 ++ .../android/androidAssimpExample/Makefile | 475 ++++++++++++++++++ .../android/androidAssimpExample/config.make | 32 ++ examples/android/androidAudioExample/Makefile | 475 ++++++++++++++++++ .../android/androidAudioExample/config.make | 32 ++ .../android/androidCameraExample/Makefile | 475 ++++++++++++++++++ .../android/androidCameraExample/config.make | 32 ++ examples/android/androidFontExample/Makefile | 475 ++++++++++++++++++ .../android/androidFontExample/config.make | 32 ++ examples/android/androidImageExample/Makefile | 475 ++++++++++++++++++ .../android/androidImageExample/config.make | 32 ++ .../android/androidOpenCVExample/Makefile | 475 ++++++++++++++++++ .../android/androidOpenCVExample/config.make | 32 ++ .../android/androidPolygonExample/Makefile | 475 ++++++++++++++++++ .../android/androidPolygonExample/config.make | 32 ++ .../androidSoundPlayerExample/Makefile | 475 ++++++++++++++++++ .../androidSoundPlayerExample/config.make | 32 ++ examples/android/androidTouchExample/Makefile | 475 ++++++++++++++++++ .../android/androidTouchExample/config.make | 32 ++ examples/android/androidVBOExample/Makefile | 475 ++++++++++++++++++ .../android/androidVBOExample/config.make | 32 ++ 21 files changed, 5102 insertions(+) create mode 100644 examples/android/androidAdvanced3DExample/config.make create mode 100644 examples/android/androidAssimpExample/Makefile create mode 100644 examples/android/androidAssimpExample/config.make create mode 100644 examples/android/androidAudioExample/Makefile create mode 100644 examples/android/androidAudioExample/config.make create mode 100644 examples/android/androidCameraExample/Makefile create mode 100644 examples/android/androidCameraExample/config.make create mode 100644 examples/android/androidFontExample/Makefile create mode 100644 examples/android/androidFontExample/config.make create mode 100644 examples/android/androidImageExample/Makefile create mode 100644 examples/android/androidImageExample/config.make create mode 100644 examples/android/androidOpenCVExample/Makefile create mode 100644 examples/android/androidOpenCVExample/config.make create mode 100644 examples/android/androidPolygonExample/Makefile create mode 100644 examples/android/androidPolygonExample/config.make create mode 100644 examples/android/androidSoundPlayerExample/Makefile create mode 100644 examples/android/androidSoundPlayerExample/config.make create mode 100644 examples/android/androidTouchExample/Makefile create mode 100644 examples/android/androidTouchExample/config.make create mode 100644 examples/android/androidVBOExample/Makefile create mode 100644 examples/android/androidVBOExample/config.make diff --git a/examples/android/androidAdvanced3DExample/config.make b/examples/android/androidAdvanced3DExample/config.make new file mode 100644 index 00000000000..8266e5d914e --- /dev/null +++ b/examples/android/androidAdvanced3DExample/config.make @@ -0,0 +1,32 @@ +# add custom variables to this file + +# OF_ROOT allows to move projects outside apps/* just set this variable to the +# absoulte path to the OF root folder + +OF_ROOT = ../../.. + + +# USER_CFLAGS allows to pass custom flags to the compiler +# for example search paths like: +# USER_CFLAGS = -I src/objects + +USER_CFLAGS = + + +# USER_LDFLAGS allows to pass custom flags to the linker +# for example libraries like: +# USER_LD_FLAGS = libs/libawesomelib.a + +USER_LDFLAGS = + +# android specific, in case you want to use different optimizations +USER_LIBS_ARM = +USER_LIBS_ARM7 = +USER_LIBS_NEON = + +# android optimizations + +ANDROID_COMPILER_OPTIMIZATION = -Os + + +EXCLUDE_FROM_SOURCE="bin,.xcodeproj,obj" diff --git a/examples/android/androidAssimpExample/Makefile b/examples/android/androidAssimpExample/Makefile new file mode 100644 index 00000000000..f61fe5d517a --- /dev/null +++ b/examples/android/androidAssimpExample/Makefile @@ -0,0 +1,475 @@ +# openFrameworks universal makefile +# +# make help : shows this message +# make Debug: makes the application with debug symbols +# make Release: makes the app with optimizations +# make: the same as make Release +# make CleanDebug: cleans the Debug target +# make CleanRelease: cleans the Release target +# make clean: cleans everything +# +# +# this should work with any OF app, just copy any example +# change the name of the folder and it should compile +# only .cpp support, don't use .c files +# it will look for files in any folder inside the application +# folder except that in the EXCLUDE_FROM_SOURCE variable +# it doesn't autodetect include paths yet +# add the include paths in the USER_CFLAGS variable +# using the gcc syntax: -Ipath +# +# to add addons to your application, edit the addons.make file +# in this directory and add the names of the addons you want to +# include +# +# edit the following vars to customize the makefile + +include config.make + +ifeq ($(findstring Android,$(MAKECMDGOALS)),Android) + include $(OF_ROOT)/libs/openFrameworksCompiled/project/android/paths.make + ARCH = android + ifeq ($(shell uname),Darwin) + HOST_PLATFORM = darwin-x86 + else + HOST_PLATFORM = linux-x86 + endif +endif + +ifeq ($(ARCH),android) + COMPILER_OPTIMIZATION = $(ANDROID_COMPILER_OPTIMIZATION) + NDK_PLATFORM = android-8 +else + COMPILER_OPTIMIZATION = $(USER_COMPILER_OPTIMIZATION) +endif + + + + +# you shouldn't modify anything below this line + + +SHELL = /bin/sh +ifneq ($(ARCH),android) + CXX = g++ + ARCH = $(shell uname -m) + ifeq ($(ARCH),x86_64) + LIBSPATH=linux64 + else + LIBSPATH=linux + endif +else + ifeq ($(findstring Release_arm7,$(MAKECMDGOALS)),Release_arm7) + LIBSPATH =android/armeabi-v7a + else + LIBSPATH =android/armeabi + endif + #NDK_ROOT = $(shell cat $(OF_ROOT)/libs/openFrameworksCompiled/project/android/ndk_path.make) + #SDK_ROOT = $(shell cat $(OF_ROOT)/libs/openFrameworksCompiled/project/android/sdk_path.make) + TOOLCHAIN=arm-linux-androideabi-4.4.3 + TOOLCHAIN_PATH=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/ + ANDROID_PREFIX=arm-linux-androideabi- + CC=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)gcc + CXX=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)g++ + AR=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)ar + SYSROOT=$(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/ + CFLAGS += -nostdlib --sysroot=$(SYSROOT) -fno-short-enums + CFLAGS += -I"$(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" -I"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/include/" -I"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include" + CFLAGS += -DANDROID +endif + +NODEPS = clean +SED_EXCLUDE_FROM_SRC = $(shell echo $(EXCLUDE_FROM_SOURCE) | sed s/\,/\\\\\|/g) +SOURCE_DIRS = $(shell find . -maxdepth 1 -mindepth 1 -type d | grep -v $(SED_EXCLUDE_FROM_SRC) | sed s/.\\///) +SOURCES = $(shell find $(SOURCE_DIRS) -name "*.cpp" -or -name "*.c" -or -name "*.cc") +OBJFILES = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(patsubst %.cc,%.o,$(SOURCES)))) + +ifneq (,$(USER_SOURCE_DIR)) + USER_SOURCES = $(shell find $(USER_SOURCE_DIR) -name "*.cpp" -or -name "*.c" -or -name "*.cc") + USER_OBJFILES = $(subst $(USER_SOURCE_DIR)/, ,$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(patsubst %.cc,%.o,$(USER_SOURCES))))) +endif + +APPNAME = $(shell basename `pwd`) +CORE_INCLUDES = $(shell find $(OF_ROOT)/libs/openFrameworks/ -type d) +CORE_INCLUDE_FLAGS = $(addprefix -I,$(CORE_INCLUDES)) +INCLUDES = $(shell find $(OF_ROOT)/libs/*/include -type d | grep -v glu | grep -v quicktime | grep -v poco) +INCLUDES_FLAGS = $(addprefix -I,$(INCLUDES)) +INCLUDES_FLAGS += -I$(OF_ROOT)/libs/poco/include +ifeq ($(ARCH),android) + INCLUDES_FLAGS += -I$(OF_ROOT)/libs/glu/include_android +else + INCLUDES_FLAGS += -I$(OF_ROOT)/libs/glu/include + INCLUDES_FLAGS += $(shell pkg-config glew gstreamer-0.10 gstreamer-video-0.10 gstreamer-base-0.10 libudev --cflags) + #check if gtk exists and add it + GTK = $(shell pkg-config gtk+-2.0 --exists; echo $$?) + ifeq ($(GTK),0) + CFLAGS += $(shell pkg-config gtk+-2.0 --cflags) -DOF_USING_GTK + SYSTEMLIBS += $(shell pkg-config gtk+-2.0 --libs) + endif + + #check if mpg123 exists and add it + MPG123 = $(shell pkg-config libmpg123 --exists; echo $$?) + ifeq ($(MPG123),0) + CFLAGS += -DOF_USING_MPG123 + SYSTEMLIBS += -lmpg123 + endif +endif +LIB_STATIC = $(shell ls $(OF_ROOT)/libs/*/lib/$(LIBSPATH)/*.a 2> /dev/null | grep -v openFrameworksCompiled | grep -v Poco) +LIB_SHARED = $(shell ls $(OF_ROOT)/libs/*/lib/$(LIBSPATH)/*.so 2> /dev/null | grep -v openFrameworksCompiled | sed "s/.*\\/lib\([^/]*\)\.so/-l\1/") +LIB_STATIC += $(OF_ROOT)/libs/poco/lib/$(LIBSPATH)/libPocoNet.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoXML.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoUtil.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoFoundation.a +LIB_PATHS_FLAGS = $(shell ls -d $(OF_ROOT)/libs/*/lib/$(LIBSPATH) | sed "s/\(\.*\)/-L\1/") + +CFLAGS += -Wall -fexceptions +CFLAGS += -I. +CFLAGS += $(INCLUDES_FLAGS) +CFLAGS += $(CORE_INCLUDE_FLAGS) + + + +ifeq ($(ARCH),android) + LDFLAGS = --sysroot=$(SYSROOT) -nostdlib -L"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi" + SYSTEMLIBS += -lstdc++ -lsupc++ -lgcc -lz -lGLESv1_CM -llog -ldl -lm -lc +else + LDFLAGS = -Wl,-rpath=./libs + SYSTEMLIBS += $(shell pkg-config jack glew gstreamer-0.10 gstreamer-video-0.10 gstreamer-base-0.10 gstreamer-app-0.10 libudev --libs) + SYSTEMLIBS += -lglut -lGL -lasound -lopenal -lsndfile -lvorbis -lFLAC -logg -lfreeimage +endif + + +ifeq ($(findstring addons.make,$(wildcard *.make)),addons.make) + ifneq ($(ARCH),android) + ADDONS = $(shell cat addons.make | grep -v ofxAndroid) + else + ADDONS = $(shell cat addons.make) + endif + + ifneq ($(strip $(ADDONS)),) + ADDONS_REL_DIRS = $(addsuffix /src, $(ADDONS)) + ADDONS_LIBS_REL_DIRS = $(addsuffix /libs, $(ADDONS)) + ADDONS_DIRS = $(addprefix $(OF_ROOT)/addons/, $(ADDONS_REL_DIRS) ) + ADDONS_LIBS_DIRS = $(addprefix $(OF_ROOT)/addons/, $(ADDONS_LIBS_REL_DIRS) ) + ADDONS_BIN_LIBS_DIRS = $(addsuffix /*/lib/$(LIBSPATH), $(ADDONS_LIBS_DIRS) ) + + ADDONS_INCLUDES = $(ADDONS_DIRS) + ADDONS_INCLUDES = $(ADDONS_LIBS_DIRS) + ADDONS_INCLUDES += $(shell find $(ADDONS_DIRS) -type d 2> /dev/null) + ADDONS_INCLUDES += $(shell find $(ADDONS_LIBS_DIRS) -type d 2> /dev/null) + ADDONSCFLAGS = $(addprefix -I,$(ADDONS_INCLUDES)) + + ifeq ($(findstring libsorder.make,$(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null)),libsorder.make) + ADDONS_LIBS_W_ORDER = $(shell cat $(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null)) + EXCLUDE_LIBS_FILTER = $(addprefix %,$(addsuffix .a,$(ADDONS_LIBS_W_ORDER))) + ADDONS_LIBS_STATICS = $(filter-out $(EXCLUDE_LIBS_FILTER), $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.a)) + ADDONS_LIBS_STATICS += $(addprefix -l, $(ADDONS_LIBS_W_ORDER)) + ADDONS_LIBS_STATICS += $(addprefix -L, $(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null | sed s/libsorder.make//g)) + else + ADDONS_LIBS_STATICS = $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.a 2> /dev/null) + endif + + ADDONS_LIBS_SHARED = $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.so 2> /dev/null) + ADDONSLIBS = $(ADDONS_LIBS_STATICS) + ADDONSLIBS += $(ADDONS_LIBS_SHARED) + + + ADDONS_SOURCES = $(shell find $(ADDONS_DIRS) -name "*.cpp" -or -name "*.c" 2> /dev/null) + ADDONS_SOURCES += $(shell find $(ADDONS_LIBS_DIRS) -name "*.cpp" -or -name "*.c" -or -name "*.cc" 2>/dev/null) + ADDONS_OBJFILES = $(subst $(OF_ROOT)/, ,$(patsubst %.cc,%.o,$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(ADDONS_SOURCES))))) + endif +endif + + +ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) + TARGET_CFLAGS = -g + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworksDebug.a + TARGET_NAME = Debug +endif + +ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) + TARGET_CFLAGS = $(COMPILER_OPTIMIZATION) + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworks.a + TARGET_NAME = Release +endif + +ifeq ($(ARCH),android) + ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) + TARGET = libs/armeabi/libOFAndroidApp.so + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworksDebug.a + LDFLAGS += -Wl,--fix-cortex-a8 -shared + USER_LIBS = $(USER_LIBS_ARM) + endif + + ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) + TARGET = libs/armeabi/libOFAndroidApp.so + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks.a + LDFLAGS += -Wl,--fix-cortex-a8 -shared + USER_LIBS = $(USER_LIBS_ARM) + endif + + ifeq ($(findstring Release_arm7,$(MAKECMDGOALS)),Release_arm7) + TARGET_NAME = Release_arm7 + TARGET_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mthumb + TARGET = libs/armeabi-v7a/libOFAndroidApp.so + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks_arm7.a + USER_LIBS = $(USER_LIBS_ARM7) + endif + + ifeq ($(findstring Release_neon,$(MAKECMDGOALS)),Release_neon) + TARGET_NAME = Release_neon + TARGET_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mfpu=neon + TARGET = libs/armeabi-v7a/libOFAndroidApp_neon.so + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks_neon.a + USER_LIBS = $(USER_LIBS_NEON) + endif + + ifeq ($(findstring TestLink,$(MAKECMDGOALS)),TestLink) + TARGET_NAME = Debug + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworksDebug.a + LDFLAGS += -Wl,--entry=main,--fix-cortex-a8 + BIN_NAME = $(APPNAME) + TARGET = obj/$(BIN_NAME) + USER_LIBS = $(USER_LIBS_ARM) + endif +else + ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) + BIN_NAME = $(APPNAME)_debug + TARGET = bin/$(BIN_NAME) + endif + + ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) + BIN_NAME = $(APPNAME) + TARGET = bin/$(BIN_NAME) + endif + + ifeq ($(MAKECMDGOALS),) + TARGET_NAME = Release + BIN_NAME = $(APPNAME) + TARGET = bin/$(BIN_NAME) + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworks.a + endif +endif + +ifeq ($(MAKECMDGOALS),clean) + TARGET = bin/$(APPNAME)_debug bin/$(APPNAME) + TARGET_NAME = Release +endif + +ifeq ($(MAKECMDGOALS),AndroidInstall) + TARGET_NAME = Install +endif + +OBJ_OUTPUT = obj/$(ARCH)$(TARGET_NAME)/ +CLEANTARGET = clean$(TARGET_NAME) + +OBJS = $(addprefix $(OBJ_OUTPUT), $(OBJFILES)) +DEPFILES = $(patsubst %.o,%.d,$(OBJS)) + +USER_OBJS = $(addprefix $(OBJ_OUTPUT), $(USER_OBJFILES)) +DEPFILES += $(patsubst %.o,%.d,$(USER_OBJS)) + +ifeq ($(findstring addons.make,$(wildcard *.make)),addons.make) + ADDONS_OBJS = $(addprefix $(OBJ_OUTPUT), $(ADDONS_OBJFILES)) + DEPFILES += $(patsubst %.o,%.d,$(ADDONS_OBJS)) +endif + +.PHONY: Debug Release all after afterDebugAndroid afterReleaseAndroid + +Release: $(TARGET) after + +Debug: $(TARGET) after + +all: + $(MAKE) Release + +DebugAndroid: $(TARGET) + +ReleaseAndroid: $(TARGET) + +Release_arm7Android: $(TARGET) + +Release_neonAndroid: $(TARGET) afterReleaseAndroid + +TestLinkAndroid: $(TARGET) afterDebugAndroid + +AndroidDebug: + $(MAKE) DebugAndroid + $(MAKE) TestLinkAndroid + +AndroidRelease: + $(MAKE) ReleaseAndroid + $(MAKE) Release_arm7Android + $(MAKE) Release_neonAndroid + + +#This rule does the compilation +#$(OBJS): $(SOURCES) +$(OBJ_OUTPUT)%.o: %.cpp + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CXX) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: %.c + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CC) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: %.cc + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CC) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.cpp + @echo "compiling addon object for" $< + mkdir -p $(@D) + $(CXX) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< + +$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.c + @echo "compiling addon object for" $< + mkdir -p $(@D) + $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< + +$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.cc + @echo "compiling addon object for" $< + mkdir -p $(@D) + $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< + +$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.c + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.cc + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.cpp + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CXX) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(TARGET): $(OBJS) $(ADDONS_OBJS) $(USER_OBJS) $(TARGET_LIBS) $(LIB_STATIC) + @echo 'linking $(TARGET)' + mkdir -p $(@D) + $(CXX) -o $@ $(OBJS) $(ADDONS_OBJS) $(USER_OBJS) $(LDFLAGS) $(USER_LDFLAGS) $(TARGET_LIBS) $(ADDONSLIBS) $(USER_LIBS) $(LIB_STATIC) $(LIB_PATHS_FLAGS) $(LIB_SHARED) $(SYSTEMLIBS) + +-include $(DEPFILES) + +.PHONY: clean cleanDebug cleanRelease CleanAndroid +clean: + rm -rf $(OBJ_OUTPUT) + rm -f $(TARGET) + rm -r bin/libs + +$(CLEANTARGET): + rm -rf $(OBJ_OUTPUT) + rm -f $(TARGET) + rm -rf bin/libs + +CleanAndroid: + rm -Rf obj + rm -f libs/armeabi-v7a/libOFAndroidApp.so + rm -f libs/armeabi/libOFAndroidApp.so + rm -f obj/$(APPNAME) + + +afterDebugAndroid:$(TARGET) + @if [ -d libs/armeabi-v7a ]; then rm -r libs/armeabi-v7a; fi + + @cp $(NDK_ROOT)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver libs/armeabi + + #create gdb.setup for armeabi + @echo "set solib-search-path $(PWD)/obj/local/armeabi:$(PWD)/libs/armeabi" > libs/armeabi/gdb.setup + @echo "directory $(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" >> libs/armeabi/gdb.setup + @echo "directory $(PWD)/src" >> libs/armeabi/gdb.setup + @echo "directory $(NDK_ROOT)/sources/cxx-stl/system" >> libs/armeabi/gdb.setup + @echo "directory $(PWD)/libs/armeabi" >> libs/armeabi/gdb.setup + @echo "" >> libs/armeabi/gdb.setup + + @if [ ! -d jni ]; then mkdir jni; fi + @echo "APP_ABI := armeabi" > jni/Application.mk + @echo "#LOCAL_MODULE := OFAndroidApp" > jni/Android.mk + +afterReleaseAndroid:$(TARGET) + @if [ -f obj/$(BIN_NAME) ]; then rm obj/$(BIN_NAME); fi + + @cp $(OF_ROOT)/libs/openFrameworksCompiled/project/android/libneondetection.so libs/armeabi-v7a/ + @cp $(NDK_ROOT)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver libs/armeabi-v7a + + #create gdb.setup for armeabi-v7a + @echo "set solib-search-path $(PWD)/obj/local/armeabi-v7a:$(PWD)/libs/armeabi-v7a" > libs/armeabi-v7a/gdb.setup + @echo "directory $(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" >> libs/armeabi-v7a/gdb.setup + @echo "directory $(PWD)/src" >> libs/armeabi-v7a/gdb.setup + @echo "directory $(NDK_ROOT)/sources/cxx-stl/system" >> libs/armeabi-v7a/gdb.setup + @echo "directory $(PWD)/libs/armeabi-v7a" >> libs/armeabi-v7a/gdb.setup + @echo "" >> libs/armeabi-v7a/gdb.setup + + @if [ ! -d jni ]; then mkdir jni; fi + @echo "APP_ABI := armeabi armeabi-v7a" > jni/Application.mk + @echo "#LOCAL_MODULE := OFAndroidApp" > jni/Android.mk + +RESNAME=$(shell echo $(APPNAME)Resources | tr '[A-Z]' '[a-z]') + +AndroidInstall: + if [ -d "bin/data" ]; then \ + mkdir -p res/raw; \ + rm res/raw/$(RESNAME).zip; \ + cd bin/data; \ + zip -r ../../res/raw/$(RESNAME).zip *; \ + cd ../..; \ + fi + if [ -f obj/$(BIN_NAME) ]; then rm obj/$(BIN_NAME); fi + #touch AndroidManifest.xml + $(SDK_ROOT)/tools/android update project --target $(NDK_PLATFORM) --path $(PROJECT_PATH) + if [ -d bin/classes ]; then rm -r bin/classes; fi + if [ -d bin/classes.dex ]; then rm bin/classes.dex; fi + if [ -d bin/OFActivity.ap_ ]; then rm bin/OFActivity.ap_; fi + if [ -d bin/OFActivity-debug.apk ]; then rm bin/OFActivity-debug.apk; fi + if [ -d bin/OFActivity-debug-unaligned.apk ]; then rm bin/OFActivity-debug-unaligned.apk; fi + if [ -d bin/$(APPNAME).apk ]; then rm bin/$(APPNAME).apk; fi + ant debug + cp bin/OFActivity-debug.apk bin/$(APPNAME).apk + #if [ "$(shell $(SDK_ROOT)/platform-tools/adb get-state)" = "device" ]; then + $(SDK_ROOT)/platform-tools/adb install -r bin/$(APPNAME).apk; + #fi + $(SDK_ROOT)/platform-tools/adb shell am start -a android.intent.action.MAIN -n cc.openframeworks.$(APPNAME)/cc.openframeworks.$(APPNAME).OFActivity + + +after:$(TARGET) + cp -r $(OF_ROOT)/export/$(LIBSPATH)/libs bin/ + @echo + @echo " compiling done" + @echo " to launch the application" + @echo + @echo " cd bin" + @echo " ./$(BIN_NAME)" + @echo + + +.PHONY: help +help: + @echo + @echo openFrameworks universal makefile + @echo + @echo targets: + @echo "make Debug: builds the application with debug symbols" + @echo "make Release: builds the app 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 + @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 diff --git a/examples/android/androidAssimpExample/config.make b/examples/android/androidAssimpExample/config.make new file mode 100644 index 00000000000..8266e5d914e --- /dev/null +++ b/examples/android/androidAssimpExample/config.make @@ -0,0 +1,32 @@ +# add custom variables to this file + +# OF_ROOT allows to move projects outside apps/* just set this variable to the +# absoulte path to the OF root folder + +OF_ROOT = ../../.. + + +# USER_CFLAGS allows to pass custom flags to the compiler +# for example search paths like: +# USER_CFLAGS = -I src/objects + +USER_CFLAGS = + + +# USER_LDFLAGS allows to pass custom flags to the linker +# for example libraries like: +# USER_LD_FLAGS = libs/libawesomelib.a + +USER_LDFLAGS = + +# android specific, in case you want to use different optimizations +USER_LIBS_ARM = +USER_LIBS_ARM7 = +USER_LIBS_NEON = + +# android optimizations + +ANDROID_COMPILER_OPTIMIZATION = -Os + + +EXCLUDE_FROM_SOURCE="bin,.xcodeproj,obj" diff --git a/examples/android/androidAudioExample/Makefile b/examples/android/androidAudioExample/Makefile new file mode 100644 index 00000000000..f61fe5d517a --- /dev/null +++ b/examples/android/androidAudioExample/Makefile @@ -0,0 +1,475 @@ +# openFrameworks universal makefile +# +# make help : shows this message +# make Debug: makes the application with debug symbols +# make Release: makes the app with optimizations +# make: the same as make Release +# make CleanDebug: cleans the Debug target +# make CleanRelease: cleans the Release target +# make clean: cleans everything +# +# +# this should work with any OF app, just copy any example +# change the name of the folder and it should compile +# only .cpp support, don't use .c files +# it will look for files in any folder inside the application +# folder except that in the EXCLUDE_FROM_SOURCE variable +# it doesn't autodetect include paths yet +# add the include paths in the USER_CFLAGS variable +# using the gcc syntax: -Ipath +# +# to add addons to your application, edit the addons.make file +# in this directory and add the names of the addons you want to +# include +# +# edit the following vars to customize the makefile + +include config.make + +ifeq ($(findstring Android,$(MAKECMDGOALS)),Android) + include $(OF_ROOT)/libs/openFrameworksCompiled/project/android/paths.make + ARCH = android + ifeq ($(shell uname),Darwin) + HOST_PLATFORM = darwin-x86 + else + HOST_PLATFORM = linux-x86 + endif +endif + +ifeq ($(ARCH),android) + COMPILER_OPTIMIZATION = $(ANDROID_COMPILER_OPTIMIZATION) + NDK_PLATFORM = android-8 +else + COMPILER_OPTIMIZATION = $(USER_COMPILER_OPTIMIZATION) +endif + + + + +# you shouldn't modify anything below this line + + +SHELL = /bin/sh +ifneq ($(ARCH),android) + CXX = g++ + ARCH = $(shell uname -m) + ifeq ($(ARCH),x86_64) + LIBSPATH=linux64 + else + LIBSPATH=linux + endif +else + ifeq ($(findstring Release_arm7,$(MAKECMDGOALS)),Release_arm7) + LIBSPATH =android/armeabi-v7a + else + LIBSPATH =android/armeabi + endif + #NDK_ROOT = $(shell cat $(OF_ROOT)/libs/openFrameworksCompiled/project/android/ndk_path.make) + #SDK_ROOT = $(shell cat $(OF_ROOT)/libs/openFrameworksCompiled/project/android/sdk_path.make) + TOOLCHAIN=arm-linux-androideabi-4.4.3 + TOOLCHAIN_PATH=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/ + ANDROID_PREFIX=arm-linux-androideabi- + CC=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)gcc + CXX=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)g++ + AR=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)ar + SYSROOT=$(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/ + CFLAGS += -nostdlib --sysroot=$(SYSROOT) -fno-short-enums + CFLAGS += -I"$(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" -I"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/include/" -I"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include" + CFLAGS += -DANDROID +endif + +NODEPS = clean +SED_EXCLUDE_FROM_SRC = $(shell echo $(EXCLUDE_FROM_SOURCE) | sed s/\,/\\\\\|/g) +SOURCE_DIRS = $(shell find . -maxdepth 1 -mindepth 1 -type d | grep -v $(SED_EXCLUDE_FROM_SRC) | sed s/.\\///) +SOURCES = $(shell find $(SOURCE_DIRS) -name "*.cpp" -or -name "*.c" -or -name "*.cc") +OBJFILES = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(patsubst %.cc,%.o,$(SOURCES)))) + +ifneq (,$(USER_SOURCE_DIR)) + USER_SOURCES = $(shell find $(USER_SOURCE_DIR) -name "*.cpp" -or -name "*.c" -or -name "*.cc") + USER_OBJFILES = $(subst $(USER_SOURCE_DIR)/, ,$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(patsubst %.cc,%.o,$(USER_SOURCES))))) +endif + +APPNAME = $(shell basename `pwd`) +CORE_INCLUDES = $(shell find $(OF_ROOT)/libs/openFrameworks/ -type d) +CORE_INCLUDE_FLAGS = $(addprefix -I,$(CORE_INCLUDES)) +INCLUDES = $(shell find $(OF_ROOT)/libs/*/include -type d | grep -v glu | grep -v quicktime | grep -v poco) +INCLUDES_FLAGS = $(addprefix -I,$(INCLUDES)) +INCLUDES_FLAGS += -I$(OF_ROOT)/libs/poco/include +ifeq ($(ARCH),android) + INCLUDES_FLAGS += -I$(OF_ROOT)/libs/glu/include_android +else + INCLUDES_FLAGS += -I$(OF_ROOT)/libs/glu/include + INCLUDES_FLAGS += $(shell pkg-config glew gstreamer-0.10 gstreamer-video-0.10 gstreamer-base-0.10 libudev --cflags) + #check if gtk exists and add it + GTK = $(shell pkg-config gtk+-2.0 --exists; echo $$?) + ifeq ($(GTK),0) + CFLAGS += $(shell pkg-config gtk+-2.0 --cflags) -DOF_USING_GTK + SYSTEMLIBS += $(shell pkg-config gtk+-2.0 --libs) + endif + + #check if mpg123 exists and add it + MPG123 = $(shell pkg-config libmpg123 --exists; echo $$?) + ifeq ($(MPG123),0) + CFLAGS += -DOF_USING_MPG123 + SYSTEMLIBS += -lmpg123 + endif +endif +LIB_STATIC = $(shell ls $(OF_ROOT)/libs/*/lib/$(LIBSPATH)/*.a 2> /dev/null | grep -v openFrameworksCompiled | grep -v Poco) +LIB_SHARED = $(shell ls $(OF_ROOT)/libs/*/lib/$(LIBSPATH)/*.so 2> /dev/null | grep -v openFrameworksCompiled | sed "s/.*\\/lib\([^/]*\)\.so/-l\1/") +LIB_STATIC += $(OF_ROOT)/libs/poco/lib/$(LIBSPATH)/libPocoNet.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoXML.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoUtil.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoFoundation.a +LIB_PATHS_FLAGS = $(shell ls -d $(OF_ROOT)/libs/*/lib/$(LIBSPATH) | sed "s/\(\.*\)/-L\1/") + +CFLAGS += -Wall -fexceptions +CFLAGS += -I. +CFLAGS += $(INCLUDES_FLAGS) +CFLAGS += $(CORE_INCLUDE_FLAGS) + + + +ifeq ($(ARCH),android) + LDFLAGS = --sysroot=$(SYSROOT) -nostdlib -L"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi" + SYSTEMLIBS += -lstdc++ -lsupc++ -lgcc -lz -lGLESv1_CM -llog -ldl -lm -lc +else + LDFLAGS = -Wl,-rpath=./libs + SYSTEMLIBS += $(shell pkg-config jack glew gstreamer-0.10 gstreamer-video-0.10 gstreamer-base-0.10 gstreamer-app-0.10 libudev --libs) + SYSTEMLIBS += -lglut -lGL -lasound -lopenal -lsndfile -lvorbis -lFLAC -logg -lfreeimage +endif + + +ifeq ($(findstring addons.make,$(wildcard *.make)),addons.make) + ifneq ($(ARCH),android) + ADDONS = $(shell cat addons.make | grep -v ofxAndroid) + else + ADDONS = $(shell cat addons.make) + endif + + ifneq ($(strip $(ADDONS)),) + ADDONS_REL_DIRS = $(addsuffix /src, $(ADDONS)) + ADDONS_LIBS_REL_DIRS = $(addsuffix /libs, $(ADDONS)) + ADDONS_DIRS = $(addprefix $(OF_ROOT)/addons/, $(ADDONS_REL_DIRS) ) + ADDONS_LIBS_DIRS = $(addprefix $(OF_ROOT)/addons/, $(ADDONS_LIBS_REL_DIRS) ) + ADDONS_BIN_LIBS_DIRS = $(addsuffix /*/lib/$(LIBSPATH), $(ADDONS_LIBS_DIRS) ) + + ADDONS_INCLUDES = $(ADDONS_DIRS) + ADDONS_INCLUDES = $(ADDONS_LIBS_DIRS) + ADDONS_INCLUDES += $(shell find $(ADDONS_DIRS) -type d 2> /dev/null) + ADDONS_INCLUDES += $(shell find $(ADDONS_LIBS_DIRS) -type d 2> /dev/null) + ADDONSCFLAGS = $(addprefix -I,$(ADDONS_INCLUDES)) + + ifeq ($(findstring libsorder.make,$(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null)),libsorder.make) + ADDONS_LIBS_W_ORDER = $(shell cat $(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null)) + EXCLUDE_LIBS_FILTER = $(addprefix %,$(addsuffix .a,$(ADDONS_LIBS_W_ORDER))) + ADDONS_LIBS_STATICS = $(filter-out $(EXCLUDE_LIBS_FILTER), $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.a)) + ADDONS_LIBS_STATICS += $(addprefix -l, $(ADDONS_LIBS_W_ORDER)) + ADDONS_LIBS_STATICS += $(addprefix -L, $(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null | sed s/libsorder.make//g)) + else + ADDONS_LIBS_STATICS = $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.a 2> /dev/null) + endif + + ADDONS_LIBS_SHARED = $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.so 2> /dev/null) + ADDONSLIBS = $(ADDONS_LIBS_STATICS) + ADDONSLIBS += $(ADDONS_LIBS_SHARED) + + + ADDONS_SOURCES = $(shell find $(ADDONS_DIRS) -name "*.cpp" -or -name "*.c" 2> /dev/null) + ADDONS_SOURCES += $(shell find $(ADDONS_LIBS_DIRS) -name "*.cpp" -or -name "*.c" -or -name "*.cc" 2>/dev/null) + ADDONS_OBJFILES = $(subst $(OF_ROOT)/, ,$(patsubst %.cc,%.o,$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(ADDONS_SOURCES))))) + endif +endif + + +ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) + TARGET_CFLAGS = -g + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworksDebug.a + TARGET_NAME = Debug +endif + +ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) + TARGET_CFLAGS = $(COMPILER_OPTIMIZATION) + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworks.a + TARGET_NAME = Release +endif + +ifeq ($(ARCH),android) + ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) + TARGET = libs/armeabi/libOFAndroidApp.so + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworksDebug.a + LDFLAGS += -Wl,--fix-cortex-a8 -shared + USER_LIBS = $(USER_LIBS_ARM) + endif + + ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) + TARGET = libs/armeabi/libOFAndroidApp.so + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks.a + LDFLAGS += -Wl,--fix-cortex-a8 -shared + USER_LIBS = $(USER_LIBS_ARM) + endif + + ifeq ($(findstring Release_arm7,$(MAKECMDGOALS)),Release_arm7) + TARGET_NAME = Release_arm7 + TARGET_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mthumb + TARGET = libs/armeabi-v7a/libOFAndroidApp.so + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks_arm7.a + USER_LIBS = $(USER_LIBS_ARM7) + endif + + ifeq ($(findstring Release_neon,$(MAKECMDGOALS)),Release_neon) + TARGET_NAME = Release_neon + TARGET_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mfpu=neon + TARGET = libs/armeabi-v7a/libOFAndroidApp_neon.so + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks_neon.a + USER_LIBS = $(USER_LIBS_NEON) + endif + + ifeq ($(findstring TestLink,$(MAKECMDGOALS)),TestLink) + TARGET_NAME = Debug + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworksDebug.a + LDFLAGS += -Wl,--entry=main,--fix-cortex-a8 + BIN_NAME = $(APPNAME) + TARGET = obj/$(BIN_NAME) + USER_LIBS = $(USER_LIBS_ARM) + endif +else + ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) + BIN_NAME = $(APPNAME)_debug + TARGET = bin/$(BIN_NAME) + endif + + ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) + BIN_NAME = $(APPNAME) + TARGET = bin/$(BIN_NAME) + endif + + ifeq ($(MAKECMDGOALS),) + TARGET_NAME = Release + BIN_NAME = $(APPNAME) + TARGET = bin/$(BIN_NAME) + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworks.a + endif +endif + +ifeq ($(MAKECMDGOALS),clean) + TARGET = bin/$(APPNAME)_debug bin/$(APPNAME) + TARGET_NAME = Release +endif + +ifeq ($(MAKECMDGOALS),AndroidInstall) + TARGET_NAME = Install +endif + +OBJ_OUTPUT = obj/$(ARCH)$(TARGET_NAME)/ +CLEANTARGET = clean$(TARGET_NAME) + +OBJS = $(addprefix $(OBJ_OUTPUT), $(OBJFILES)) +DEPFILES = $(patsubst %.o,%.d,$(OBJS)) + +USER_OBJS = $(addprefix $(OBJ_OUTPUT), $(USER_OBJFILES)) +DEPFILES += $(patsubst %.o,%.d,$(USER_OBJS)) + +ifeq ($(findstring addons.make,$(wildcard *.make)),addons.make) + ADDONS_OBJS = $(addprefix $(OBJ_OUTPUT), $(ADDONS_OBJFILES)) + DEPFILES += $(patsubst %.o,%.d,$(ADDONS_OBJS)) +endif + +.PHONY: Debug Release all after afterDebugAndroid afterReleaseAndroid + +Release: $(TARGET) after + +Debug: $(TARGET) after + +all: + $(MAKE) Release + +DebugAndroid: $(TARGET) + +ReleaseAndroid: $(TARGET) + +Release_arm7Android: $(TARGET) + +Release_neonAndroid: $(TARGET) afterReleaseAndroid + +TestLinkAndroid: $(TARGET) afterDebugAndroid + +AndroidDebug: + $(MAKE) DebugAndroid + $(MAKE) TestLinkAndroid + +AndroidRelease: + $(MAKE) ReleaseAndroid + $(MAKE) Release_arm7Android + $(MAKE) Release_neonAndroid + + +#This rule does the compilation +#$(OBJS): $(SOURCES) +$(OBJ_OUTPUT)%.o: %.cpp + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CXX) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: %.c + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CC) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: %.cc + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CC) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.cpp + @echo "compiling addon object for" $< + mkdir -p $(@D) + $(CXX) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< + +$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.c + @echo "compiling addon object for" $< + mkdir -p $(@D) + $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< + +$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.cc + @echo "compiling addon object for" $< + mkdir -p $(@D) + $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< + +$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.c + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.cc + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.cpp + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CXX) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(TARGET): $(OBJS) $(ADDONS_OBJS) $(USER_OBJS) $(TARGET_LIBS) $(LIB_STATIC) + @echo 'linking $(TARGET)' + mkdir -p $(@D) + $(CXX) -o $@ $(OBJS) $(ADDONS_OBJS) $(USER_OBJS) $(LDFLAGS) $(USER_LDFLAGS) $(TARGET_LIBS) $(ADDONSLIBS) $(USER_LIBS) $(LIB_STATIC) $(LIB_PATHS_FLAGS) $(LIB_SHARED) $(SYSTEMLIBS) + +-include $(DEPFILES) + +.PHONY: clean cleanDebug cleanRelease CleanAndroid +clean: + rm -rf $(OBJ_OUTPUT) + rm -f $(TARGET) + rm -r bin/libs + +$(CLEANTARGET): + rm -rf $(OBJ_OUTPUT) + rm -f $(TARGET) + rm -rf bin/libs + +CleanAndroid: + rm -Rf obj + rm -f libs/armeabi-v7a/libOFAndroidApp.so + rm -f libs/armeabi/libOFAndroidApp.so + rm -f obj/$(APPNAME) + + +afterDebugAndroid:$(TARGET) + @if [ -d libs/armeabi-v7a ]; then rm -r libs/armeabi-v7a; fi + + @cp $(NDK_ROOT)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver libs/armeabi + + #create gdb.setup for armeabi + @echo "set solib-search-path $(PWD)/obj/local/armeabi:$(PWD)/libs/armeabi" > libs/armeabi/gdb.setup + @echo "directory $(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" >> libs/armeabi/gdb.setup + @echo "directory $(PWD)/src" >> libs/armeabi/gdb.setup + @echo "directory $(NDK_ROOT)/sources/cxx-stl/system" >> libs/armeabi/gdb.setup + @echo "directory $(PWD)/libs/armeabi" >> libs/armeabi/gdb.setup + @echo "" >> libs/armeabi/gdb.setup + + @if [ ! -d jni ]; then mkdir jni; fi + @echo "APP_ABI := armeabi" > jni/Application.mk + @echo "#LOCAL_MODULE := OFAndroidApp" > jni/Android.mk + +afterReleaseAndroid:$(TARGET) + @if [ -f obj/$(BIN_NAME) ]; then rm obj/$(BIN_NAME); fi + + @cp $(OF_ROOT)/libs/openFrameworksCompiled/project/android/libneondetection.so libs/armeabi-v7a/ + @cp $(NDK_ROOT)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver libs/armeabi-v7a + + #create gdb.setup for armeabi-v7a + @echo "set solib-search-path $(PWD)/obj/local/armeabi-v7a:$(PWD)/libs/armeabi-v7a" > libs/armeabi-v7a/gdb.setup + @echo "directory $(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" >> libs/armeabi-v7a/gdb.setup + @echo "directory $(PWD)/src" >> libs/armeabi-v7a/gdb.setup + @echo "directory $(NDK_ROOT)/sources/cxx-stl/system" >> libs/armeabi-v7a/gdb.setup + @echo "directory $(PWD)/libs/armeabi-v7a" >> libs/armeabi-v7a/gdb.setup + @echo "" >> libs/armeabi-v7a/gdb.setup + + @if [ ! -d jni ]; then mkdir jni; fi + @echo "APP_ABI := armeabi armeabi-v7a" > jni/Application.mk + @echo "#LOCAL_MODULE := OFAndroidApp" > jni/Android.mk + +RESNAME=$(shell echo $(APPNAME)Resources | tr '[A-Z]' '[a-z]') + +AndroidInstall: + if [ -d "bin/data" ]; then \ + mkdir -p res/raw; \ + rm res/raw/$(RESNAME).zip; \ + cd bin/data; \ + zip -r ../../res/raw/$(RESNAME).zip *; \ + cd ../..; \ + fi + if [ -f obj/$(BIN_NAME) ]; then rm obj/$(BIN_NAME); fi + #touch AndroidManifest.xml + $(SDK_ROOT)/tools/android update project --target $(NDK_PLATFORM) --path $(PROJECT_PATH) + if [ -d bin/classes ]; then rm -r bin/classes; fi + if [ -d bin/classes.dex ]; then rm bin/classes.dex; fi + if [ -d bin/OFActivity.ap_ ]; then rm bin/OFActivity.ap_; fi + if [ -d bin/OFActivity-debug.apk ]; then rm bin/OFActivity-debug.apk; fi + if [ -d bin/OFActivity-debug-unaligned.apk ]; then rm bin/OFActivity-debug-unaligned.apk; fi + if [ -d bin/$(APPNAME).apk ]; then rm bin/$(APPNAME).apk; fi + ant debug + cp bin/OFActivity-debug.apk bin/$(APPNAME).apk + #if [ "$(shell $(SDK_ROOT)/platform-tools/adb get-state)" = "device" ]; then + $(SDK_ROOT)/platform-tools/adb install -r bin/$(APPNAME).apk; + #fi + $(SDK_ROOT)/platform-tools/adb shell am start -a android.intent.action.MAIN -n cc.openframeworks.$(APPNAME)/cc.openframeworks.$(APPNAME).OFActivity + + +after:$(TARGET) + cp -r $(OF_ROOT)/export/$(LIBSPATH)/libs bin/ + @echo + @echo " compiling done" + @echo " to launch the application" + @echo + @echo " cd bin" + @echo " ./$(BIN_NAME)" + @echo + + +.PHONY: help +help: + @echo + @echo openFrameworks universal makefile + @echo + @echo targets: + @echo "make Debug: builds the application with debug symbols" + @echo "make Release: builds the app 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 + @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 diff --git a/examples/android/androidAudioExample/config.make b/examples/android/androidAudioExample/config.make new file mode 100644 index 00000000000..8266e5d914e --- /dev/null +++ b/examples/android/androidAudioExample/config.make @@ -0,0 +1,32 @@ +# add custom variables to this file + +# OF_ROOT allows to move projects outside apps/* just set this variable to the +# absoulte path to the OF root folder + +OF_ROOT = ../../.. + + +# USER_CFLAGS allows to pass custom flags to the compiler +# for example search paths like: +# USER_CFLAGS = -I src/objects + +USER_CFLAGS = + + +# USER_LDFLAGS allows to pass custom flags to the linker +# for example libraries like: +# USER_LD_FLAGS = libs/libawesomelib.a + +USER_LDFLAGS = + +# android specific, in case you want to use different optimizations +USER_LIBS_ARM = +USER_LIBS_ARM7 = +USER_LIBS_NEON = + +# android optimizations + +ANDROID_COMPILER_OPTIMIZATION = -Os + + +EXCLUDE_FROM_SOURCE="bin,.xcodeproj,obj" diff --git a/examples/android/androidCameraExample/Makefile b/examples/android/androidCameraExample/Makefile new file mode 100644 index 00000000000..f61fe5d517a --- /dev/null +++ b/examples/android/androidCameraExample/Makefile @@ -0,0 +1,475 @@ +# openFrameworks universal makefile +# +# make help : shows this message +# make Debug: makes the application with debug symbols +# make Release: makes the app with optimizations +# make: the same as make Release +# make CleanDebug: cleans the Debug target +# make CleanRelease: cleans the Release target +# make clean: cleans everything +# +# +# this should work with any OF app, just copy any example +# change the name of the folder and it should compile +# only .cpp support, don't use .c files +# it will look for files in any folder inside the application +# folder except that in the EXCLUDE_FROM_SOURCE variable +# it doesn't autodetect include paths yet +# add the include paths in the USER_CFLAGS variable +# using the gcc syntax: -Ipath +# +# to add addons to your application, edit the addons.make file +# in this directory and add the names of the addons you want to +# include +# +# edit the following vars to customize the makefile + +include config.make + +ifeq ($(findstring Android,$(MAKECMDGOALS)),Android) + include $(OF_ROOT)/libs/openFrameworksCompiled/project/android/paths.make + ARCH = android + ifeq ($(shell uname),Darwin) + HOST_PLATFORM = darwin-x86 + else + HOST_PLATFORM = linux-x86 + endif +endif + +ifeq ($(ARCH),android) + COMPILER_OPTIMIZATION = $(ANDROID_COMPILER_OPTIMIZATION) + NDK_PLATFORM = android-8 +else + COMPILER_OPTIMIZATION = $(USER_COMPILER_OPTIMIZATION) +endif + + + + +# you shouldn't modify anything below this line + + +SHELL = /bin/sh +ifneq ($(ARCH),android) + CXX = g++ + ARCH = $(shell uname -m) + ifeq ($(ARCH),x86_64) + LIBSPATH=linux64 + else + LIBSPATH=linux + endif +else + ifeq ($(findstring Release_arm7,$(MAKECMDGOALS)),Release_arm7) + LIBSPATH =android/armeabi-v7a + else + LIBSPATH =android/armeabi + endif + #NDK_ROOT = $(shell cat $(OF_ROOT)/libs/openFrameworksCompiled/project/android/ndk_path.make) + #SDK_ROOT = $(shell cat $(OF_ROOT)/libs/openFrameworksCompiled/project/android/sdk_path.make) + TOOLCHAIN=arm-linux-androideabi-4.4.3 + TOOLCHAIN_PATH=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/ + ANDROID_PREFIX=arm-linux-androideabi- + CC=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)gcc + CXX=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)g++ + AR=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)ar + SYSROOT=$(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/ + CFLAGS += -nostdlib --sysroot=$(SYSROOT) -fno-short-enums + CFLAGS += -I"$(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" -I"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/include/" -I"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include" + CFLAGS += -DANDROID +endif + +NODEPS = clean +SED_EXCLUDE_FROM_SRC = $(shell echo $(EXCLUDE_FROM_SOURCE) | sed s/\,/\\\\\|/g) +SOURCE_DIRS = $(shell find . -maxdepth 1 -mindepth 1 -type d | grep -v $(SED_EXCLUDE_FROM_SRC) | sed s/.\\///) +SOURCES = $(shell find $(SOURCE_DIRS) -name "*.cpp" -or -name "*.c" -or -name "*.cc") +OBJFILES = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(patsubst %.cc,%.o,$(SOURCES)))) + +ifneq (,$(USER_SOURCE_DIR)) + USER_SOURCES = $(shell find $(USER_SOURCE_DIR) -name "*.cpp" -or -name "*.c" -or -name "*.cc") + USER_OBJFILES = $(subst $(USER_SOURCE_DIR)/, ,$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(patsubst %.cc,%.o,$(USER_SOURCES))))) +endif + +APPNAME = $(shell basename `pwd`) +CORE_INCLUDES = $(shell find $(OF_ROOT)/libs/openFrameworks/ -type d) +CORE_INCLUDE_FLAGS = $(addprefix -I,$(CORE_INCLUDES)) +INCLUDES = $(shell find $(OF_ROOT)/libs/*/include -type d | grep -v glu | grep -v quicktime | grep -v poco) +INCLUDES_FLAGS = $(addprefix -I,$(INCLUDES)) +INCLUDES_FLAGS += -I$(OF_ROOT)/libs/poco/include +ifeq ($(ARCH),android) + INCLUDES_FLAGS += -I$(OF_ROOT)/libs/glu/include_android +else + INCLUDES_FLAGS += -I$(OF_ROOT)/libs/glu/include + INCLUDES_FLAGS += $(shell pkg-config glew gstreamer-0.10 gstreamer-video-0.10 gstreamer-base-0.10 libudev --cflags) + #check if gtk exists and add it + GTK = $(shell pkg-config gtk+-2.0 --exists; echo $$?) + ifeq ($(GTK),0) + CFLAGS += $(shell pkg-config gtk+-2.0 --cflags) -DOF_USING_GTK + SYSTEMLIBS += $(shell pkg-config gtk+-2.0 --libs) + endif + + #check if mpg123 exists and add it + MPG123 = $(shell pkg-config libmpg123 --exists; echo $$?) + ifeq ($(MPG123),0) + CFLAGS += -DOF_USING_MPG123 + SYSTEMLIBS += -lmpg123 + endif +endif +LIB_STATIC = $(shell ls $(OF_ROOT)/libs/*/lib/$(LIBSPATH)/*.a 2> /dev/null | grep -v openFrameworksCompiled | grep -v Poco) +LIB_SHARED = $(shell ls $(OF_ROOT)/libs/*/lib/$(LIBSPATH)/*.so 2> /dev/null | grep -v openFrameworksCompiled | sed "s/.*\\/lib\([^/]*\)\.so/-l\1/") +LIB_STATIC += $(OF_ROOT)/libs/poco/lib/$(LIBSPATH)/libPocoNet.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoXML.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoUtil.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoFoundation.a +LIB_PATHS_FLAGS = $(shell ls -d $(OF_ROOT)/libs/*/lib/$(LIBSPATH) | sed "s/\(\.*\)/-L\1/") + +CFLAGS += -Wall -fexceptions +CFLAGS += -I. +CFLAGS += $(INCLUDES_FLAGS) +CFLAGS += $(CORE_INCLUDE_FLAGS) + + + +ifeq ($(ARCH),android) + LDFLAGS = --sysroot=$(SYSROOT) -nostdlib -L"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi" + SYSTEMLIBS += -lstdc++ -lsupc++ -lgcc -lz -lGLESv1_CM -llog -ldl -lm -lc +else + LDFLAGS = -Wl,-rpath=./libs + SYSTEMLIBS += $(shell pkg-config jack glew gstreamer-0.10 gstreamer-video-0.10 gstreamer-base-0.10 gstreamer-app-0.10 libudev --libs) + SYSTEMLIBS += -lglut -lGL -lasound -lopenal -lsndfile -lvorbis -lFLAC -logg -lfreeimage +endif + + +ifeq ($(findstring addons.make,$(wildcard *.make)),addons.make) + ifneq ($(ARCH),android) + ADDONS = $(shell cat addons.make | grep -v ofxAndroid) + else + ADDONS = $(shell cat addons.make) + endif + + ifneq ($(strip $(ADDONS)),) + ADDONS_REL_DIRS = $(addsuffix /src, $(ADDONS)) + ADDONS_LIBS_REL_DIRS = $(addsuffix /libs, $(ADDONS)) + ADDONS_DIRS = $(addprefix $(OF_ROOT)/addons/, $(ADDONS_REL_DIRS) ) + ADDONS_LIBS_DIRS = $(addprefix $(OF_ROOT)/addons/, $(ADDONS_LIBS_REL_DIRS) ) + ADDONS_BIN_LIBS_DIRS = $(addsuffix /*/lib/$(LIBSPATH), $(ADDONS_LIBS_DIRS) ) + + ADDONS_INCLUDES = $(ADDONS_DIRS) + ADDONS_INCLUDES = $(ADDONS_LIBS_DIRS) + ADDONS_INCLUDES += $(shell find $(ADDONS_DIRS) -type d 2> /dev/null) + ADDONS_INCLUDES += $(shell find $(ADDONS_LIBS_DIRS) -type d 2> /dev/null) + ADDONSCFLAGS = $(addprefix -I,$(ADDONS_INCLUDES)) + + ifeq ($(findstring libsorder.make,$(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null)),libsorder.make) + ADDONS_LIBS_W_ORDER = $(shell cat $(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null)) + EXCLUDE_LIBS_FILTER = $(addprefix %,$(addsuffix .a,$(ADDONS_LIBS_W_ORDER))) + ADDONS_LIBS_STATICS = $(filter-out $(EXCLUDE_LIBS_FILTER), $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.a)) + ADDONS_LIBS_STATICS += $(addprefix -l, $(ADDONS_LIBS_W_ORDER)) + ADDONS_LIBS_STATICS += $(addprefix -L, $(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null | sed s/libsorder.make//g)) + else + ADDONS_LIBS_STATICS = $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.a 2> /dev/null) + endif + + ADDONS_LIBS_SHARED = $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.so 2> /dev/null) + ADDONSLIBS = $(ADDONS_LIBS_STATICS) + ADDONSLIBS += $(ADDONS_LIBS_SHARED) + + + ADDONS_SOURCES = $(shell find $(ADDONS_DIRS) -name "*.cpp" -or -name "*.c" 2> /dev/null) + ADDONS_SOURCES += $(shell find $(ADDONS_LIBS_DIRS) -name "*.cpp" -or -name "*.c" -or -name "*.cc" 2>/dev/null) + ADDONS_OBJFILES = $(subst $(OF_ROOT)/, ,$(patsubst %.cc,%.o,$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(ADDONS_SOURCES))))) + endif +endif + + +ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) + TARGET_CFLAGS = -g + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworksDebug.a + TARGET_NAME = Debug +endif + +ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) + TARGET_CFLAGS = $(COMPILER_OPTIMIZATION) + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworks.a + TARGET_NAME = Release +endif + +ifeq ($(ARCH),android) + ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) + TARGET = libs/armeabi/libOFAndroidApp.so + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworksDebug.a + LDFLAGS += -Wl,--fix-cortex-a8 -shared + USER_LIBS = $(USER_LIBS_ARM) + endif + + ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) + TARGET = libs/armeabi/libOFAndroidApp.so + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks.a + LDFLAGS += -Wl,--fix-cortex-a8 -shared + USER_LIBS = $(USER_LIBS_ARM) + endif + + ifeq ($(findstring Release_arm7,$(MAKECMDGOALS)),Release_arm7) + TARGET_NAME = Release_arm7 + TARGET_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mthumb + TARGET = libs/armeabi-v7a/libOFAndroidApp.so + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks_arm7.a + USER_LIBS = $(USER_LIBS_ARM7) + endif + + ifeq ($(findstring Release_neon,$(MAKECMDGOALS)),Release_neon) + TARGET_NAME = Release_neon + TARGET_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mfpu=neon + TARGET = libs/armeabi-v7a/libOFAndroidApp_neon.so + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks_neon.a + USER_LIBS = $(USER_LIBS_NEON) + endif + + ifeq ($(findstring TestLink,$(MAKECMDGOALS)),TestLink) + TARGET_NAME = Debug + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworksDebug.a + LDFLAGS += -Wl,--entry=main,--fix-cortex-a8 + BIN_NAME = $(APPNAME) + TARGET = obj/$(BIN_NAME) + USER_LIBS = $(USER_LIBS_ARM) + endif +else + ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) + BIN_NAME = $(APPNAME)_debug + TARGET = bin/$(BIN_NAME) + endif + + ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) + BIN_NAME = $(APPNAME) + TARGET = bin/$(BIN_NAME) + endif + + ifeq ($(MAKECMDGOALS),) + TARGET_NAME = Release + BIN_NAME = $(APPNAME) + TARGET = bin/$(BIN_NAME) + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworks.a + endif +endif + +ifeq ($(MAKECMDGOALS),clean) + TARGET = bin/$(APPNAME)_debug bin/$(APPNAME) + TARGET_NAME = Release +endif + +ifeq ($(MAKECMDGOALS),AndroidInstall) + TARGET_NAME = Install +endif + +OBJ_OUTPUT = obj/$(ARCH)$(TARGET_NAME)/ +CLEANTARGET = clean$(TARGET_NAME) + +OBJS = $(addprefix $(OBJ_OUTPUT), $(OBJFILES)) +DEPFILES = $(patsubst %.o,%.d,$(OBJS)) + +USER_OBJS = $(addprefix $(OBJ_OUTPUT), $(USER_OBJFILES)) +DEPFILES += $(patsubst %.o,%.d,$(USER_OBJS)) + +ifeq ($(findstring addons.make,$(wildcard *.make)),addons.make) + ADDONS_OBJS = $(addprefix $(OBJ_OUTPUT), $(ADDONS_OBJFILES)) + DEPFILES += $(patsubst %.o,%.d,$(ADDONS_OBJS)) +endif + +.PHONY: Debug Release all after afterDebugAndroid afterReleaseAndroid + +Release: $(TARGET) after + +Debug: $(TARGET) after + +all: + $(MAKE) Release + +DebugAndroid: $(TARGET) + +ReleaseAndroid: $(TARGET) + +Release_arm7Android: $(TARGET) + +Release_neonAndroid: $(TARGET) afterReleaseAndroid + +TestLinkAndroid: $(TARGET) afterDebugAndroid + +AndroidDebug: + $(MAKE) DebugAndroid + $(MAKE) TestLinkAndroid + +AndroidRelease: + $(MAKE) ReleaseAndroid + $(MAKE) Release_arm7Android + $(MAKE) Release_neonAndroid + + +#This rule does the compilation +#$(OBJS): $(SOURCES) +$(OBJ_OUTPUT)%.o: %.cpp + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CXX) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: %.c + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CC) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: %.cc + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CC) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.cpp + @echo "compiling addon object for" $< + mkdir -p $(@D) + $(CXX) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< + +$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.c + @echo "compiling addon object for" $< + mkdir -p $(@D) + $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< + +$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.cc + @echo "compiling addon object for" $< + mkdir -p $(@D) + $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< + +$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.c + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.cc + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.cpp + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CXX) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(TARGET): $(OBJS) $(ADDONS_OBJS) $(USER_OBJS) $(TARGET_LIBS) $(LIB_STATIC) + @echo 'linking $(TARGET)' + mkdir -p $(@D) + $(CXX) -o $@ $(OBJS) $(ADDONS_OBJS) $(USER_OBJS) $(LDFLAGS) $(USER_LDFLAGS) $(TARGET_LIBS) $(ADDONSLIBS) $(USER_LIBS) $(LIB_STATIC) $(LIB_PATHS_FLAGS) $(LIB_SHARED) $(SYSTEMLIBS) + +-include $(DEPFILES) + +.PHONY: clean cleanDebug cleanRelease CleanAndroid +clean: + rm -rf $(OBJ_OUTPUT) + rm -f $(TARGET) + rm -r bin/libs + +$(CLEANTARGET): + rm -rf $(OBJ_OUTPUT) + rm -f $(TARGET) + rm -rf bin/libs + +CleanAndroid: + rm -Rf obj + rm -f libs/armeabi-v7a/libOFAndroidApp.so + rm -f libs/armeabi/libOFAndroidApp.so + rm -f obj/$(APPNAME) + + +afterDebugAndroid:$(TARGET) + @if [ -d libs/armeabi-v7a ]; then rm -r libs/armeabi-v7a; fi + + @cp $(NDK_ROOT)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver libs/armeabi + + #create gdb.setup for armeabi + @echo "set solib-search-path $(PWD)/obj/local/armeabi:$(PWD)/libs/armeabi" > libs/armeabi/gdb.setup + @echo "directory $(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" >> libs/armeabi/gdb.setup + @echo "directory $(PWD)/src" >> libs/armeabi/gdb.setup + @echo "directory $(NDK_ROOT)/sources/cxx-stl/system" >> libs/armeabi/gdb.setup + @echo "directory $(PWD)/libs/armeabi" >> libs/armeabi/gdb.setup + @echo "" >> libs/armeabi/gdb.setup + + @if [ ! -d jni ]; then mkdir jni; fi + @echo "APP_ABI := armeabi" > jni/Application.mk + @echo "#LOCAL_MODULE := OFAndroidApp" > jni/Android.mk + +afterReleaseAndroid:$(TARGET) + @if [ -f obj/$(BIN_NAME) ]; then rm obj/$(BIN_NAME); fi + + @cp $(OF_ROOT)/libs/openFrameworksCompiled/project/android/libneondetection.so libs/armeabi-v7a/ + @cp $(NDK_ROOT)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver libs/armeabi-v7a + + #create gdb.setup for armeabi-v7a + @echo "set solib-search-path $(PWD)/obj/local/armeabi-v7a:$(PWD)/libs/armeabi-v7a" > libs/armeabi-v7a/gdb.setup + @echo "directory $(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" >> libs/armeabi-v7a/gdb.setup + @echo "directory $(PWD)/src" >> libs/armeabi-v7a/gdb.setup + @echo "directory $(NDK_ROOT)/sources/cxx-stl/system" >> libs/armeabi-v7a/gdb.setup + @echo "directory $(PWD)/libs/armeabi-v7a" >> libs/armeabi-v7a/gdb.setup + @echo "" >> libs/armeabi-v7a/gdb.setup + + @if [ ! -d jni ]; then mkdir jni; fi + @echo "APP_ABI := armeabi armeabi-v7a" > jni/Application.mk + @echo "#LOCAL_MODULE := OFAndroidApp" > jni/Android.mk + +RESNAME=$(shell echo $(APPNAME)Resources | tr '[A-Z]' '[a-z]') + +AndroidInstall: + if [ -d "bin/data" ]; then \ + mkdir -p res/raw; \ + rm res/raw/$(RESNAME).zip; \ + cd bin/data; \ + zip -r ../../res/raw/$(RESNAME).zip *; \ + cd ../..; \ + fi + if [ -f obj/$(BIN_NAME) ]; then rm obj/$(BIN_NAME); fi + #touch AndroidManifest.xml + $(SDK_ROOT)/tools/android update project --target $(NDK_PLATFORM) --path $(PROJECT_PATH) + if [ -d bin/classes ]; then rm -r bin/classes; fi + if [ -d bin/classes.dex ]; then rm bin/classes.dex; fi + if [ -d bin/OFActivity.ap_ ]; then rm bin/OFActivity.ap_; fi + if [ -d bin/OFActivity-debug.apk ]; then rm bin/OFActivity-debug.apk; fi + if [ -d bin/OFActivity-debug-unaligned.apk ]; then rm bin/OFActivity-debug-unaligned.apk; fi + if [ -d bin/$(APPNAME).apk ]; then rm bin/$(APPNAME).apk; fi + ant debug + cp bin/OFActivity-debug.apk bin/$(APPNAME).apk + #if [ "$(shell $(SDK_ROOT)/platform-tools/adb get-state)" = "device" ]; then + $(SDK_ROOT)/platform-tools/adb install -r bin/$(APPNAME).apk; + #fi + $(SDK_ROOT)/platform-tools/adb shell am start -a android.intent.action.MAIN -n cc.openframeworks.$(APPNAME)/cc.openframeworks.$(APPNAME).OFActivity + + +after:$(TARGET) + cp -r $(OF_ROOT)/export/$(LIBSPATH)/libs bin/ + @echo + @echo " compiling done" + @echo " to launch the application" + @echo + @echo " cd bin" + @echo " ./$(BIN_NAME)" + @echo + + +.PHONY: help +help: + @echo + @echo openFrameworks universal makefile + @echo + @echo targets: + @echo "make Debug: builds the application with debug symbols" + @echo "make Release: builds the app 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 + @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 diff --git a/examples/android/androidCameraExample/config.make b/examples/android/androidCameraExample/config.make new file mode 100644 index 00000000000..8266e5d914e --- /dev/null +++ b/examples/android/androidCameraExample/config.make @@ -0,0 +1,32 @@ +# add custom variables to this file + +# OF_ROOT allows to move projects outside apps/* just set this variable to the +# absoulte path to the OF root folder + +OF_ROOT = ../../.. + + +# USER_CFLAGS allows to pass custom flags to the compiler +# for example search paths like: +# USER_CFLAGS = -I src/objects + +USER_CFLAGS = + + +# USER_LDFLAGS allows to pass custom flags to the linker +# for example libraries like: +# USER_LD_FLAGS = libs/libawesomelib.a + +USER_LDFLAGS = + +# android specific, in case you want to use different optimizations +USER_LIBS_ARM = +USER_LIBS_ARM7 = +USER_LIBS_NEON = + +# android optimizations + +ANDROID_COMPILER_OPTIMIZATION = -Os + + +EXCLUDE_FROM_SOURCE="bin,.xcodeproj,obj" diff --git a/examples/android/androidFontExample/Makefile b/examples/android/androidFontExample/Makefile new file mode 100644 index 00000000000..f61fe5d517a --- /dev/null +++ b/examples/android/androidFontExample/Makefile @@ -0,0 +1,475 @@ +# openFrameworks universal makefile +# +# make help : shows this message +# make Debug: makes the application with debug symbols +# make Release: makes the app with optimizations +# make: the same as make Release +# make CleanDebug: cleans the Debug target +# make CleanRelease: cleans the Release target +# make clean: cleans everything +# +# +# this should work with any OF app, just copy any example +# change the name of the folder and it should compile +# only .cpp support, don't use .c files +# it will look for files in any folder inside the application +# folder except that in the EXCLUDE_FROM_SOURCE variable +# it doesn't autodetect include paths yet +# add the include paths in the USER_CFLAGS variable +# using the gcc syntax: -Ipath +# +# to add addons to your application, edit the addons.make file +# in this directory and add the names of the addons you want to +# include +# +# edit the following vars to customize the makefile + +include config.make + +ifeq ($(findstring Android,$(MAKECMDGOALS)),Android) + include $(OF_ROOT)/libs/openFrameworksCompiled/project/android/paths.make + ARCH = android + ifeq ($(shell uname),Darwin) + HOST_PLATFORM = darwin-x86 + else + HOST_PLATFORM = linux-x86 + endif +endif + +ifeq ($(ARCH),android) + COMPILER_OPTIMIZATION = $(ANDROID_COMPILER_OPTIMIZATION) + NDK_PLATFORM = android-8 +else + COMPILER_OPTIMIZATION = $(USER_COMPILER_OPTIMIZATION) +endif + + + + +# you shouldn't modify anything below this line + + +SHELL = /bin/sh +ifneq ($(ARCH),android) + CXX = g++ + ARCH = $(shell uname -m) + ifeq ($(ARCH),x86_64) + LIBSPATH=linux64 + else + LIBSPATH=linux + endif +else + ifeq ($(findstring Release_arm7,$(MAKECMDGOALS)),Release_arm7) + LIBSPATH =android/armeabi-v7a + else + LIBSPATH =android/armeabi + endif + #NDK_ROOT = $(shell cat $(OF_ROOT)/libs/openFrameworksCompiled/project/android/ndk_path.make) + #SDK_ROOT = $(shell cat $(OF_ROOT)/libs/openFrameworksCompiled/project/android/sdk_path.make) + TOOLCHAIN=arm-linux-androideabi-4.4.3 + TOOLCHAIN_PATH=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/ + ANDROID_PREFIX=arm-linux-androideabi- + CC=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)gcc + CXX=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)g++ + AR=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)ar + SYSROOT=$(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/ + CFLAGS += -nostdlib --sysroot=$(SYSROOT) -fno-short-enums + CFLAGS += -I"$(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" -I"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/include/" -I"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include" + CFLAGS += -DANDROID +endif + +NODEPS = clean +SED_EXCLUDE_FROM_SRC = $(shell echo $(EXCLUDE_FROM_SOURCE) | sed s/\,/\\\\\|/g) +SOURCE_DIRS = $(shell find . -maxdepth 1 -mindepth 1 -type d | grep -v $(SED_EXCLUDE_FROM_SRC) | sed s/.\\///) +SOURCES = $(shell find $(SOURCE_DIRS) -name "*.cpp" -or -name "*.c" -or -name "*.cc") +OBJFILES = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(patsubst %.cc,%.o,$(SOURCES)))) + +ifneq (,$(USER_SOURCE_DIR)) + USER_SOURCES = $(shell find $(USER_SOURCE_DIR) -name "*.cpp" -or -name "*.c" -or -name "*.cc") + USER_OBJFILES = $(subst $(USER_SOURCE_DIR)/, ,$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(patsubst %.cc,%.o,$(USER_SOURCES))))) +endif + +APPNAME = $(shell basename `pwd`) +CORE_INCLUDES = $(shell find $(OF_ROOT)/libs/openFrameworks/ -type d) +CORE_INCLUDE_FLAGS = $(addprefix -I,$(CORE_INCLUDES)) +INCLUDES = $(shell find $(OF_ROOT)/libs/*/include -type d | grep -v glu | grep -v quicktime | grep -v poco) +INCLUDES_FLAGS = $(addprefix -I,$(INCLUDES)) +INCLUDES_FLAGS += -I$(OF_ROOT)/libs/poco/include +ifeq ($(ARCH),android) + INCLUDES_FLAGS += -I$(OF_ROOT)/libs/glu/include_android +else + INCLUDES_FLAGS += -I$(OF_ROOT)/libs/glu/include + INCLUDES_FLAGS += $(shell pkg-config glew gstreamer-0.10 gstreamer-video-0.10 gstreamer-base-0.10 libudev --cflags) + #check if gtk exists and add it + GTK = $(shell pkg-config gtk+-2.0 --exists; echo $$?) + ifeq ($(GTK),0) + CFLAGS += $(shell pkg-config gtk+-2.0 --cflags) -DOF_USING_GTK + SYSTEMLIBS += $(shell pkg-config gtk+-2.0 --libs) + endif + + #check if mpg123 exists and add it + MPG123 = $(shell pkg-config libmpg123 --exists; echo $$?) + ifeq ($(MPG123),0) + CFLAGS += -DOF_USING_MPG123 + SYSTEMLIBS += -lmpg123 + endif +endif +LIB_STATIC = $(shell ls $(OF_ROOT)/libs/*/lib/$(LIBSPATH)/*.a 2> /dev/null | grep -v openFrameworksCompiled | grep -v Poco) +LIB_SHARED = $(shell ls $(OF_ROOT)/libs/*/lib/$(LIBSPATH)/*.so 2> /dev/null | grep -v openFrameworksCompiled | sed "s/.*\\/lib\([^/]*\)\.so/-l\1/") +LIB_STATIC += $(OF_ROOT)/libs/poco/lib/$(LIBSPATH)/libPocoNet.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoXML.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoUtil.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoFoundation.a +LIB_PATHS_FLAGS = $(shell ls -d $(OF_ROOT)/libs/*/lib/$(LIBSPATH) | sed "s/\(\.*\)/-L\1/") + +CFLAGS += -Wall -fexceptions +CFLAGS += -I. +CFLAGS += $(INCLUDES_FLAGS) +CFLAGS += $(CORE_INCLUDE_FLAGS) + + + +ifeq ($(ARCH),android) + LDFLAGS = --sysroot=$(SYSROOT) -nostdlib -L"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi" + SYSTEMLIBS += -lstdc++ -lsupc++ -lgcc -lz -lGLESv1_CM -llog -ldl -lm -lc +else + LDFLAGS = -Wl,-rpath=./libs + SYSTEMLIBS += $(shell pkg-config jack glew gstreamer-0.10 gstreamer-video-0.10 gstreamer-base-0.10 gstreamer-app-0.10 libudev --libs) + SYSTEMLIBS += -lglut -lGL -lasound -lopenal -lsndfile -lvorbis -lFLAC -logg -lfreeimage +endif + + +ifeq ($(findstring addons.make,$(wildcard *.make)),addons.make) + ifneq ($(ARCH),android) + ADDONS = $(shell cat addons.make | grep -v ofxAndroid) + else + ADDONS = $(shell cat addons.make) + endif + + ifneq ($(strip $(ADDONS)),) + ADDONS_REL_DIRS = $(addsuffix /src, $(ADDONS)) + ADDONS_LIBS_REL_DIRS = $(addsuffix /libs, $(ADDONS)) + ADDONS_DIRS = $(addprefix $(OF_ROOT)/addons/, $(ADDONS_REL_DIRS) ) + ADDONS_LIBS_DIRS = $(addprefix $(OF_ROOT)/addons/, $(ADDONS_LIBS_REL_DIRS) ) + ADDONS_BIN_LIBS_DIRS = $(addsuffix /*/lib/$(LIBSPATH), $(ADDONS_LIBS_DIRS) ) + + ADDONS_INCLUDES = $(ADDONS_DIRS) + ADDONS_INCLUDES = $(ADDONS_LIBS_DIRS) + ADDONS_INCLUDES += $(shell find $(ADDONS_DIRS) -type d 2> /dev/null) + ADDONS_INCLUDES += $(shell find $(ADDONS_LIBS_DIRS) -type d 2> /dev/null) + ADDONSCFLAGS = $(addprefix -I,$(ADDONS_INCLUDES)) + + ifeq ($(findstring libsorder.make,$(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null)),libsorder.make) + ADDONS_LIBS_W_ORDER = $(shell cat $(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null)) + EXCLUDE_LIBS_FILTER = $(addprefix %,$(addsuffix .a,$(ADDONS_LIBS_W_ORDER))) + ADDONS_LIBS_STATICS = $(filter-out $(EXCLUDE_LIBS_FILTER), $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.a)) + ADDONS_LIBS_STATICS += $(addprefix -l, $(ADDONS_LIBS_W_ORDER)) + ADDONS_LIBS_STATICS += $(addprefix -L, $(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null | sed s/libsorder.make//g)) + else + ADDONS_LIBS_STATICS = $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.a 2> /dev/null) + endif + + ADDONS_LIBS_SHARED = $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.so 2> /dev/null) + ADDONSLIBS = $(ADDONS_LIBS_STATICS) + ADDONSLIBS += $(ADDONS_LIBS_SHARED) + + + ADDONS_SOURCES = $(shell find $(ADDONS_DIRS) -name "*.cpp" -or -name "*.c" 2> /dev/null) + ADDONS_SOURCES += $(shell find $(ADDONS_LIBS_DIRS) -name "*.cpp" -or -name "*.c" -or -name "*.cc" 2>/dev/null) + ADDONS_OBJFILES = $(subst $(OF_ROOT)/, ,$(patsubst %.cc,%.o,$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(ADDONS_SOURCES))))) + endif +endif + + +ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) + TARGET_CFLAGS = -g + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworksDebug.a + TARGET_NAME = Debug +endif + +ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) + TARGET_CFLAGS = $(COMPILER_OPTIMIZATION) + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworks.a + TARGET_NAME = Release +endif + +ifeq ($(ARCH),android) + ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) + TARGET = libs/armeabi/libOFAndroidApp.so + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworksDebug.a + LDFLAGS += -Wl,--fix-cortex-a8 -shared + USER_LIBS = $(USER_LIBS_ARM) + endif + + ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) + TARGET = libs/armeabi/libOFAndroidApp.so + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks.a + LDFLAGS += -Wl,--fix-cortex-a8 -shared + USER_LIBS = $(USER_LIBS_ARM) + endif + + ifeq ($(findstring Release_arm7,$(MAKECMDGOALS)),Release_arm7) + TARGET_NAME = Release_arm7 + TARGET_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mthumb + TARGET = libs/armeabi-v7a/libOFAndroidApp.so + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks_arm7.a + USER_LIBS = $(USER_LIBS_ARM7) + endif + + ifeq ($(findstring Release_neon,$(MAKECMDGOALS)),Release_neon) + TARGET_NAME = Release_neon + TARGET_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mfpu=neon + TARGET = libs/armeabi-v7a/libOFAndroidApp_neon.so + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks_neon.a + USER_LIBS = $(USER_LIBS_NEON) + endif + + ifeq ($(findstring TestLink,$(MAKECMDGOALS)),TestLink) + TARGET_NAME = Debug + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworksDebug.a + LDFLAGS += -Wl,--entry=main,--fix-cortex-a8 + BIN_NAME = $(APPNAME) + TARGET = obj/$(BIN_NAME) + USER_LIBS = $(USER_LIBS_ARM) + endif +else + ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) + BIN_NAME = $(APPNAME)_debug + TARGET = bin/$(BIN_NAME) + endif + + ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) + BIN_NAME = $(APPNAME) + TARGET = bin/$(BIN_NAME) + endif + + ifeq ($(MAKECMDGOALS),) + TARGET_NAME = Release + BIN_NAME = $(APPNAME) + TARGET = bin/$(BIN_NAME) + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworks.a + endif +endif + +ifeq ($(MAKECMDGOALS),clean) + TARGET = bin/$(APPNAME)_debug bin/$(APPNAME) + TARGET_NAME = Release +endif + +ifeq ($(MAKECMDGOALS),AndroidInstall) + TARGET_NAME = Install +endif + +OBJ_OUTPUT = obj/$(ARCH)$(TARGET_NAME)/ +CLEANTARGET = clean$(TARGET_NAME) + +OBJS = $(addprefix $(OBJ_OUTPUT), $(OBJFILES)) +DEPFILES = $(patsubst %.o,%.d,$(OBJS)) + +USER_OBJS = $(addprefix $(OBJ_OUTPUT), $(USER_OBJFILES)) +DEPFILES += $(patsubst %.o,%.d,$(USER_OBJS)) + +ifeq ($(findstring addons.make,$(wildcard *.make)),addons.make) + ADDONS_OBJS = $(addprefix $(OBJ_OUTPUT), $(ADDONS_OBJFILES)) + DEPFILES += $(patsubst %.o,%.d,$(ADDONS_OBJS)) +endif + +.PHONY: Debug Release all after afterDebugAndroid afterReleaseAndroid + +Release: $(TARGET) after + +Debug: $(TARGET) after + +all: + $(MAKE) Release + +DebugAndroid: $(TARGET) + +ReleaseAndroid: $(TARGET) + +Release_arm7Android: $(TARGET) + +Release_neonAndroid: $(TARGET) afterReleaseAndroid + +TestLinkAndroid: $(TARGET) afterDebugAndroid + +AndroidDebug: + $(MAKE) DebugAndroid + $(MAKE) TestLinkAndroid + +AndroidRelease: + $(MAKE) ReleaseAndroid + $(MAKE) Release_arm7Android + $(MAKE) Release_neonAndroid + + +#This rule does the compilation +#$(OBJS): $(SOURCES) +$(OBJ_OUTPUT)%.o: %.cpp + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CXX) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: %.c + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CC) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: %.cc + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CC) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.cpp + @echo "compiling addon object for" $< + mkdir -p $(@D) + $(CXX) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< + +$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.c + @echo "compiling addon object for" $< + mkdir -p $(@D) + $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< + +$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.cc + @echo "compiling addon object for" $< + mkdir -p $(@D) + $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< + +$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.c + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.cc + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.cpp + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CXX) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(TARGET): $(OBJS) $(ADDONS_OBJS) $(USER_OBJS) $(TARGET_LIBS) $(LIB_STATIC) + @echo 'linking $(TARGET)' + mkdir -p $(@D) + $(CXX) -o $@ $(OBJS) $(ADDONS_OBJS) $(USER_OBJS) $(LDFLAGS) $(USER_LDFLAGS) $(TARGET_LIBS) $(ADDONSLIBS) $(USER_LIBS) $(LIB_STATIC) $(LIB_PATHS_FLAGS) $(LIB_SHARED) $(SYSTEMLIBS) + +-include $(DEPFILES) + +.PHONY: clean cleanDebug cleanRelease CleanAndroid +clean: + rm -rf $(OBJ_OUTPUT) + rm -f $(TARGET) + rm -r bin/libs + +$(CLEANTARGET): + rm -rf $(OBJ_OUTPUT) + rm -f $(TARGET) + rm -rf bin/libs + +CleanAndroid: + rm -Rf obj + rm -f libs/armeabi-v7a/libOFAndroidApp.so + rm -f libs/armeabi/libOFAndroidApp.so + rm -f obj/$(APPNAME) + + +afterDebugAndroid:$(TARGET) + @if [ -d libs/armeabi-v7a ]; then rm -r libs/armeabi-v7a; fi + + @cp $(NDK_ROOT)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver libs/armeabi + + #create gdb.setup for armeabi + @echo "set solib-search-path $(PWD)/obj/local/armeabi:$(PWD)/libs/armeabi" > libs/armeabi/gdb.setup + @echo "directory $(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" >> libs/armeabi/gdb.setup + @echo "directory $(PWD)/src" >> libs/armeabi/gdb.setup + @echo "directory $(NDK_ROOT)/sources/cxx-stl/system" >> libs/armeabi/gdb.setup + @echo "directory $(PWD)/libs/armeabi" >> libs/armeabi/gdb.setup + @echo "" >> libs/armeabi/gdb.setup + + @if [ ! -d jni ]; then mkdir jni; fi + @echo "APP_ABI := armeabi" > jni/Application.mk + @echo "#LOCAL_MODULE := OFAndroidApp" > jni/Android.mk + +afterReleaseAndroid:$(TARGET) + @if [ -f obj/$(BIN_NAME) ]; then rm obj/$(BIN_NAME); fi + + @cp $(OF_ROOT)/libs/openFrameworksCompiled/project/android/libneondetection.so libs/armeabi-v7a/ + @cp $(NDK_ROOT)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver libs/armeabi-v7a + + #create gdb.setup for armeabi-v7a + @echo "set solib-search-path $(PWD)/obj/local/armeabi-v7a:$(PWD)/libs/armeabi-v7a" > libs/armeabi-v7a/gdb.setup + @echo "directory $(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" >> libs/armeabi-v7a/gdb.setup + @echo "directory $(PWD)/src" >> libs/armeabi-v7a/gdb.setup + @echo "directory $(NDK_ROOT)/sources/cxx-stl/system" >> libs/armeabi-v7a/gdb.setup + @echo "directory $(PWD)/libs/armeabi-v7a" >> libs/armeabi-v7a/gdb.setup + @echo "" >> libs/armeabi-v7a/gdb.setup + + @if [ ! -d jni ]; then mkdir jni; fi + @echo "APP_ABI := armeabi armeabi-v7a" > jni/Application.mk + @echo "#LOCAL_MODULE := OFAndroidApp" > jni/Android.mk + +RESNAME=$(shell echo $(APPNAME)Resources | tr '[A-Z]' '[a-z]') + +AndroidInstall: + if [ -d "bin/data" ]; then \ + mkdir -p res/raw; \ + rm res/raw/$(RESNAME).zip; \ + cd bin/data; \ + zip -r ../../res/raw/$(RESNAME).zip *; \ + cd ../..; \ + fi + if [ -f obj/$(BIN_NAME) ]; then rm obj/$(BIN_NAME); fi + #touch AndroidManifest.xml + $(SDK_ROOT)/tools/android update project --target $(NDK_PLATFORM) --path $(PROJECT_PATH) + if [ -d bin/classes ]; then rm -r bin/classes; fi + if [ -d bin/classes.dex ]; then rm bin/classes.dex; fi + if [ -d bin/OFActivity.ap_ ]; then rm bin/OFActivity.ap_; fi + if [ -d bin/OFActivity-debug.apk ]; then rm bin/OFActivity-debug.apk; fi + if [ -d bin/OFActivity-debug-unaligned.apk ]; then rm bin/OFActivity-debug-unaligned.apk; fi + if [ -d bin/$(APPNAME).apk ]; then rm bin/$(APPNAME).apk; fi + ant debug + cp bin/OFActivity-debug.apk bin/$(APPNAME).apk + #if [ "$(shell $(SDK_ROOT)/platform-tools/adb get-state)" = "device" ]; then + $(SDK_ROOT)/platform-tools/adb install -r bin/$(APPNAME).apk; + #fi + $(SDK_ROOT)/platform-tools/adb shell am start -a android.intent.action.MAIN -n cc.openframeworks.$(APPNAME)/cc.openframeworks.$(APPNAME).OFActivity + + +after:$(TARGET) + cp -r $(OF_ROOT)/export/$(LIBSPATH)/libs bin/ + @echo + @echo " compiling done" + @echo " to launch the application" + @echo + @echo " cd bin" + @echo " ./$(BIN_NAME)" + @echo + + +.PHONY: help +help: + @echo + @echo openFrameworks universal makefile + @echo + @echo targets: + @echo "make Debug: builds the application with debug symbols" + @echo "make Release: builds the app 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 + @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 diff --git a/examples/android/androidFontExample/config.make b/examples/android/androidFontExample/config.make new file mode 100644 index 00000000000..8266e5d914e --- /dev/null +++ b/examples/android/androidFontExample/config.make @@ -0,0 +1,32 @@ +# add custom variables to this file + +# OF_ROOT allows to move projects outside apps/* just set this variable to the +# absoulte path to the OF root folder + +OF_ROOT = ../../.. + + +# USER_CFLAGS allows to pass custom flags to the compiler +# for example search paths like: +# USER_CFLAGS = -I src/objects + +USER_CFLAGS = + + +# USER_LDFLAGS allows to pass custom flags to the linker +# for example libraries like: +# USER_LD_FLAGS = libs/libawesomelib.a + +USER_LDFLAGS = + +# android specific, in case you want to use different optimizations +USER_LIBS_ARM = +USER_LIBS_ARM7 = +USER_LIBS_NEON = + +# android optimizations + +ANDROID_COMPILER_OPTIMIZATION = -Os + + +EXCLUDE_FROM_SOURCE="bin,.xcodeproj,obj" diff --git a/examples/android/androidImageExample/Makefile b/examples/android/androidImageExample/Makefile new file mode 100644 index 00000000000..f61fe5d517a --- /dev/null +++ b/examples/android/androidImageExample/Makefile @@ -0,0 +1,475 @@ +# openFrameworks universal makefile +# +# make help : shows this message +# make Debug: makes the application with debug symbols +# make Release: makes the app with optimizations +# make: the same as make Release +# make CleanDebug: cleans the Debug target +# make CleanRelease: cleans the Release target +# make clean: cleans everything +# +# +# this should work with any OF app, just copy any example +# change the name of the folder and it should compile +# only .cpp support, don't use .c files +# it will look for files in any folder inside the application +# folder except that in the EXCLUDE_FROM_SOURCE variable +# it doesn't autodetect include paths yet +# add the include paths in the USER_CFLAGS variable +# using the gcc syntax: -Ipath +# +# to add addons to your application, edit the addons.make file +# in this directory and add the names of the addons you want to +# include +# +# edit the following vars to customize the makefile + +include config.make + +ifeq ($(findstring Android,$(MAKECMDGOALS)),Android) + include $(OF_ROOT)/libs/openFrameworksCompiled/project/android/paths.make + ARCH = android + ifeq ($(shell uname),Darwin) + HOST_PLATFORM = darwin-x86 + else + HOST_PLATFORM = linux-x86 + endif +endif + +ifeq ($(ARCH),android) + COMPILER_OPTIMIZATION = $(ANDROID_COMPILER_OPTIMIZATION) + NDK_PLATFORM = android-8 +else + COMPILER_OPTIMIZATION = $(USER_COMPILER_OPTIMIZATION) +endif + + + + +# you shouldn't modify anything below this line + + +SHELL = /bin/sh +ifneq ($(ARCH),android) + CXX = g++ + ARCH = $(shell uname -m) + ifeq ($(ARCH),x86_64) + LIBSPATH=linux64 + else + LIBSPATH=linux + endif +else + ifeq ($(findstring Release_arm7,$(MAKECMDGOALS)),Release_arm7) + LIBSPATH =android/armeabi-v7a + else + LIBSPATH =android/armeabi + endif + #NDK_ROOT = $(shell cat $(OF_ROOT)/libs/openFrameworksCompiled/project/android/ndk_path.make) + #SDK_ROOT = $(shell cat $(OF_ROOT)/libs/openFrameworksCompiled/project/android/sdk_path.make) + TOOLCHAIN=arm-linux-androideabi-4.4.3 + TOOLCHAIN_PATH=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/ + ANDROID_PREFIX=arm-linux-androideabi- + CC=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)gcc + CXX=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)g++ + AR=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)ar + SYSROOT=$(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/ + CFLAGS += -nostdlib --sysroot=$(SYSROOT) -fno-short-enums + CFLAGS += -I"$(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" -I"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/include/" -I"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include" + CFLAGS += -DANDROID +endif + +NODEPS = clean +SED_EXCLUDE_FROM_SRC = $(shell echo $(EXCLUDE_FROM_SOURCE) | sed s/\,/\\\\\|/g) +SOURCE_DIRS = $(shell find . -maxdepth 1 -mindepth 1 -type d | grep -v $(SED_EXCLUDE_FROM_SRC) | sed s/.\\///) +SOURCES = $(shell find $(SOURCE_DIRS) -name "*.cpp" -or -name "*.c" -or -name "*.cc") +OBJFILES = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(patsubst %.cc,%.o,$(SOURCES)))) + +ifneq (,$(USER_SOURCE_DIR)) + USER_SOURCES = $(shell find $(USER_SOURCE_DIR) -name "*.cpp" -or -name "*.c" -or -name "*.cc") + USER_OBJFILES = $(subst $(USER_SOURCE_DIR)/, ,$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(patsubst %.cc,%.o,$(USER_SOURCES))))) +endif + +APPNAME = $(shell basename `pwd`) +CORE_INCLUDES = $(shell find $(OF_ROOT)/libs/openFrameworks/ -type d) +CORE_INCLUDE_FLAGS = $(addprefix -I,$(CORE_INCLUDES)) +INCLUDES = $(shell find $(OF_ROOT)/libs/*/include -type d | grep -v glu | grep -v quicktime | grep -v poco) +INCLUDES_FLAGS = $(addprefix -I,$(INCLUDES)) +INCLUDES_FLAGS += -I$(OF_ROOT)/libs/poco/include +ifeq ($(ARCH),android) + INCLUDES_FLAGS += -I$(OF_ROOT)/libs/glu/include_android +else + INCLUDES_FLAGS += -I$(OF_ROOT)/libs/glu/include + INCLUDES_FLAGS += $(shell pkg-config glew gstreamer-0.10 gstreamer-video-0.10 gstreamer-base-0.10 libudev --cflags) + #check if gtk exists and add it + GTK = $(shell pkg-config gtk+-2.0 --exists; echo $$?) + ifeq ($(GTK),0) + CFLAGS += $(shell pkg-config gtk+-2.0 --cflags) -DOF_USING_GTK + SYSTEMLIBS += $(shell pkg-config gtk+-2.0 --libs) + endif + + #check if mpg123 exists and add it + MPG123 = $(shell pkg-config libmpg123 --exists; echo $$?) + ifeq ($(MPG123),0) + CFLAGS += -DOF_USING_MPG123 + SYSTEMLIBS += -lmpg123 + endif +endif +LIB_STATIC = $(shell ls $(OF_ROOT)/libs/*/lib/$(LIBSPATH)/*.a 2> /dev/null | grep -v openFrameworksCompiled | grep -v Poco) +LIB_SHARED = $(shell ls $(OF_ROOT)/libs/*/lib/$(LIBSPATH)/*.so 2> /dev/null | grep -v openFrameworksCompiled | sed "s/.*\\/lib\([^/]*\)\.so/-l\1/") +LIB_STATIC += $(OF_ROOT)/libs/poco/lib/$(LIBSPATH)/libPocoNet.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoXML.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoUtil.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoFoundation.a +LIB_PATHS_FLAGS = $(shell ls -d $(OF_ROOT)/libs/*/lib/$(LIBSPATH) | sed "s/\(\.*\)/-L\1/") + +CFLAGS += -Wall -fexceptions +CFLAGS += -I. +CFLAGS += $(INCLUDES_FLAGS) +CFLAGS += $(CORE_INCLUDE_FLAGS) + + + +ifeq ($(ARCH),android) + LDFLAGS = --sysroot=$(SYSROOT) -nostdlib -L"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi" + SYSTEMLIBS += -lstdc++ -lsupc++ -lgcc -lz -lGLESv1_CM -llog -ldl -lm -lc +else + LDFLAGS = -Wl,-rpath=./libs + SYSTEMLIBS += $(shell pkg-config jack glew gstreamer-0.10 gstreamer-video-0.10 gstreamer-base-0.10 gstreamer-app-0.10 libudev --libs) + SYSTEMLIBS += -lglut -lGL -lasound -lopenal -lsndfile -lvorbis -lFLAC -logg -lfreeimage +endif + + +ifeq ($(findstring addons.make,$(wildcard *.make)),addons.make) + ifneq ($(ARCH),android) + ADDONS = $(shell cat addons.make | grep -v ofxAndroid) + else + ADDONS = $(shell cat addons.make) + endif + + ifneq ($(strip $(ADDONS)),) + ADDONS_REL_DIRS = $(addsuffix /src, $(ADDONS)) + ADDONS_LIBS_REL_DIRS = $(addsuffix /libs, $(ADDONS)) + ADDONS_DIRS = $(addprefix $(OF_ROOT)/addons/, $(ADDONS_REL_DIRS) ) + ADDONS_LIBS_DIRS = $(addprefix $(OF_ROOT)/addons/, $(ADDONS_LIBS_REL_DIRS) ) + ADDONS_BIN_LIBS_DIRS = $(addsuffix /*/lib/$(LIBSPATH), $(ADDONS_LIBS_DIRS) ) + + ADDONS_INCLUDES = $(ADDONS_DIRS) + ADDONS_INCLUDES = $(ADDONS_LIBS_DIRS) + ADDONS_INCLUDES += $(shell find $(ADDONS_DIRS) -type d 2> /dev/null) + ADDONS_INCLUDES += $(shell find $(ADDONS_LIBS_DIRS) -type d 2> /dev/null) + ADDONSCFLAGS = $(addprefix -I,$(ADDONS_INCLUDES)) + + ifeq ($(findstring libsorder.make,$(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null)),libsorder.make) + ADDONS_LIBS_W_ORDER = $(shell cat $(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null)) + EXCLUDE_LIBS_FILTER = $(addprefix %,$(addsuffix .a,$(ADDONS_LIBS_W_ORDER))) + ADDONS_LIBS_STATICS = $(filter-out $(EXCLUDE_LIBS_FILTER), $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.a)) + ADDONS_LIBS_STATICS += $(addprefix -l, $(ADDONS_LIBS_W_ORDER)) + ADDONS_LIBS_STATICS += $(addprefix -L, $(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null | sed s/libsorder.make//g)) + else + ADDONS_LIBS_STATICS = $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.a 2> /dev/null) + endif + + ADDONS_LIBS_SHARED = $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.so 2> /dev/null) + ADDONSLIBS = $(ADDONS_LIBS_STATICS) + ADDONSLIBS += $(ADDONS_LIBS_SHARED) + + + ADDONS_SOURCES = $(shell find $(ADDONS_DIRS) -name "*.cpp" -or -name "*.c" 2> /dev/null) + ADDONS_SOURCES += $(shell find $(ADDONS_LIBS_DIRS) -name "*.cpp" -or -name "*.c" -or -name "*.cc" 2>/dev/null) + ADDONS_OBJFILES = $(subst $(OF_ROOT)/, ,$(patsubst %.cc,%.o,$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(ADDONS_SOURCES))))) + endif +endif + + +ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) + TARGET_CFLAGS = -g + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworksDebug.a + TARGET_NAME = Debug +endif + +ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) + TARGET_CFLAGS = $(COMPILER_OPTIMIZATION) + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworks.a + TARGET_NAME = Release +endif + +ifeq ($(ARCH),android) + ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) + TARGET = libs/armeabi/libOFAndroidApp.so + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworksDebug.a + LDFLAGS += -Wl,--fix-cortex-a8 -shared + USER_LIBS = $(USER_LIBS_ARM) + endif + + ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) + TARGET = libs/armeabi/libOFAndroidApp.so + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks.a + LDFLAGS += -Wl,--fix-cortex-a8 -shared + USER_LIBS = $(USER_LIBS_ARM) + endif + + ifeq ($(findstring Release_arm7,$(MAKECMDGOALS)),Release_arm7) + TARGET_NAME = Release_arm7 + TARGET_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mthumb + TARGET = libs/armeabi-v7a/libOFAndroidApp.so + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks_arm7.a + USER_LIBS = $(USER_LIBS_ARM7) + endif + + ifeq ($(findstring Release_neon,$(MAKECMDGOALS)),Release_neon) + TARGET_NAME = Release_neon + TARGET_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mfpu=neon + TARGET = libs/armeabi-v7a/libOFAndroidApp_neon.so + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks_neon.a + USER_LIBS = $(USER_LIBS_NEON) + endif + + ifeq ($(findstring TestLink,$(MAKECMDGOALS)),TestLink) + TARGET_NAME = Debug + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworksDebug.a + LDFLAGS += -Wl,--entry=main,--fix-cortex-a8 + BIN_NAME = $(APPNAME) + TARGET = obj/$(BIN_NAME) + USER_LIBS = $(USER_LIBS_ARM) + endif +else + ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) + BIN_NAME = $(APPNAME)_debug + TARGET = bin/$(BIN_NAME) + endif + + ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) + BIN_NAME = $(APPNAME) + TARGET = bin/$(BIN_NAME) + endif + + ifeq ($(MAKECMDGOALS),) + TARGET_NAME = Release + BIN_NAME = $(APPNAME) + TARGET = bin/$(BIN_NAME) + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworks.a + endif +endif + +ifeq ($(MAKECMDGOALS),clean) + TARGET = bin/$(APPNAME)_debug bin/$(APPNAME) + TARGET_NAME = Release +endif + +ifeq ($(MAKECMDGOALS),AndroidInstall) + TARGET_NAME = Install +endif + +OBJ_OUTPUT = obj/$(ARCH)$(TARGET_NAME)/ +CLEANTARGET = clean$(TARGET_NAME) + +OBJS = $(addprefix $(OBJ_OUTPUT), $(OBJFILES)) +DEPFILES = $(patsubst %.o,%.d,$(OBJS)) + +USER_OBJS = $(addprefix $(OBJ_OUTPUT), $(USER_OBJFILES)) +DEPFILES += $(patsubst %.o,%.d,$(USER_OBJS)) + +ifeq ($(findstring addons.make,$(wildcard *.make)),addons.make) + ADDONS_OBJS = $(addprefix $(OBJ_OUTPUT), $(ADDONS_OBJFILES)) + DEPFILES += $(patsubst %.o,%.d,$(ADDONS_OBJS)) +endif + +.PHONY: Debug Release all after afterDebugAndroid afterReleaseAndroid + +Release: $(TARGET) after + +Debug: $(TARGET) after + +all: + $(MAKE) Release + +DebugAndroid: $(TARGET) + +ReleaseAndroid: $(TARGET) + +Release_arm7Android: $(TARGET) + +Release_neonAndroid: $(TARGET) afterReleaseAndroid + +TestLinkAndroid: $(TARGET) afterDebugAndroid + +AndroidDebug: + $(MAKE) DebugAndroid + $(MAKE) TestLinkAndroid + +AndroidRelease: + $(MAKE) ReleaseAndroid + $(MAKE) Release_arm7Android + $(MAKE) Release_neonAndroid + + +#This rule does the compilation +#$(OBJS): $(SOURCES) +$(OBJ_OUTPUT)%.o: %.cpp + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CXX) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: %.c + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CC) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: %.cc + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CC) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.cpp + @echo "compiling addon object for" $< + mkdir -p $(@D) + $(CXX) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< + +$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.c + @echo "compiling addon object for" $< + mkdir -p $(@D) + $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< + +$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.cc + @echo "compiling addon object for" $< + mkdir -p $(@D) + $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< + +$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.c + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.cc + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.cpp + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CXX) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(TARGET): $(OBJS) $(ADDONS_OBJS) $(USER_OBJS) $(TARGET_LIBS) $(LIB_STATIC) + @echo 'linking $(TARGET)' + mkdir -p $(@D) + $(CXX) -o $@ $(OBJS) $(ADDONS_OBJS) $(USER_OBJS) $(LDFLAGS) $(USER_LDFLAGS) $(TARGET_LIBS) $(ADDONSLIBS) $(USER_LIBS) $(LIB_STATIC) $(LIB_PATHS_FLAGS) $(LIB_SHARED) $(SYSTEMLIBS) + +-include $(DEPFILES) + +.PHONY: clean cleanDebug cleanRelease CleanAndroid +clean: + rm -rf $(OBJ_OUTPUT) + rm -f $(TARGET) + rm -r bin/libs + +$(CLEANTARGET): + rm -rf $(OBJ_OUTPUT) + rm -f $(TARGET) + rm -rf bin/libs + +CleanAndroid: + rm -Rf obj + rm -f libs/armeabi-v7a/libOFAndroidApp.so + rm -f libs/armeabi/libOFAndroidApp.so + rm -f obj/$(APPNAME) + + +afterDebugAndroid:$(TARGET) + @if [ -d libs/armeabi-v7a ]; then rm -r libs/armeabi-v7a; fi + + @cp $(NDK_ROOT)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver libs/armeabi + + #create gdb.setup for armeabi + @echo "set solib-search-path $(PWD)/obj/local/armeabi:$(PWD)/libs/armeabi" > libs/armeabi/gdb.setup + @echo "directory $(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" >> libs/armeabi/gdb.setup + @echo "directory $(PWD)/src" >> libs/armeabi/gdb.setup + @echo "directory $(NDK_ROOT)/sources/cxx-stl/system" >> libs/armeabi/gdb.setup + @echo "directory $(PWD)/libs/armeabi" >> libs/armeabi/gdb.setup + @echo "" >> libs/armeabi/gdb.setup + + @if [ ! -d jni ]; then mkdir jni; fi + @echo "APP_ABI := armeabi" > jni/Application.mk + @echo "#LOCAL_MODULE := OFAndroidApp" > jni/Android.mk + +afterReleaseAndroid:$(TARGET) + @if [ -f obj/$(BIN_NAME) ]; then rm obj/$(BIN_NAME); fi + + @cp $(OF_ROOT)/libs/openFrameworksCompiled/project/android/libneondetection.so libs/armeabi-v7a/ + @cp $(NDK_ROOT)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver libs/armeabi-v7a + + #create gdb.setup for armeabi-v7a + @echo "set solib-search-path $(PWD)/obj/local/armeabi-v7a:$(PWD)/libs/armeabi-v7a" > libs/armeabi-v7a/gdb.setup + @echo "directory $(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" >> libs/armeabi-v7a/gdb.setup + @echo "directory $(PWD)/src" >> libs/armeabi-v7a/gdb.setup + @echo "directory $(NDK_ROOT)/sources/cxx-stl/system" >> libs/armeabi-v7a/gdb.setup + @echo "directory $(PWD)/libs/armeabi-v7a" >> libs/armeabi-v7a/gdb.setup + @echo "" >> libs/armeabi-v7a/gdb.setup + + @if [ ! -d jni ]; then mkdir jni; fi + @echo "APP_ABI := armeabi armeabi-v7a" > jni/Application.mk + @echo "#LOCAL_MODULE := OFAndroidApp" > jni/Android.mk + +RESNAME=$(shell echo $(APPNAME)Resources | tr '[A-Z]' '[a-z]') + +AndroidInstall: + if [ -d "bin/data" ]; then \ + mkdir -p res/raw; \ + rm res/raw/$(RESNAME).zip; \ + cd bin/data; \ + zip -r ../../res/raw/$(RESNAME).zip *; \ + cd ../..; \ + fi + if [ -f obj/$(BIN_NAME) ]; then rm obj/$(BIN_NAME); fi + #touch AndroidManifest.xml + $(SDK_ROOT)/tools/android update project --target $(NDK_PLATFORM) --path $(PROJECT_PATH) + if [ -d bin/classes ]; then rm -r bin/classes; fi + if [ -d bin/classes.dex ]; then rm bin/classes.dex; fi + if [ -d bin/OFActivity.ap_ ]; then rm bin/OFActivity.ap_; fi + if [ -d bin/OFActivity-debug.apk ]; then rm bin/OFActivity-debug.apk; fi + if [ -d bin/OFActivity-debug-unaligned.apk ]; then rm bin/OFActivity-debug-unaligned.apk; fi + if [ -d bin/$(APPNAME).apk ]; then rm bin/$(APPNAME).apk; fi + ant debug + cp bin/OFActivity-debug.apk bin/$(APPNAME).apk + #if [ "$(shell $(SDK_ROOT)/platform-tools/adb get-state)" = "device" ]; then + $(SDK_ROOT)/platform-tools/adb install -r bin/$(APPNAME).apk; + #fi + $(SDK_ROOT)/platform-tools/adb shell am start -a android.intent.action.MAIN -n cc.openframeworks.$(APPNAME)/cc.openframeworks.$(APPNAME).OFActivity + + +after:$(TARGET) + cp -r $(OF_ROOT)/export/$(LIBSPATH)/libs bin/ + @echo + @echo " compiling done" + @echo " to launch the application" + @echo + @echo " cd bin" + @echo " ./$(BIN_NAME)" + @echo + + +.PHONY: help +help: + @echo + @echo openFrameworks universal makefile + @echo + @echo targets: + @echo "make Debug: builds the application with debug symbols" + @echo "make Release: builds the app 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 + @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 diff --git a/examples/android/androidImageExample/config.make b/examples/android/androidImageExample/config.make new file mode 100644 index 00000000000..8266e5d914e --- /dev/null +++ b/examples/android/androidImageExample/config.make @@ -0,0 +1,32 @@ +# add custom variables to this file + +# OF_ROOT allows to move projects outside apps/* just set this variable to the +# absoulte path to the OF root folder + +OF_ROOT = ../../.. + + +# USER_CFLAGS allows to pass custom flags to the compiler +# for example search paths like: +# USER_CFLAGS = -I src/objects + +USER_CFLAGS = + + +# USER_LDFLAGS allows to pass custom flags to the linker +# for example libraries like: +# USER_LD_FLAGS = libs/libawesomelib.a + +USER_LDFLAGS = + +# android specific, in case you want to use different optimizations +USER_LIBS_ARM = +USER_LIBS_ARM7 = +USER_LIBS_NEON = + +# android optimizations + +ANDROID_COMPILER_OPTIMIZATION = -Os + + +EXCLUDE_FROM_SOURCE="bin,.xcodeproj,obj" diff --git a/examples/android/androidOpenCVExample/Makefile b/examples/android/androidOpenCVExample/Makefile new file mode 100644 index 00000000000..f61fe5d517a --- /dev/null +++ b/examples/android/androidOpenCVExample/Makefile @@ -0,0 +1,475 @@ +# openFrameworks universal makefile +# +# make help : shows this message +# make Debug: makes the application with debug symbols +# make Release: makes the app with optimizations +# make: the same as make Release +# make CleanDebug: cleans the Debug target +# make CleanRelease: cleans the Release target +# make clean: cleans everything +# +# +# this should work with any OF app, just copy any example +# change the name of the folder and it should compile +# only .cpp support, don't use .c files +# it will look for files in any folder inside the application +# folder except that in the EXCLUDE_FROM_SOURCE variable +# it doesn't autodetect include paths yet +# add the include paths in the USER_CFLAGS variable +# using the gcc syntax: -Ipath +# +# to add addons to your application, edit the addons.make file +# in this directory and add the names of the addons you want to +# include +# +# edit the following vars to customize the makefile + +include config.make + +ifeq ($(findstring Android,$(MAKECMDGOALS)),Android) + include $(OF_ROOT)/libs/openFrameworksCompiled/project/android/paths.make + ARCH = android + ifeq ($(shell uname),Darwin) + HOST_PLATFORM = darwin-x86 + else + HOST_PLATFORM = linux-x86 + endif +endif + +ifeq ($(ARCH),android) + COMPILER_OPTIMIZATION = $(ANDROID_COMPILER_OPTIMIZATION) + NDK_PLATFORM = android-8 +else + COMPILER_OPTIMIZATION = $(USER_COMPILER_OPTIMIZATION) +endif + + + + +# you shouldn't modify anything below this line + + +SHELL = /bin/sh +ifneq ($(ARCH),android) + CXX = g++ + ARCH = $(shell uname -m) + ifeq ($(ARCH),x86_64) + LIBSPATH=linux64 + else + LIBSPATH=linux + endif +else + ifeq ($(findstring Release_arm7,$(MAKECMDGOALS)),Release_arm7) + LIBSPATH =android/armeabi-v7a + else + LIBSPATH =android/armeabi + endif + #NDK_ROOT = $(shell cat $(OF_ROOT)/libs/openFrameworksCompiled/project/android/ndk_path.make) + #SDK_ROOT = $(shell cat $(OF_ROOT)/libs/openFrameworksCompiled/project/android/sdk_path.make) + TOOLCHAIN=arm-linux-androideabi-4.4.3 + TOOLCHAIN_PATH=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/ + ANDROID_PREFIX=arm-linux-androideabi- + CC=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)gcc + CXX=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)g++ + AR=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)ar + SYSROOT=$(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/ + CFLAGS += -nostdlib --sysroot=$(SYSROOT) -fno-short-enums + CFLAGS += -I"$(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" -I"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/include/" -I"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include" + CFLAGS += -DANDROID +endif + +NODEPS = clean +SED_EXCLUDE_FROM_SRC = $(shell echo $(EXCLUDE_FROM_SOURCE) | sed s/\,/\\\\\|/g) +SOURCE_DIRS = $(shell find . -maxdepth 1 -mindepth 1 -type d | grep -v $(SED_EXCLUDE_FROM_SRC) | sed s/.\\///) +SOURCES = $(shell find $(SOURCE_DIRS) -name "*.cpp" -or -name "*.c" -or -name "*.cc") +OBJFILES = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(patsubst %.cc,%.o,$(SOURCES)))) + +ifneq (,$(USER_SOURCE_DIR)) + USER_SOURCES = $(shell find $(USER_SOURCE_DIR) -name "*.cpp" -or -name "*.c" -or -name "*.cc") + USER_OBJFILES = $(subst $(USER_SOURCE_DIR)/, ,$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(patsubst %.cc,%.o,$(USER_SOURCES))))) +endif + +APPNAME = $(shell basename `pwd`) +CORE_INCLUDES = $(shell find $(OF_ROOT)/libs/openFrameworks/ -type d) +CORE_INCLUDE_FLAGS = $(addprefix -I,$(CORE_INCLUDES)) +INCLUDES = $(shell find $(OF_ROOT)/libs/*/include -type d | grep -v glu | grep -v quicktime | grep -v poco) +INCLUDES_FLAGS = $(addprefix -I,$(INCLUDES)) +INCLUDES_FLAGS += -I$(OF_ROOT)/libs/poco/include +ifeq ($(ARCH),android) + INCLUDES_FLAGS += -I$(OF_ROOT)/libs/glu/include_android +else + INCLUDES_FLAGS += -I$(OF_ROOT)/libs/glu/include + INCLUDES_FLAGS += $(shell pkg-config glew gstreamer-0.10 gstreamer-video-0.10 gstreamer-base-0.10 libudev --cflags) + #check if gtk exists and add it + GTK = $(shell pkg-config gtk+-2.0 --exists; echo $$?) + ifeq ($(GTK),0) + CFLAGS += $(shell pkg-config gtk+-2.0 --cflags) -DOF_USING_GTK + SYSTEMLIBS += $(shell pkg-config gtk+-2.0 --libs) + endif + + #check if mpg123 exists and add it + MPG123 = $(shell pkg-config libmpg123 --exists; echo $$?) + ifeq ($(MPG123),0) + CFLAGS += -DOF_USING_MPG123 + SYSTEMLIBS += -lmpg123 + endif +endif +LIB_STATIC = $(shell ls $(OF_ROOT)/libs/*/lib/$(LIBSPATH)/*.a 2> /dev/null | grep -v openFrameworksCompiled | grep -v Poco) +LIB_SHARED = $(shell ls $(OF_ROOT)/libs/*/lib/$(LIBSPATH)/*.so 2> /dev/null | grep -v openFrameworksCompiled | sed "s/.*\\/lib\([^/]*\)\.so/-l\1/") +LIB_STATIC += $(OF_ROOT)/libs/poco/lib/$(LIBSPATH)/libPocoNet.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoXML.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoUtil.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoFoundation.a +LIB_PATHS_FLAGS = $(shell ls -d $(OF_ROOT)/libs/*/lib/$(LIBSPATH) | sed "s/\(\.*\)/-L\1/") + +CFLAGS += -Wall -fexceptions +CFLAGS += -I. +CFLAGS += $(INCLUDES_FLAGS) +CFLAGS += $(CORE_INCLUDE_FLAGS) + + + +ifeq ($(ARCH),android) + LDFLAGS = --sysroot=$(SYSROOT) -nostdlib -L"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi" + SYSTEMLIBS += -lstdc++ -lsupc++ -lgcc -lz -lGLESv1_CM -llog -ldl -lm -lc +else + LDFLAGS = -Wl,-rpath=./libs + SYSTEMLIBS += $(shell pkg-config jack glew gstreamer-0.10 gstreamer-video-0.10 gstreamer-base-0.10 gstreamer-app-0.10 libudev --libs) + SYSTEMLIBS += -lglut -lGL -lasound -lopenal -lsndfile -lvorbis -lFLAC -logg -lfreeimage +endif + + +ifeq ($(findstring addons.make,$(wildcard *.make)),addons.make) + ifneq ($(ARCH),android) + ADDONS = $(shell cat addons.make | grep -v ofxAndroid) + else + ADDONS = $(shell cat addons.make) + endif + + ifneq ($(strip $(ADDONS)),) + ADDONS_REL_DIRS = $(addsuffix /src, $(ADDONS)) + ADDONS_LIBS_REL_DIRS = $(addsuffix /libs, $(ADDONS)) + ADDONS_DIRS = $(addprefix $(OF_ROOT)/addons/, $(ADDONS_REL_DIRS) ) + ADDONS_LIBS_DIRS = $(addprefix $(OF_ROOT)/addons/, $(ADDONS_LIBS_REL_DIRS) ) + ADDONS_BIN_LIBS_DIRS = $(addsuffix /*/lib/$(LIBSPATH), $(ADDONS_LIBS_DIRS) ) + + ADDONS_INCLUDES = $(ADDONS_DIRS) + ADDONS_INCLUDES = $(ADDONS_LIBS_DIRS) + ADDONS_INCLUDES += $(shell find $(ADDONS_DIRS) -type d 2> /dev/null) + ADDONS_INCLUDES += $(shell find $(ADDONS_LIBS_DIRS) -type d 2> /dev/null) + ADDONSCFLAGS = $(addprefix -I,$(ADDONS_INCLUDES)) + + ifeq ($(findstring libsorder.make,$(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null)),libsorder.make) + ADDONS_LIBS_W_ORDER = $(shell cat $(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null)) + EXCLUDE_LIBS_FILTER = $(addprefix %,$(addsuffix .a,$(ADDONS_LIBS_W_ORDER))) + ADDONS_LIBS_STATICS = $(filter-out $(EXCLUDE_LIBS_FILTER), $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.a)) + ADDONS_LIBS_STATICS += $(addprefix -l, $(ADDONS_LIBS_W_ORDER)) + ADDONS_LIBS_STATICS += $(addprefix -L, $(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null | sed s/libsorder.make//g)) + else + ADDONS_LIBS_STATICS = $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.a 2> /dev/null) + endif + + ADDONS_LIBS_SHARED = $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.so 2> /dev/null) + ADDONSLIBS = $(ADDONS_LIBS_STATICS) + ADDONSLIBS += $(ADDONS_LIBS_SHARED) + + + ADDONS_SOURCES = $(shell find $(ADDONS_DIRS) -name "*.cpp" -or -name "*.c" 2> /dev/null) + ADDONS_SOURCES += $(shell find $(ADDONS_LIBS_DIRS) -name "*.cpp" -or -name "*.c" -or -name "*.cc" 2>/dev/null) + ADDONS_OBJFILES = $(subst $(OF_ROOT)/, ,$(patsubst %.cc,%.o,$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(ADDONS_SOURCES))))) + endif +endif + + +ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) + TARGET_CFLAGS = -g + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworksDebug.a + TARGET_NAME = Debug +endif + +ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) + TARGET_CFLAGS = $(COMPILER_OPTIMIZATION) + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworks.a + TARGET_NAME = Release +endif + +ifeq ($(ARCH),android) + ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) + TARGET = libs/armeabi/libOFAndroidApp.so + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworksDebug.a + LDFLAGS += -Wl,--fix-cortex-a8 -shared + USER_LIBS = $(USER_LIBS_ARM) + endif + + ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) + TARGET = libs/armeabi/libOFAndroidApp.so + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks.a + LDFLAGS += -Wl,--fix-cortex-a8 -shared + USER_LIBS = $(USER_LIBS_ARM) + endif + + ifeq ($(findstring Release_arm7,$(MAKECMDGOALS)),Release_arm7) + TARGET_NAME = Release_arm7 + TARGET_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mthumb + TARGET = libs/armeabi-v7a/libOFAndroidApp.so + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks_arm7.a + USER_LIBS = $(USER_LIBS_ARM7) + endif + + ifeq ($(findstring Release_neon,$(MAKECMDGOALS)),Release_neon) + TARGET_NAME = Release_neon + TARGET_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mfpu=neon + TARGET = libs/armeabi-v7a/libOFAndroidApp_neon.so + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks_neon.a + USER_LIBS = $(USER_LIBS_NEON) + endif + + ifeq ($(findstring TestLink,$(MAKECMDGOALS)),TestLink) + TARGET_NAME = Debug + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworksDebug.a + LDFLAGS += -Wl,--entry=main,--fix-cortex-a8 + BIN_NAME = $(APPNAME) + TARGET = obj/$(BIN_NAME) + USER_LIBS = $(USER_LIBS_ARM) + endif +else + ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) + BIN_NAME = $(APPNAME)_debug + TARGET = bin/$(BIN_NAME) + endif + + ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) + BIN_NAME = $(APPNAME) + TARGET = bin/$(BIN_NAME) + endif + + ifeq ($(MAKECMDGOALS),) + TARGET_NAME = Release + BIN_NAME = $(APPNAME) + TARGET = bin/$(BIN_NAME) + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworks.a + endif +endif + +ifeq ($(MAKECMDGOALS),clean) + TARGET = bin/$(APPNAME)_debug bin/$(APPNAME) + TARGET_NAME = Release +endif + +ifeq ($(MAKECMDGOALS),AndroidInstall) + TARGET_NAME = Install +endif + +OBJ_OUTPUT = obj/$(ARCH)$(TARGET_NAME)/ +CLEANTARGET = clean$(TARGET_NAME) + +OBJS = $(addprefix $(OBJ_OUTPUT), $(OBJFILES)) +DEPFILES = $(patsubst %.o,%.d,$(OBJS)) + +USER_OBJS = $(addprefix $(OBJ_OUTPUT), $(USER_OBJFILES)) +DEPFILES += $(patsubst %.o,%.d,$(USER_OBJS)) + +ifeq ($(findstring addons.make,$(wildcard *.make)),addons.make) + ADDONS_OBJS = $(addprefix $(OBJ_OUTPUT), $(ADDONS_OBJFILES)) + DEPFILES += $(patsubst %.o,%.d,$(ADDONS_OBJS)) +endif + +.PHONY: Debug Release all after afterDebugAndroid afterReleaseAndroid + +Release: $(TARGET) after + +Debug: $(TARGET) after + +all: + $(MAKE) Release + +DebugAndroid: $(TARGET) + +ReleaseAndroid: $(TARGET) + +Release_arm7Android: $(TARGET) + +Release_neonAndroid: $(TARGET) afterReleaseAndroid + +TestLinkAndroid: $(TARGET) afterDebugAndroid + +AndroidDebug: + $(MAKE) DebugAndroid + $(MAKE) TestLinkAndroid + +AndroidRelease: + $(MAKE) ReleaseAndroid + $(MAKE) Release_arm7Android + $(MAKE) Release_neonAndroid + + +#This rule does the compilation +#$(OBJS): $(SOURCES) +$(OBJ_OUTPUT)%.o: %.cpp + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CXX) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: %.c + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CC) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: %.cc + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CC) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.cpp + @echo "compiling addon object for" $< + mkdir -p $(@D) + $(CXX) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< + +$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.c + @echo "compiling addon object for" $< + mkdir -p $(@D) + $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< + +$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.cc + @echo "compiling addon object for" $< + mkdir -p $(@D) + $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< + +$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.c + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.cc + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.cpp + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CXX) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(TARGET): $(OBJS) $(ADDONS_OBJS) $(USER_OBJS) $(TARGET_LIBS) $(LIB_STATIC) + @echo 'linking $(TARGET)' + mkdir -p $(@D) + $(CXX) -o $@ $(OBJS) $(ADDONS_OBJS) $(USER_OBJS) $(LDFLAGS) $(USER_LDFLAGS) $(TARGET_LIBS) $(ADDONSLIBS) $(USER_LIBS) $(LIB_STATIC) $(LIB_PATHS_FLAGS) $(LIB_SHARED) $(SYSTEMLIBS) + +-include $(DEPFILES) + +.PHONY: clean cleanDebug cleanRelease CleanAndroid +clean: + rm -rf $(OBJ_OUTPUT) + rm -f $(TARGET) + rm -r bin/libs + +$(CLEANTARGET): + rm -rf $(OBJ_OUTPUT) + rm -f $(TARGET) + rm -rf bin/libs + +CleanAndroid: + rm -Rf obj + rm -f libs/armeabi-v7a/libOFAndroidApp.so + rm -f libs/armeabi/libOFAndroidApp.so + rm -f obj/$(APPNAME) + + +afterDebugAndroid:$(TARGET) + @if [ -d libs/armeabi-v7a ]; then rm -r libs/armeabi-v7a; fi + + @cp $(NDK_ROOT)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver libs/armeabi + + #create gdb.setup for armeabi + @echo "set solib-search-path $(PWD)/obj/local/armeabi:$(PWD)/libs/armeabi" > libs/armeabi/gdb.setup + @echo "directory $(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" >> libs/armeabi/gdb.setup + @echo "directory $(PWD)/src" >> libs/armeabi/gdb.setup + @echo "directory $(NDK_ROOT)/sources/cxx-stl/system" >> libs/armeabi/gdb.setup + @echo "directory $(PWD)/libs/armeabi" >> libs/armeabi/gdb.setup + @echo "" >> libs/armeabi/gdb.setup + + @if [ ! -d jni ]; then mkdir jni; fi + @echo "APP_ABI := armeabi" > jni/Application.mk + @echo "#LOCAL_MODULE := OFAndroidApp" > jni/Android.mk + +afterReleaseAndroid:$(TARGET) + @if [ -f obj/$(BIN_NAME) ]; then rm obj/$(BIN_NAME); fi + + @cp $(OF_ROOT)/libs/openFrameworksCompiled/project/android/libneondetection.so libs/armeabi-v7a/ + @cp $(NDK_ROOT)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver libs/armeabi-v7a + + #create gdb.setup for armeabi-v7a + @echo "set solib-search-path $(PWD)/obj/local/armeabi-v7a:$(PWD)/libs/armeabi-v7a" > libs/armeabi-v7a/gdb.setup + @echo "directory $(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" >> libs/armeabi-v7a/gdb.setup + @echo "directory $(PWD)/src" >> libs/armeabi-v7a/gdb.setup + @echo "directory $(NDK_ROOT)/sources/cxx-stl/system" >> libs/armeabi-v7a/gdb.setup + @echo "directory $(PWD)/libs/armeabi-v7a" >> libs/armeabi-v7a/gdb.setup + @echo "" >> libs/armeabi-v7a/gdb.setup + + @if [ ! -d jni ]; then mkdir jni; fi + @echo "APP_ABI := armeabi armeabi-v7a" > jni/Application.mk + @echo "#LOCAL_MODULE := OFAndroidApp" > jni/Android.mk + +RESNAME=$(shell echo $(APPNAME)Resources | tr '[A-Z]' '[a-z]') + +AndroidInstall: + if [ -d "bin/data" ]; then \ + mkdir -p res/raw; \ + rm res/raw/$(RESNAME).zip; \ + cd bin/data; \ + zip -r ../../res/raw/$(RESNAME).zip *; \ + cd ../..; \ + fi + if [ -f obj/$(BIN_NAME) ]; then rm obj/$(BIN_NAME); fi + #touch AndroidManifest.xml + $(SDK_ROOT)/tools/android update project --target $(NDK_PLATFORM) --path $(PROJECT_PATH) + if [ -d bin/classes ]; then rm -r bin/classes; fi + if [ -d bin/classes.dex ]; then rm bin/classes.dex; fi + if [ -d bin/OFActivity.ap_ ]; then rm bin/OFActivity.ap_; fi + if [ -d bin/OFActivity-debug.apk ]; then rm bin/OFActivity-debug.apk; fi + if [ -d bin/OFActivity-debug-unaligned.apk ]; then rm bin/OFActivity-debug-unaligned.apk; fi + if [ -d bin/$(APPNAME).apk ]; then rm bin/$(APPNAME).apk; fi + ant debug + cp bin/OFActivity-debug.apk bin/$(APPNAME).apk + #if [ "$(shell $(SDK_ROOT)/platform-tools/adb get-state)" = "device" ]; then + $(SDK_ROOT)/platform-tools/adb install -r bin/$(APPNAME).apk; + #fi + $(SDK_ROOT)/platform-tools/adb shell am start -a android.intent.action.MAIN -n cc.openframeworks.$(APPNAME)/cc.openframeworks.$(APPNAME).OFActivity + + +after:$(TARGET) + cp -r $(OF_ROOT)/export/$(LIBSPATH)/libs bin/ + @echo + @echo " compiling done" + @echo " to launch the application" + @echo + @echo " cd bin" + @echo " ./$(BIN_NAME)" + @echo + + +.PHONY: help +help: + @echo + @echo openFrameworks universal makefile + @echo + @echo targets: + @echo "make Debug: builds the application with debug symbols" + @echo "make Release: builds the app 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 + @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 diff --git a/examples/android/androidOpenCVExample/config.make b/examples/android/androidOpenCVExample/config.make new file mode 100644 index 00000000000..8266e5d914e --- /dev/null +++ b/examples/android/androidOpenCVExample/config.make @@ -0,0 +1,32 @@ +# add custom variables to this file + +# OF_ROOT allows to move projects outside apps/* just set this variable to the +# absoulte path to the OF root folder + +OF_ROOT = ../../.. + + +# USER_CFLAGS allows to pass custom flags to the compiler +# for example search paths like: +# USER_CFLAGS = -I src/objects + +USER_CFLAGS = + + +# USER_LDFLAGS allows to pass custom flags to the linker +# for example libraries like: +# USER_LD_FLAGS = libs/libawesomelib.a + +USER_LDFLAGS = + +# android specific, in case you want to use different optimizations +USER_LIBS_ARM = +USER_LIBS_ARM7 = +USER_LIBS_NEON = + +# android optimizations + +ANDROID_COMPILER_OPTIMIZATION = -Os + + +EXCLUDE_FROM_SOURCE="bin,.xcodeproj,obj" diff --git a/examples/android/androidPolygonExample/Makefile b/examples/android/androidPolygonExample/Makefile new file mode 100644 index 00000000000..f61fe5d517a --- /dev/null +++ b/examples/android/androidPolygonExample/Makefile @@ -0,0 +1,475 @@ +# openFrameworks universal makefile +# +# make help : shows this message +# make Debug: makes the application with debug symbols +# make Release: makes the app with optimizations +# make: the same as make Release +# make CleanDebug: cleans the Debug target +# make CleanRelease: cleans the Release target +# make clean: cleans everything +# +# +# this should work with any OF app, just copy any example +# change the name of the folder and it should compile +# only .cpp support, don't use .c files +# it will look for files in any folder inside the application +# folder except that in the EXCLUDE_FROM_SOURCE variable +# it doesn't autodetect include paths yet +# add the include paths in the USER_CFLAGS variable +# using the gcc syntax: -Ipath +# +# to add addons to your application, edit the addons.make file +# in this directory and add the names of the addons you want to +# include +# +# edit the following vars to customize the makefile + +include config.make + +ifeq ($(findstring Android,$(MAKECMDGOALS)),Android) + include $(OF_ROOT)/libs/openFrameworksCompiled/project/android/paths.make + ARCH = android + ifeq ($(shell uname),Darwin) + HOST_PLATFORM = darwin-x86 + else + HOST_PLATFORM = linux-x86 + endif +endif + +ifeq ($(ARCH),android) + COMPILER_OPTIMIZATION = $(ANDROID_COMPILER_OPTIMIZATION) + NDK_PLATFORM = android-8 +else + COMPILER_OPTIMIZATION = $(USER_COMPILER_OPTIMIZATION) +endif + + + + +# you shouldn't modify anything below this line + + +SHELL = /bin/sh +ifneq ($(ARCH),android) + CXX = g++ + ARCH = $(shell uname -m) + ifeq ($(ARCH),x86_64) + LIBSPATH=linux64 + else + LIBSPATH=linux + endif +else + ifeq ($(findstring Release_arm7,$(MAKECMDGOALS)),Release_arm7) + LIBSPATH =android/armeabi-v7a + else + LIBSPATH =android/armeabi + endif + #NDK_ROOT = $(shell cat $(OF_ROOT)/libs/openFrameworksCompiled/project/android/ndk_path.make) + #SDK_ROOT = $(shell cat $(OF_ROOT)/libs/openFrameworksCompiled/project/android/sdk_path.make) + TOOLCHAIN=arm-linux-androideabi-4.4.3 + TOOLCHAIN_PATH=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/ + ANDROID_PREFIX=arm-linux-androideabi- + CC=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)gcc + CXX=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)g++ + AR=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)ar + SYSROOT=$(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/ + CFLAGS += -nostdlib --sysroot=$(SYSROOT) -fno-short-enums + CFLAGS += -I"$(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" -I"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/include/" -I"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include" + CFLAGS += -DANDROID +endif + +NODEPS = clean +SED_EXCLUDE_FROM_SRC = $(shell echo $(EXCLUDE_FROM_SOURCE) | sed s/\,/\\\\\|/g) +SOURCE_DIRS = $(shell find . -maxdepth 1 -mindepth 1 -type d | grep -v $(SED_EXCLUDE_FROM_SRC) | sed s/.\\///) +SOURCES = $(shell find $(SOURCE_DIRS) -name "*.cpp" -or -name "*.c" -or -name "*.cc") +OBJFILES = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(patsubst %.cc,%.o,$(SOURCES)))) + +ifneq (,$(USER_SOURCE_DIR)) + USER_SOURCES = $(shell find $(USER_SOURCE_DIR) -name "*.cpp" -or -name "*.c" -or -name "*.cc") + USER_OBJFILES = $(subst $(USER_SOURCE_DIR)/, ,$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(patsubst %.cc,%.o,$(USER_SOURCES))))) +endif + +APPNAME = $(shell basename `pwd`) +CORE_INCLUDES = $(shell find $(OF_ROOT)/libs/openFrameworks/ -type d) +CORE_INCLUDE_FLAGS = $(addprefix -I,$(CORE_INCLUDES)) +INCLUDES = $(shell find $(OF_ROOT)/libs/*/include -type d | grep -v glu | grep -v quicktime | grep -v poco) +INCLUDES_FLAGS = $(addprefix -I,$(INCLUDES)) +INCLUDES_FLAGS += -I$(OF_ROOT)/libs/poco/include +ifeq ($(ARCH),android) + INCLUDES_FLAGS += -I$(OF_ROOT)/libs/glu/include_android +else + INCLUDES_FLAGS += -I$(OF_ROOT)/libs/glu/include + INCLUDES_FLAGS += $(shell pkg-config glew gstreamer-0.10 gstreamer-video-0.10 gstreamer-base-0.10 libudev --cflags) + #check if gtk exists and add it + GTK = $(shell pkg-config gtk+-2.0 --exists; echo $$?) + ifeq ($(GTK),0) + CFLAGS += $(shell pkg-config gtk+-2.0 --cflags) -DOF_USING_GTK + SYSTEMLIBS += $(shell pkg-config gtk+-2.0 --libs) + endif + + #check if mpg123 exists and add it + MPG123 = $(shell pkg-config libmpg123 --exists; echo $$?) + ifeq ($(MPG123),0) + CFLAGS += -DOF_USING_MPG123 + SYSTEMLIBS += -lmpg123 + endif +endif +LIB_STATIC = $(shell ls $(OF_ROOT)/libs/*/lib/$(LIBSPATH)/*.a 2> /dev/null | grep -v openFrameworksCompiled | grep -v Poco) +LIB_SHARED = $(shell ls $(OF_ROOT)/libs/*/lib/$(LIBSPATH)/*.so 2> /dev/null | grep -v openFrameworksCompiled | sed "s/.*\\/lib\([^/]*\)\.so/-l\1/") +LIB_STATIC += $(OF_ROOT)/libs/poco/lib/$(LIBSPATH)/libPocoNet.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoXML.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoUtil.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoFoundation.a +LIB_PATHS_FLAGS = $(shell ls -d $(OF_ROOT)/libs/*/lib/$(LIBSPATH) | sed "s/\(\.*\)/-L\1/") + +CFLAGS += -Wall -fexceptions +CFLAGS += -I. +CFLAGS += $(INCLUDES_FLAGS) +CFLAGS += $(CORE_INCLUDE_FLAGS) + + + +ifeq ($(ARCH),android) + LDFLAGS = --sysroot=$(SYSROOT) -nostdlib -L"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi" + SYSTEMLIBS += -lstdc++ -lsupc++ -lgcc -lz -lGLESv1_CM -llog -ldl -lm -lc +else + LDFLAGS = -Wl,-rpath=./libs + SYSTEMLIBS += $(shell pkg-config jack glew gstreamer-0.10 gstreamer-video-0.10 gstreamer-base-0.10 gstreamer-app-0.10 libudev --libs) + SYSTEMLIBS += -lglut -lGL -lasound -lopenal -lsndfile -lvorbis -lFLAC -logg -lfreeimage +endif + + +ifeq ($(findstring addons.make,$(wildcard *.make)),addons.make) + ifneq ($(ARCH),android) + ADDONS = $(shell cat addons.make | grep -v ofxAndroid) + else + ADDONS = $(shell cat addons.make) + endif + + ifneq ($(strip $(ADDONS)),) + ADDONS_REL_DIRS = $(addsuffix /src, $(ADDONS)) + ADDONS_LIBS_REL_DIRS = $(addsuffix /libs, $(ADDONS)) + ADDONS_DIRS = $(addprefix $(OF_ROOT)/addons/, $(ADDONS_REL_DIRS) ) + ADDONS_LIBS_DIRS = $(addprefix $(OF_ROOT)/addons/, $(ADDONS_LIBS_REL_DIRS) ) + ADDONS_BIN_LIBS_DIRS = $(addsuffix /*/lib/$(LIBSPATH), $(ADDONS_LIBS_DIRS) ) + + ADDONS_INCLUDES = $(ADDONS_DIRS) + ADDONS_INCLUDES = $(ADDONS_LIBS_DIRS) + ADDONS_INCLUDES += $(shell find $(ADDONS_DIRS) -type d 2> /dev/null) + ADDONS_INCLUDES += $(shell find $(ADDONS_LIBS_DIRS) -type d 2> /dev/null) + ADDONSCFLAGS = $(addprefix -I,$(ADDONS_INCLUDES)) + + ifeq ($(findstring libsorder.make,$(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null)),libsorder.make) + ADDONS_LIBS_W_ORDER = $(shell cat $(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null)) + EXCLUDE_LIBS_FILTER = $(addprefix %,$(addsuffix .a,$(ADDONS_LIBS_W_ORDER))) + ADDONS_LIBS_STATICS = $(filter-out $(EXCLUDE_LIBS_FILTER), $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.a)) + ADDONS_LIBS_STATICS += $(addprefix -l, $(ADDONS_LIBS_W_ORDER)) + ADDONS_LIBS_STATICS += $(addprefix -L, $(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null | sed s/libsorder.make//g)) + else + ADDONS_LIBS_STATICS = $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.a 2> /dev/null) + endif + + ADDONS_LIBS_SHARED = $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.so 2> /dev/null) + ADDONSLIBS = $(ADDONS_LIBS_STATICS) + ADDONSLIBS += $(ADDONS_LIBS_SHARED) + + + ADDONS_SOURCES = $(shell find $(ADDONS_DIRS) -name "*.cpp" -or -name "*.c" 2> /dev/null) + ADDONS_SOURCES += $(shell find $(ADDONS_LIBS_DIRS) -name "*.cpp" -or -name "*.c" -or -name "*.cc" 2>/dev/null) + ADDONS_OBJFILES = $(subst $(OF_ROOT)/, ,$(patsubst %.cc,%.o,$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(ADDONS_SOURCES))))) + endif +endif + + +ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) + TARGET_CFLAGS = -g + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworksDebug.a + TARGET_NAME = Debug +endif + +ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) + TARGET_CFLAGS = $(COMPILER_OPTIMIZATION) + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworks.a + TARGET_NAME = Release +endif + +ifeq ($(ARCH),android) + ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) + TARGET = libs/armeabi/libOFAndroidApp.so + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworksDebug.a + LDFLAGS += -Wl,--fix-cortex-a8 -shared + USER_LIBS = $(USER_LIBS_ARM) + endif + + ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) + TARGET = libs/armeabi/libOFAndroidApp.so + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks.a + LDFLAGS += -Wl,--fix-cortex-a8 -shared + USER_LIBS = $(USER_LIBS_ARM) + endif + + ifeq ($(findstring Release_arm7,$(MAKECMDGOALS)),Release_arm7) + TARGET_NAME = Release_arm7 + TARGET_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mthumb + TARGET = libs/armeabi-v7a/libOFAndroidApp.so + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks_arm7.a + USER_LIBS = $(USER_LIBS_ARM7) + endif + + ifeq ($(findstring Release_neon,$(MAKECMDGOALS)),Release_neon) + TARGET_NAME = Release_neon + TARGET_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mfpu=neon + TARGET = libs/armeabi-v7a/libOFAndroidApp_neon.so + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks_neon.a + USER_LIBS = $(USER_LIBS_NEON) + endif + + ifeq ($(findstring TestLink,$(MAKECMDGOALS)),TestLink) + TARGET_NAME = Debug + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworksDebug.a + LDFLAGS += -Wl,--entry=main,--fix-cortex-a8 + BIN_NAME = $(APPNAME) + TARGET = obj/$(BIN_NAME) + USER_LIBS = $(USER_LIBS_ARM) + endif +else + ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) + BIN_NAME = $(APPNAME)_debug + TARGET = bin/$(BIN_NAME) + endif + + ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) + BIN_NAME = $(APPNAME) + TARGET = bin/$(BIN_NAME) + endif + + ifeq ($(MAKECMDGOALS),) + TARGET_NAME = Release + BIN_NAME = $(APPNAME) + TARGET = bin/$(BIN_NAME) + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworks.a + endif +endif + +ifeq ($(MAKECMDGOALS),clean) + TARGET = bin/$(APPNAME)_debug bin/$(APPNAME) + TARGET_NAME = Release +endif + +ifeq ($(MAKECMDGOALS),AndroidInstall) + TARGET_NAME = Install +endif + +OBJ_OUTPUT = obj/$(ARCH)$(TARGET_NAME)/ +CLEANTARGET = clean$(TARGET_NAME) + +OBJS = $(addprefix $(OBJ_OUTPUT), $(OBJFILES)) +DEPFILES = $(patsubst %.o,%.d,$(OBJS)) + +USER_OBJS = $(addprefix $(OBJ_OUTPUT), $(USER_OBJFILES)) +DEPFILES += $(patsubst %.o,%.d,$(USER_OBJS)) + +ifeq ($(findstring addons.make,$(wildcard *.make)),addons.make) + ADDONS_OBJS = $(addprefix $(OBJ_OUTPUT), $(ADDONS_OBJFILES)) + DEPFILES += $(patsubst %.o,%.d,$(ADDONS_OBJS)) +endif + +.PHONY: Debug Release all after afterDebugAndroid afterReleaseAndroid + +Release: $(TARGET) after + +Debug: $(TARGET) after + +all: + $(MAKE) Release + +DebugAndroid: $(TARGET) + +ReleaseAndroid: $(TARGET) + +Release_arm7Android: $(TARGET) + +Release_neonAndroid: $(TARGET) afterReleaseAndroid + +TestLinkAndroid: $(TARGET) afterDebugAndroid + +AndroidDebug: + $(MAKE) DebugAndroid + $(MAKE) TestLinkAndroid + +AndroidRelease: + $(MAKE) ReleaseAndroid + $(MAKE) Release_arm7Android + $(MAKE) Release_neonAndroid + + +#This rule does the compilation +#$(OBJS): $(SOURCES) +$(OBJ_OUTPUT)%.o: %.cpp + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CXX) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: %.c + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CC) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: %.cc + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CC) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.cpp + @echo "compiling addon object for" $< + mkdir -p $(@D) + $(CXX) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< + +$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.c + @echo "compiling addon object for" $< + mkdir -p $(@D) + $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< + +$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.cc + @echo "compiling addon object for" $< + mkdir -p $(@D) + $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< + +$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.c + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.cc + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.cpp + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CXX) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(TARGET): $(OBJS) $(ADDONS_OBJS) $(USER_OBJS) $(TARGET_LIBS) $(LIB_STATIC) + @echo 'linking $(TARGET)' + mkdir -p $(@D) + $(CXX) -o $@ $(OBJS) $(ADDONS_OBJS) $(USER_OBJS) $(LDFLAGS) $(USER_LDFLAGS) $(TARGET_LIBS) $(ADDONSLIBS) $(USER_LIBS) $(LIB_STATIC) $(LIB_PATHS_FLAGS) $(LIB_SHARED) $(SYSTEMLIBS) + +-include $(DEPFILES) + +.PHONY: clean cleanDebug cleanRelease CleanAndroid +clean: + rm -rf $(OBJ_OUTPUT) + rm -f $(TARGET) + rm -r bin/libs + +$(CLEANTARGET): + rm -rf $(OBJ_OUTPUT) + rm -f $(TARGET) + rm -rf bin/libs + +CleanAndroid: + rm -Rf obj + rm -f libs/armeabi-v7a/libOFAndroidApp.so + rm -f libs/armeabi/libOFAndroidApp.so + rm -f obj/$(APPNAME) + + +afterDebugAndroid:$(TARGET) + @if [ -d libs/armeabi-v7a ]; then rm -r libs/armeabi-v7a; fi + + @cp $(NDK_ROOT)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver libs/armeabi + + #create gdb.setup for armeabi + @echo "set solib-search-path $(PWD)/obj/local/armeabi:$(PWD)/libs/armeabi" > libs/armeabi/gdb.setup + @echo "directory $(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" >> libs/armeabi/gdb.setup + @echo "directory $(PWD)/src" >> libs/armeabi/gdb.setup + @echo "directory $(NDK_ROOT)/sources/cxx-stl/system" >> libs/armeabi/gdb.setup + @echo "directory $(PWD)/libs/armeabi" >> libs/armeabi/gdb.setup + @echo "" >> libs/armeabi/gdb.setup + + @if [ ! -d jni ]; then mkdir jni; fi + @echo "APP_ABI := armeabi" > jni/Application.mk + @echo "#LOCAL_MODULE := OFAndroidApp" > jni/Android.mk + +afterReleaseAndroid:$(TARGET) + @if [ -f obj/$(BIN_NAME) ]; then rm obj/$(BIN_NAME); fi + + @cp $(OF_ROOT)/libs/openFrameworksCompiled/project/android/libneondetection.so libs/armeabi-v7a/ + @cp $(NDK_ROOT)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver libs/armeabi-v7a + + #create gdb.setup for armeabi-v7a + @echo "set solib-search-path $(PWD)/obj/local/armeabi-v7a:$(PWD)/libs/armeabi-v7a" > libs/armeabi-v7a/gdb.setup + @echo "directory $(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" >> libs/armeabi-v7a/gdb.setup + @echo "directory $(PWD)/src" >> libs/armeabi-v7a/gdb.setup + @echo "directory $(NDK_ROOT)/sources/cxx-stl/system" >> libs/armeabi-v7a/gdb.setup + @echo "directory $(PWD)/libs/armeabi-v7a" >> libs/armeabi-v7a/gdb.setup + @echo "" >> libs/armeabi-v7a/gdb.setup + + @if [ ! -d jni ]; then mkdir jni; fi + @echo "APP_ABI := armeabi armeabi-v7a" > jni/Application.mk + @echo "#LOCAL_MODULE := OFAndroidApp" > jni/Android.mk + +RESNAME=$(shell echo $(APPNAME)Resources | tr '[A-Z]' '[a-z]') + +AndroidInstall: + if [ -d "bin/data" ]; then \ + mkdir -p res/raw; \ + rm res/raw/$(RESNAME).zip; \ + cd bin/data; \ + zip -r ../../res/raw/$(RESNAME).zip *; \ + cd ../..; \ + fi + if [ -f obj/$(BIN_NAME) ]; then rm obj/$(BIN_NAME); fi + #touch AndroidManifest.xml + $(SDK_ROOT)/tools/android update project --target $(NDK_PLATFORM) --path $(PROJECT_PATH) + if [ -d bin/classes ]; then rm -r bin/classes; fi + if [ -d bin/classes.dex ]; then rm bin/classes.dex; fi + if [ -d bin/OFActivity.ap_ ]; then rm bin/OFActivity.ap_; fi + if [ -d bin/OFActivity-debug.apk ]; then rm bin/OFActivity-debug.apk; fi + if [ -d bin/OFActivity-debug-unaligned.apk ]; then rm bin/OFActivity-debug-unaligned.apk; fi + if [ -d bin/$(APPNAME).apk ]; then rm bin/$(APPNAME).apk; fi + ant debug + cp bin/OFActivity-debug.apk bin/$(APPNAME).apk + #if [ "$(shell $(SDK_ROOT)/platform-tools/adb get-state)" = "device" ]; then + $(SDK_ROOT)/platform-tools/adb install -r bin/$(APPNAME).apk; + #fi + $(SDK_ROOT)/platform-tools/adb shell am start -a android.intent.action.MAIN -n cc.openframeworks.$(APPNAME)/cc.openframeworks.$(APPNAME).OFActivity + + +after:$(TARGET) + cp -r $(OF_ROOT)/export/$(LIBSPATH)/libs bin/ + @echo + @echo " compiling done" + @echo " to launch the application" + @echo + @echo " cd bin" + @echo " ./$(BIN_NAME)" + @echo + + +.PHONY: help +help: + @echo + @echo openFrameworks universal makefile + @echo + @echo targets: + @echo "make Debug: builds the application with debug symbols" + @echo "make Release: builds the app 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 + @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 diff --git a/examples/android/androidPolygonExample/config.make b/examples/android/androidPolygonExample/config.make new file mode 100644 index 00000000000..8266e5d914e --- /dev/null +++ b/examples/android/androidPolygonExample/config.make @@ -0,0 +1,32 @@ +# add custom variables to this file + +# OF_ROOT allows to move projects outside apps/* just set this variable to the +# absoulte path to the OF root folder + +OF_ROOT = ../../.. + + +# USER_CFLAGS allows to pass custom flags to the compiler +# for example search paths like: +# USER_CFLAGS = -I src/objects + +USER_CFLAGS = + + +# USER_LDFLAGS allows to pass custom flags to the linker +# for example libraries like: +# USER_LD_FLAGS = libs/libawesomelib.a + +USER_LDFLAGS = + +# android specific, in case you want to use different optimizations +USER_LIBS_ARM = +USER_LIBS_ARM7 = +USER_LIBS_NEON = + +# android optimizations + +ANDROID_COMPILER_OPTIMIZATION = -Os + + +EXCLUDE_FROM_SOURCE="bin,.xcodeproj,obj" diff --git a/examples/android/androidSoundPlayerExample/Makefile b/examples/android/androidSoundPlayerExample/Makefile new file mode 100644 index 00000000000..f61fe5d517a --- /dev/null +++ b/examples/android/androidSoundPlayerExample/Makefile @@ -0,0 +1,475 @@ +# openFrameworks universal makefile +# +# make help : shows this message +# make Debug: makes the application with debug symbols +# make Release: makes the app with optimizations +# make: the same as make Release +# make CleanDebug: cleans the Debug target +# make CleanRelease: cleans the Release target +# make clean: cleans everything +# +# +# this should work with any OF app, just copy any example +# change the name of the folder and it should compile +# only .cpp support, don't use .c files +# it will look for files in any folder inside the application +# folder except that in the EXCLUDE_FROM_SOURCE variable +# it doesn't autodetect include paths yet +# add the include paths in the USER_CFLAGS variable +# using the gcc syntax: -Ipath +# +# to add addons to your application, edit the addons.make file +# in this directory and add the names of the addons you want to +# include +# +# edit the following vars to customize the makefile + +include config.make + +ifeq ($(findstring Android,$(MAKECMDGOALS)),Android) + include $(OF_ROOT)/libs/openFrameworksCompiled/project/android/paths.make + ARCH = android + ifeq ($(shell uname),Darwin) + HOST_PLATFORM = darwin-x86 + else + HOST_PLATFORM = linux-x86 + endif +endif + +ifeq ($(ARCH),android) + COMPILER_OPTIMIZATION = $(ANDROID_COMPILER_OPTIMIZATION) + NDK_PLATFORM = android-8 +else + COMPILER_OPTIMIZATION = $(USER_COMPILER_OPTIMIZATION) +endif + + + + +# you shouldn't modify anything below this line + + +SHELL = /bin/sh +ifneq ($(ARCH),android) + CXX = g++ + ARCH = $(shell uname -m) + ifeq ($(ARCH),x86_64) + LIBSPATH=linux64 + else + LIBSPATH=linux + endif +else + ifeq ($(findstring Release_arm7,$(MAKECMDGOALS)),Release_arm7) + LIBSPATH =android/armeabi-v7a + else + LIBSPATH =android/armeabi + endif + #NDK_ROOT = $(shell cat $(OF_ROOT)/libs/openFrameworksCompiled/project/android/ndk_path.make) + #SDK_ROOT = $(shell cat $(OF_ROOT)/libs/openFrameworksCompiled/project/android/sdk_path.make) + TOOLCHAIN=arm-linux-androideabi-4.4.3 + TOOLCHAIN_PATH=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/ + ANDROID_PREFIX=arm-linux-androideabi- + CC=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)gcc + CXX=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)g++ + AR=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)ar + SYSROOT=$(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/ + CFLAGS += -nostdlib --sysroot=$(SYSROOT) -fno-short-enums + CFLAGS += -I"$(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" -I"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/include/" -I"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include" + CFLAGS += -DANDROID +endif + +NODEPS = clean +SED_EXCLUDE_FROM_SRC = $(shell echo $(EXCLUDE_FROM_SOURCE) | sed s/\,/\\\\\|/g) +SOURCE_DIRS = $(shell find . -maxdepth 1 -mindepth 1 -type d | grep -v $(SED_EXCLUDE_FROM_SRC) | sed s/.\\///) +SOURCES = $(shell find $(SOURCE_DIRS) -name "*.cpp" -or -name "*.c" -or -name "*.cc") +OBJFILES = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(patsubst %.cc,%.o,$(SOURCES)))) + +ifneq (,$(USER_SOURCE_DIR)) + USER_SOURCES = $(shell find $(USER_SOURCE_DIR) -name "*.cpp" -or -name "*.c" -or -name "*.cc") + USER_OBJFILES = $(subst $(USER_SOURCE_DIR)/, ,$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(patsubst %.cc,%.o,$(USER_SOURCES))))) +endif + +APPNAME = $(shell basename `pwd`) +CORE_INCLUDES = $(shell find $(OF_ROOT)/libs/openFrameworks/ -type d) +CORE_INCLUDE_FLAGS = $(addprefix -I,$(CORE_INCLUDES)) +INCLUDES = $(shell find $(OF_ROOT)/libs/*/include -type d | grep -v glu | grep -v quicktime | grep -v poco) +INCLUDES_FLAGS = $(addprefix -I,$(INCLUDES)) +INCLUDES_FLAGS += -I$(OF_ROOT)/libs/poco/include +ifeq ($(ARCH),android) + INCLUDES_FLAGS += -I$(OF_ROOT)/libs/glu/include_android +else + INCLUDES_FLAGS += -I$(OF_ROOT)/libs/glu/include + INCLUDES_FLAGS += $(shell pkg-config glew gstreamer-0.10 gstreamer-video-0.10 gstreamer-base-0.10 libudev --cflags) + #check if gtk exists and add it + GTK = $(shell pkg-config gtk+-2.0 --exists; echo $$?) + ifeq ($(GTK),0) + CFLAGS += $(shell pkg-config gtk+-2.0 --cflags) -DOF_USING_GTK + SYSTEMLIBS += $(shell pkg-config gtk+-2.0 --libs) + endif + + #check if mpg123 exists and add it + MPG123 = $(shell pkg-config libmpg123 --exists; echo $$?) + ifeq ($(MPG123),0) + CFLAGS += -DOF_USING_MPG123 + SYSTEMLIBS += -lmpg123 + endif +endif +LIB_STATIC = $(shell ls $(OF_ROOT)/libs/*/lib/$(LIBSPATH)/*.a 2> /dev/null | grep -v openFrameworksCompiled | grep -v Poco) +LIB_SHARED = $(shell ls $(OF_ROOT)/libs/*/lib/$(LIBSPATH)/*.so 2> /dev/null | grep -v openFrameworksCompiled | sed "s/.*\\/lib\([^/]*\)\.so/-l\1/") +LIB_STATIC += $(OF_ROOT)/libs/poco/lib/$(LIBSPATH)/libPocoNet.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoXML.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoUtil.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoFoundation.a +LIB_PATHS_FLAGS = $(shell ls -d $(OF_ROOT)/libs/*/lib/$(LIBSPATH) | sed "s/\(\.*\)/-L\1/") + +CFLAGS += -Wall -fexceptions +CFLAGS += -I. +CFLAGS += $(INCLUDES_FLAGS) +CFLAGS += $(CORE_INCLUDE_FLAGS) + + + +ifeq ($(ARCH),android) + LDFLAGS = --sysroot=$(SYSROOT) -nostdlib -L"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi" + SYSTEMLIBS += -lstdc++ -lsupc++ -lgcc -lz -lGLESv1_CM -llog -ldl -lm -lc +else + LDFLAGS = -Wl,-rpath=./libs + SYSTEMLIBS += $(shell pkg-config jack glew gstreamer-0.10 gstreamer-video-0.10 gstreamer-base-0.10 gstreamer-app-0.10 libudev --libs) + SYSTEMLIBS += -lglut -lGL -lasound -lopenal -lsndfile -lvorbis -lFLAC -logg -lfreeimage +endif + + +ifeq ($(findstring addons.make,$(wildcard *.make)),addons.make) + ifneq ($(ARCH),android) + ADDONS = $(shell cat addons.make | grep -v ofxAndroid) + else + ADDONS = $(shell cat addons.make) + endif + + ifneq ($(strip $(ADDONS)),) + ADDONS_REL_DIRS = $(addsuffix /src, $(ADDONS)) + ADDONS_LIBS_REL_DIRS = $(addsuffix /libs, $(ADDONS)) + ADDONS_DIRS = $(addprefix $(OF_ROOT)/addons/, $(ADDONS_REL_DIRS) ) + ADDONS_LIBS_DIRS = $(addprefix $(OF_ROOT)/addons/, $(ADDONS_LIBS_REL_DIRS) ) + ADDONS_BIN_LIBS_DIRS = $(addsuffix /*/lib/$(LIBSPATH), $(ADDONS_LIBS_DIRS) ) + + ADDONS_INCLUDES = $(ADDONS_DIRS) + ADDONS_INCLUDES = $(ADDONS_LIBS_DIRS) + ADDONS_INCLUDES += $(shell find $(ADDONS_DIRS) -type d 2> /dev/null) + ADDONS_INCLUDES += $(shell find $(ADDONS_LIBS_DIRS) -type d 2> /dev/null) + ADDONSCFLAGS = $(addprefix -I,$(ADDONS_INCLUDES)) + + ifeq ($(findstring libsorder.make,$(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null)),libsorder.make) + ADDONS_LIBS_W_ORDER = $(shell cat $(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null)) + EXCLUDE_LIBS_FILTER = $(addprefix %,$(addsuffix .a,$(ADDONS_LIBS_W_ORDER))) + ADDONS_LIBS_STATICS = $(filter-out $(EXCLUDE_LIBS_FILTER), $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.a)) + ADDONS_LIBS_STATICS += $(addprefix -l, $(ADDONS_LIBS_W_ORDER)) + ADDONS_LIBS_STATICS += $(addprefix -L, $(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null | sed s/libsorder.make//g)) + else + ADDONS_LIBS_STATICS = $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.a 2> /dev/null) + endif + + ADDONS_LIBS_SHARED = $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.so 2> /dev/null) + ADDONSLIBS = $(ADDONS_LIBS_STATICS) + ADDONSLIBS += $(ADDONS_LIBS_SHARED) + + + ADDONS_SOURCES = $(shell find $(ADDONS_DIRS) -name "*.cpp" -or -name "*.c" 2> /dev/null) + ADDONS_SOURCES += $(shell find $(ADDONS_LIBS_DIRS) -name "*.cpp" -or -name "*.c" -or -name "*.cc" 2>/dev/null) + ADDONS_OBJFILES = $(subst $(OF_ROOT)/, ,$(patsubst %.cc,%.o,$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(ADDONS_SOURCES))))) + endif +endif + + +ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) + TARGET_CFLAGS = -g + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworksDebug.a + TARGET_NAME = Debug +endif + +ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) + TARGET_CFLAGS = $(COMPILER_OPTIMIZATION) + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworks.a + TARGET_NAME = Release +endif + +ifeq ($(ARCH),android) + ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) + TARGET = libs/armeabi/libOFAndroidApp.so + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworksDebug.a + LDFLAGS += -Wl,--fix-cortex-a8 -shared + USER_LIBS = $(USER_LIBS_ARM) + endif + + ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) + TARGET = libs/armeabi/libOFAndroidApp.so + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks.a + LDFLAGS += -Wl,--fix-cortex-a8 -shared + USER_LIBS = $(USER_LIBS_ARM) + endif + + ifeq ($(findstring Release_arm7,$(MAKECMDGOALS)),Release_arm7) + TARGET_NAME = Release_arm7 + TARGET_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mthumb + TARGET = libs/armeabi-v7a/libOFAndroidApp.so + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks_arm7.a + USER_LIBS = $(USER_LIBS_ARM7) + endif + + ifeq ($(findstring Release_neon,$(MAKECMDGOALS)),Release_neon) + TARGET_NAME = Release_neon + TARGET_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mfpu=neon + TARGET = libs/armeabi-v7a/libOFAndroidApp_neon.so + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks_neon.a + USER_LIBS = $(USER_LIBS_NEON) + endif + + ifeq ($(findstring TestLink,$(MAKECMDGOALS)),TestLink) + TARGET_NAME = Debug + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworksDebug.a + LDFLAGS += -Wl,--entry=main,--fix-cortex-a8 + BIN_NAME = $(APPNAME) + TARGET = obj/$(BIN_NAME) + USER_LIBS = $(USER_LIBS_ARM) + endif +else + ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) + BIN_NAME = $(APPNAME)_debug + TARGET = bin/$(BIN_NAME) + endif + + ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) + BIN_NAME = $(APPNAME) + TARGET = bin/$(BIN_NAME) + endif + + ifeq ($(MAKECMDGOALS),) + TARGET_NAME = Release + BIN_NAME = $(APPNAME) + TARGET = bin/$(BIN_NAME) + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworks.a + endif +endif + +ifeq ($(MAKECMDGOALS),clean) + TARGET = bin/$(APPNAME)_debug bin/$(APPNAME) + TARGET_NAME = Release +endif + +ifeq ($(MAKECMDGOALS),AndroidInstall) + TARGET_NAME = Install +endif + +OBJ_OUTPUT = obj/$(ARCH)$(TARGET_NAME)/ +CLEANTARGET = clean$(TARGET_NAME) + +OBJS = $(addprefix $(OBJ_OUTPUT), $(OBJFILES)) +DEPFILES = $(patsubst %.o,%.d,$(OBJS)) + +USER_OBJS = $(addprefix $(OBJ_OUTPUT), $(USER_OBJFILES)) +DEPFILES += $(patsubst %.o,%.d,$(USER_OBJS)) + +ifeq ($(findstring addons.make,$(wildcard *.make)),addons.make) + ADDONS_OBJS = $(addprefix $(OBJ_OUTPUT), $(ADDONS_OBJFILES)) + DEPFILES += $(patsubst %.o,%.d,$(ADDONS_OBJS)) +endif + +.PHONY: Debug Release all after afterDebugAndroid afterReleaseAndroid + +Release: $(TARGET) after + +Debug: $(TARGET) after + +all: + $(MAKE) Release + +DebugAndroid: $(TARGET) + +ReleaseAndroid: $(TARGET) + +Release_arm7Android: $(TARGET) + +Release_neonAndroid: $(TARGET) afterReleaseAndroid + +TestLinkAndroid: $(TARGET) afterDebugAndroid + +AndroidDebug: + $(MAKE) DebugAndroid + $(MAKE) TestLinkAndroid + +AndroidRelease: + $(MAKE) ReleaseAndroid + $(MAKE) Release_arm7Android + $(MAKE) Release_neonAndroid + + +#This rule does the compilation +#$(OBJS): $(SOURCES) +$(OBJ_OUTPUT)%.o: %.cpp + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CXX) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: %.c + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CC) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: %.cc + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CC) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.cpp + @echo "compiling addon object for" $< + mkdir -p $(@D) + $(CXX) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< + +$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.c + @echo "compiling addon object for" $< + mkdir -p $(@D) + $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< + +$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.cc + @echo "compiling addon object for" $< + mkdir -p $(@D) + $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< + +$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.c + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.cc + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.cpp + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CXX) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(TARGET): $(OBJS) $(ADDONS_OBJS) $(USER_OBJS) $(TARGET_LIBS) $(LIB_STATIC) + @echo 'linking $(TARGET)' + mkdir -p $(@D) + $(CXX) -o $@ $(OBJS) $(ADDONS_OBJS) $(USER_OBJS) $(LDFLAGS) $(USER_LDFLAGS) $(TARGET_LIBS) $(ADDONSLIBS) $(USER_LIBS) $(LIB_STATIC) $(LIB_PATHS_FLAGS) $(LIB_SHARED) $(SYSTEMLIBS) + +-include $(DEPFILES) + +.PHONY: clean cleanDebug cleanRelease CleanAndroid +clean: + rm -rf $(OBJ_OUTPUT) + rm -f $(TARGET) + rm -r bin/libs + +$(CLEANTARGET): + rm -rf $(OBJ_OUTPUT) + rm -f $(TARGET) + rm -rf bin/libs + +CleanAndroid: + rm -Rf obj + rm -f libs/armeabi-v7a/libOFAndroidApp.so + rm -f libs/armeabi/libOFAndroidApp.so + rm -f obj/$(APPNAME) + + +afterDebugAndroid:$(TARGET) + @if [ -d libs/armeabi-v7a ]; then rm -r libs/armeabi-v7a; fi + + @cp $(NDK_ROOT)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver libs/armeabi + + #create gdb.setup for armeabi + @echo "set solib-search-path $(PWD)/obj/local/armeabi:$(PWD)/libs/armeabi" > libs/armeabi/gdb.setup + @echo "directory $(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" >> libs/armeabi/gdb.setup + @echo "directory $(PWD)/src" >> libs/armeabi/gdb.setup + @echo "directory $(NDK_ROOT)/sources/cxx-stl/system" >> libs/armeabi/gdb.setup + @echo "directory $(PWD)/libs/armeabi" >> libs/armeabi/gdb.setup + @echo "" >> libs/armeabi/gdb.setup + + @if [ ! -d jni ]; then mkdir jni; fi + @echo "APP_ABI := armeabi" > jni/Application.mk + @echo "#LOCAL_MODULE := OFAndroidApp" > jni/Android.mk + +afterReleaseAndroid:$(TARGET) + @if [ -f obj/$(BIN_NAME) ]; then rm obj/$(BIN_NAME); fi + + @cp $(OF_ROOT)/libs/openFrameworksCompiled/project/android/libneondetection.so libs/armeabi-v7a/ + @cp $(NDK_ROOT)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver libs/armeabi-v7a + + #create gdb.setup for armeabi-v7a + @echo "set solib-search-path $(PWD)/obj/local/armeabi-v7a:$(PWD)/libs/armeabi-v7a" > libs/armeabi-v7a/gdb.setup + @echo "directory $(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" >> libs/armeabi-v7a/gdb.setup + @echo "directory $(PWD)/src" >> libs/armeabi-v7a/gdb.setup + @echo "directory $(NDK_ROOT)/sources/cxx-stl/system" >> libs/armeabi-v7a/gdb.setup + @echo "directory $(PWD)/libs/armeabi-v7a" >> libs/armeabi-v7a/gdb.setup + @echo "" >> libs/armeabi-v7a/gdb.setup + + @if [ ! -d jni ]; then mkdir jni; fi + @echo "APP_ABI := armeabi armeabi-v7a" > jni/Application.mk + @echo "#LOCAL_MODULE := OFAndroidApp" > jni/Android.mk + +RESNAME=$(shell echo $(APPNAME)Resources | tr '[A-Z]' '[a-z]') + +AndroidInstall: + if [ -d "bin/data" ]; then \ + mkdir -p res/raw; \ + rm res/raw/$(RESNAME).zip; \ + cd bin/data; \ + zip -r ../../res/raw/$(RESNAME).zip *; \ + cd ../..; \ + fi + if [ -f obj/$(BIN_NAME) ]; then rm obj/$(BIN_NAME); fi + #touch AndroidManifest.xml + $(SDK_ROOT)/tools/android update project --target $(NDK_PLATFORM) --path $(PROJECT_PATH) + if [ -d bin/classes ]; then rm -r bin/classes; fi + if [ -d bin/classes.dex ]; then rm bin/classes.dex; fi + if [ -d bin/OFActivity.ap_ ]; then rm bin/OFActivity.ap_; fi + if [ -d bin/OFActivity-debug.apk ]; then rm bin/OFActivity-debug.apk; fi + if [ -d bin/OFActivity-debug-unaligned.apk ]; then rm bin/OFActivity-debug-unaligned.apk; fi + if [ -d bin/$(APPNAME).apk ]; then rm bin/$(APPNAME).apk; fi + ant debug + cp bin/OFActivity-debug.apk bin/$(APPNAME).apk + #if [ "$(shell $(SDK_ROOT)/platform-tools/adb get-state)" = "device" ]; then + $(SDK_ROOT)/platform-tools/adb install -r bin/$(APPNAME).apk; + #fi + $(SDK_ROOT)/platform-tools/adb shell am start -a android.intent.action.MAIN -n cc.openframeworks.$(APPNAME)/cc.openframeworks.$(APPNAME).OFActivity + + +after:$(TARGET) + cp -r $(OF_ROOT)/export/$(LIBSPATH)/libs bin/ + @echo + @echo " compiling done" + @echo " to launch the application" + @echo + @echo " cd bin" + @echo " ./$(BIN_NAME)" + @echo + + +.PHONY: help +help: + @echo + @echo openFrameworks universal makefile + @echo + @echo targets: + @echo "make Debug: builds the application with debug symbols" + @echo "make Release: builds the app 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 + @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 diff --git a/examples/android/androidSoundPlayerExample/config.make b/examples/android/androidSoundPlayerExample/config.make new file mode 100644 index 00000000000..8266e5d914e --- /dev/null +++ b/examples/android/androidSoundPlayerExample/config.make @@ -0,0 +1,32 @@ +# add custom variables to this file + +# OF_ROOT allows to move projects outside apps/* just set this variable to the +# absoulte path to the OF root folder + +OF_ROOT = ../../.. + + +# USER_CFLAGS allows to pass custom flags to the compiler +# for example search paths like: +# USER_CFLAGS = -I src/objects + +USER_CFLAGS = + + +# USER_LDFLAGS allows to pass custom flags to the linker +# for example libraries like: +# USER_LD_FLAGS = libs/libawesomelib.a + +USER_LDFLAGS = + +# android specific, in case you want to use different optimizations +USER_LIBS_ARM = +USER_LIBS_ARM7 = +USER_LIBS_NEON = + +# android optimizations + +ANDROID_COMPILER_OPTIMIZATION = -Os + + +EXCLUDE_FROM_SOURCE="bin,.xcodeproj,obj" diff --git a/examples/android/androidTouchExample/Makefile b/examples/android/androidTouchExample/Makefile new file mode 100644 index 00000000000..f61fe5d517a --- /dev/null +++ b/examples/android/androidTouchExample/Makefile @@ -0,0 +1,475 @@ +# openFrameworks universal makefile +# +# make help : shows this message +# make Debug: makes the application with debug symbols +# make Release: makes the app with optimizations +# make: the same as make Release +# make CleanDebug: cleans the Debug target +# make CleanRelease: cleans the Release target +# make clean: cleans everything +# +# +# this should work with any OF app, just copy any example +# change the name of the folder and it should compile +# only .cpp support, don't use .c files +# it will look for files in any folder inside the application +# folder except that in the EXCLUDE_FROM_SOURCE variable +# it doesn't autodetect include paths yet +# add the include paths in the USER_CFLAGS variable +# using the gcc syntax: -Ipath +# +# to add addons to your application, edit the addons.make file +# in this directory and add the names of the addons you want to +# include +# +# edit the following vars to customize the makefile + +include config.make + +ifeq ($(findstring Android,$(MAKECMDGOALS)),Android) + include $(OF_ROOT)/libs/openFrameworksCompiled/project/android/paths.make + ARCH = android + ifeq ($(shell uname),Darwin) + HOST_PLATFORM = darwin-x86 + else + HOST_PLATFORM = linux-x86 + endif +endif + +ifeq ($(ARCH),android) + COMPILER_OPTIMIZATION = $(ANDROID_COMPILER_OPTIMIZATION) + NDK_PLATFORM = android-8 +else + COMPILER_OPTIMIZATION = $(USER_COMPILER_OPTIMIZATION) +endif + + + + +# you shouldn't modify anything below this line + + +SHELL = /bin/sh +ifneq ($(ARCH),android) + CXX = g++ + ARCH = $(shell uname -m) + ifeq ($(ARCH),x86_64) + LIBSPATH=linux64 + else + LIBSPATH=linux + endif +else + ifeq ($(findstring Release_arm7,$(MAKECMDGOALS)),Release_arm7) + LIBSPATH =android/armeabi-v7a + else + LIBSPATH =android/armeabi + endif + #NDK_ROOT = $(shell cat $(OF_ROOT)/libs/openFrameworksCompiled/project/android/ndk_path.make) + #SDK_ROOT = $(shell cat $(OF_ROOT)/libs/openFrameworksCompiled/project/android/sdk_path.make) + TOOLCHAIN=arm-linux-androideabi-4.4.3 + TOOLCHAIN_PATH=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/ + ANDROID_PREFIX=arm-linux-androideabi- + CC=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)gcc + CXX=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)g++ + AR=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)ar + SYSROOT=$(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/ + CFLAGS += -nostdlib --sysroot=$(SYSROOT) -fno-short-enums + CFLAGS += -I"$(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" -I"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/include/" -I"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include" + CFLAGS += -DANDROID +endif + +NODEPS = clean +SED_EXCLUDE_FROM_SRC = $(shell echo $(EXCLUDE_FROM_SOURCE) | sed s/\,/\\\\\|/g) +SOURCE_DIRS = $(shell find . -maxdepth 1 -mindepth 1 -type d | grep -v $(SED_EXCLUDE_FROM_SRC) | sed s/.\\///) +SOURCES = $(shell find $(SOURCE_DIRS) -name "*.cpp" -or -name "*.c" -or -name "*.cc") +OBJFILES = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(patsubst %.cc,%.o,$(SOURCES)))) + +ifneq (,$(USER_SOURCE_DIR)) + USER_SOURCES = $(shell find $(USER_SOURCE_DIR) -name "*.cpp" -or -name "*.c" -or -name "*.cc") + USER_OBJFILES = $(subst $(USER_SOURCE_DIR)/, ,$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(patsubst %.cc,%.o,$(USER_SOURCES))))) +endif + +APPNAME = $(shell basename `pwd`) +CORE_INCLUDES = $(shell find $(OF_ROOT)/libs/openFrameworks/ -type d) +CORE_INCLUDE_FLAGS = $(addprefix -I,$(CORE_INCLUDES)) +INCLUDES = $(shell find $(OF_ROOT)/libs/*/include -type d | grep -v glu | grep -v quicktime | grep -v poco) +INCLUDES_FLAGS = $(addprefix -I,$(INCLUDES)) +INCLUDES_FLAGS += -I$(OF_ROOT)/libs/poco/include +ifeq ($(ARCH),android) + INCLUDES_FLAGS += -I$(OF_ROOT)/libs/glu/include_android +else + INCLUDES_FLAGS += -I$(OF_ROOT)/libs/glu/include + INCLUDES_FLAGS += $(shell pkg-config glew gstreamer-0.10 gstreamer-video-0.10 gstreamer-base-0.10 libudev --cflags) + #check if gtk exists and add it + GTK = $(shell pkg-config gtk+-2.0 --exists; echo $$?) + ifeq ($(GTK),0) + CFLAGS += $(shell pkg-config gtk+-2.0 --cflags) -DOF_USING_GTK + SYSTEMLIBS += $(shell pkg-config gtk+-2.0 --libs) + endif + + #check if mpg123 exists and add it + MPG123 = $(shell pkg-config libmpg123 --exists; echo $$?) + ifeq ($(MPG123),0) + CFLAGS += -DOF_USING_MPG123 + SYSTEMLIBS += -lmpg123 + endif +endif +LIB_STATIC = $(shell ls $(OF_ROOT)/libs/*/lib/$(LIBSPATH)/*.a 2> /dev/null | grep -v openFrameworksCompiled | grep -v Poco) +LIB_SHARED = $(shell ls $(OF_ROOT)/libs/*/lib/$(LIBSPATH)/*.so 2> /dev/null | grep -v openFrameworksCompiled | sed "s/.*\\/lib\([^/]*\)\.so/-l\1/") +LIB_STATIC += $(OF_ROOT)/libs/poco/lib/$(LIBSPATH)/libPocoNet.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoXML.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoUtil.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoFoundation.a +LIB_PATHS_FLAGS = $(shell ls -d $(OF_ROOT)/libs/*/lib/$(LIBSPATH) | sed "s/\(\.*\)/-L\1/") + +CFLAGS += -Wall -fexceptions +CFLAGS += -I. +CFLAGS += $(INCLUDES_FLAGS) +CFLAGS += $(CORE_INCLUDE_FLAGS) + + + +ifeq ($(ARCH),android) + LDFLAGS = --sysroot=$(SYSROOT) -nostdlib -L"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi" + SYSTEMLIBS += -lstdc++ -lsupc++ -lgcc -lz -lGLESv1_CM -llog -ldl -lm -lc +else + LDFLAGS = -Wl,-rpath=./libs + SYSTEMLIBS += $(shell pkg-config jack glew gstreamer-0.10 gstreamer-video-0.10 gstreamer-base-0.10 gstreamer-app-0.10 libudev --libs) + SYSTEMLIBS += -lglut -lGL -lasound -lopenal -lsndfile -lvorbis -lFLAC -logg -lfreeimage +endif + + +ifeq ($(findstring addons.make,$(wildcard *.make)),addons.make) + ifneq ($(ARCH),android) + ADDONS = $(shell cat addons.make | grep -v ofxAndroid) + else + ADDONS = $(shell cat addons.make) + endif + + ifneq ($(strip $(ADDONS)),) + ADDONS_REL_DIRS = $(addsuffix /src, $(ADDONS)) + ADDONS_LIBS_REL_DIRS = $(addsuffix /libs, $(ADDONS)) + ADDONS_DIRS = $(addprefix $(OF_ROOT)/addons/, $(ADDONS_REL_DIRS) ) + ADDONS_LIBS_DIRS = $(addprefix $(OF_ROOT)/addons/, $(ADDONS_LIBS_REL_DIRS) ) + ADDONS_BIN_LIBS_DIRS = $(addsuffix /*/lib/$(LIBSPATH), $(ADDONS_LIBS_DIRS) ) + + ADDONS_INCLUDES = $(ADDONS_DIRS) + ADDONS_INCLUDES = $(ADDONS_LIBS_DIRS) + ADDONS_INCLUDES += $(shell find $(ADDONS_DIRS) -type d 2> /dev/null) + ADDONS_INCLUDES += $(shell find $(ADDONS_LIBS_DIRS) -type d 2> /dev/null) + ADDONSCFLAGS = $(addprefix -I,$(ADDONS_INCLUDES)) + + ifeq ($(findstring libsorder.make,$(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null)),libsorder.make) + ADDONS_LIBS_W_ORDER = $(shell cat $(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null)) + EXCLUDE_LIBS_FILTER = $(addprefix %,$(addsuffix .a,$(ADDONS_LIBS_W_ORDER))) + ADDONS_LIBS_STATICS = $(filter-out $(EXCLUDE_LIBS_FILTER), $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.a)) + ADDONS_LIBS_STATICS += $(addprefix -l, $(ADDONS_LIBS_W_ORDER)) + ADDONS_LIBS_STATICS += $(addprefix -L, $(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null | sed s/libsorder.make//g)) + else + ADDONS_LIBS_STATICS = $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.a 2> /dev/null) + endif + + ADDONS_LIBS_SHARED = $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.so 2> /dev/null) + ADDONSLIBS = $(ADDONS_LIBS_STATICS) + ADDONSLIBS += $(ADDONS_LIBS_SHARED) + + + ADDONS_SOURCES = $(shell find $(ADDONS_DIRS) -name "*.cpp" -or -name "*.c" 2> /dev/null) + ADDONS_SOURCES += $(shell find $(ADDONS_LIBS_DIRS) -name "*.cpp" -or -name "*.c" -or -name "*.cc" 2>/dev/null) + ADDONS_OBJFILES = $(subst $(OF_ROOT)/, ,$(patsubst %.cc,%.o,$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(ADDONS_SOURCES))))) + endif +endif + + +ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) + TARGET_CFLAGS = -g + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworksDebug.a + TARGET_NAME = Debug +endif + +ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) + TARGET_CFLAGS = $(COMPILER_OPTIMIZATION) + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworks.a + TARGET_NAME = Release +endif + +ifeq ($(ARCH),android) + ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) + TARGET = libs/armeabi/libOFAndroidApp.so + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworksDebug.a + LDFLAGS += -Wl,--fix-cortex-a8 -shared + USER_LIBS = $(USER_LIBS_ARM) + endif + + ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) + TARGET = libs/armeabi/libOFAndroidApp.so + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks.a + LDFLAGS += -Wl,--fix-cortex-a8 -shared + USER_LIBS = $(USER_LIBS_ARM) + endif + + ifeq ($(findstring Release_arm7,$(MAKECMDGOALS)),Release_arm7) + TARGET_NAME = Release_arm7 + TARGET_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mthumb + TARGET = libs/armeabi-v7a/libOFAndroidApp.so + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks_arm7.a + USER_LIBS = $(USER_LIBS_ARM7) + endif + + ifeq ($(findstring Release_neon,$(MAKECMDGOALS)),Release_neon) + TARGET_NAME = Release_neon + TARGET_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mfpu=neon + TARGET = libs/armeabi-v7a/libOFAndroidApp_neon.so + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks_neon.a + USER_LIBS = $(USER_LIBS_NEON) + endif + + ifeq ($(findstring TestLink,$(MAKECMDGOALS)),TestLink) + TARGET_NAME = Debug + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworksDebug.a + LDFLAGS += -Wl,--entry=main,--fix-cortex-a8 + BIN_NAME = $(APPNAME) + TARGET = obj/$(BIN_NAME) + USER_LIBS = $(USER_LIBS_ARM) + endif +else + ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) + BIN_NAME = $(APPNAME)_debug + TARGET = bin/$(BIN_NAME) + endif + + ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) + BIN_NAME = $(APPNAME) + TARGET = bin/$(BIN_NAME) + endif + + ifeq ($(MAKECMDGOALS),) + TARGET_NAME = Release + BIN_NAME = $(APPNAME) + TARGET = bin/$(BIN_NAME) + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworks.a + endif +endif + +ifeq ($(MAKECMDGOALS),clean) + TARGET = bin/$(APPNAME)_debug bin/$(APPNAME) + TARGET_NAME = Release +endif + +ifeq ($(MAKECMDGOALS),AndroidInstall) + TARGET_NAME = Install +endif + +OBJ_OUTPUT = obj/$(ARCH)$(TARGET_NAME)/ +CLEANTARGET = clean$(TARGET_NAME) + +OBJS = $(addprefix $(OBJ_OUTPUT), $(OBJFILES)) +DEPFILES = $(patsubst %.o,%.d,$(OBJS)) + +USER_OBJS = $(addprefix $(OBJ_OUTPUT), $(USER_OBJFILES)) +DEPFILES += $(patsubst %.o,%.d,$(USER_OBJS)) + +ifeq ($(findstring addons.make,$(wildcard *.make)),addons.make) + ADDONS_OBJS = $(addprefix $(OBJ_OUTPUT), $(ADDONS_OBJFILES)) + DEPFILES += $(patsubst %.o,%.d,$(ADDONS_OBJS)) +endif + +.PHONY: Debug Release all after afterDebugAndroid afterReleaseAndroid + +Release: $(TARGET) after + +Debug: $(TARGET) after + +all: + $(MAKE) Release + +DebugAndroid: $(TARGET) + +ReleaseAndroid: $(TARGET) + +Release_arm7Android: $(TARGET) + +Release_neonAndroid: $(TARGET) afterReleaseAndroid + +TestLinkAndroid: $(TARGET) afterDebugAndroid + +AndroidDebug: + $(MAKE) DebugAndroid + $(MAKE) TestLinkAndroid + +AndroidRelease: + $(MAKE) ReleaseAndroid + $(MAKE) Release_arm7Android + $(MAKE) Release_neonAndroid + + +#This rule does the compilation +#$(OBJS): $(SOURCES) +$(OBJ_OUTPUT)%.o: %.cpp + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CXX) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: %.c + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CC) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: %.cc + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CC) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.cpp + @echo "compiling addon object for" $< + mkdir -p $(@D) + $(CXX) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< + +$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.c + @echo "compiling addon object for" $< + mkdir -p $(@D) + $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< + +$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.cc + @echo "compiling addon object for" $< + mkdir -p $(@D) + $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< + +$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.c + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.cc + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.cpp + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CXX) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(TARGET): $(OBJS) $(ADDONS_OBJS) $(USER_OBJS) $(TARGET_LIBS) $(LIB_STATIC) + @echo 'linking $(TARGET)' + mkdir -p $(@D) + $(CXX) -o $@ $(OBJS) $(ADDONS_OBJS) $(USER_OBJS) $(LDFLAGS) $(USER_LDFLAGS) $(TARGET_LIBS) $(ADDONSLIBS) $(USER_LIBS) $(LIB_STATIC) $(LIB_PATHS_FLAGS) $(LIB_SHARED) $(SYSTEMLIBS) + +-include $(DEPFILES) + +.PHONY: clean cleanDebug cleanRelease CleanAndroid +clean: + rm -rf $(OBJ_OUTPUT) + rm -f $(TARGET) + rm -r bin/libs + +$(CLEANTARGET): + rm -rf $(OBJ_OUTPUT) + rm -f $(TARGET) + rm -rf bin/libs + +CleanAndroid: + rm -Rf obj + rm -f libs/armeabi-v7a/libOFAndroidApp.so + rm -f libs/armeabi/libOFAndroidApp.so + rm -f obj/$(APPNAME) + + +afterDebugAndroid:$(TARGET) + @if [ -d libs/armeabi-v7a ]; then rm -r libs/armeabi-v7a; fi + + @cp $(NDK_ROOT)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver libs/armeabi + + #create gdb.setup for armeabi + @echo "set solib-search-path $(PWD)/obj/local/armeabi:$(PWD)/libs/armeabi" > libs/armeabi/gdb.setup + @echo "directory $(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" >> libs/armeabi/gdb.setup + @echo "directory $(PWD)/src" >> libs/armeabi/gdb.setup + @echo "directory $(NDK_ROOT)/sources/cxx-stl/system" >> libs/armeabi/gdb.setup + @echo "directory $(PWD)/libs/armeabi" >> libs/armeabi/gdb.setup + @echo "" >> libs/armeabi/gdb.setup + + @if [ ! -d jni ]; then mkdir jni; fi + @echo "APP_ABI := armeabi" > jni/Application.mk + @echo "#LOCAL_MODULE := OFAndroidApp" > jni/Android.mk + +afterReleaseAndroid:$(TARGET) + @if [ -f obj/$(BIN_NAME) ]; then rm obj/$(BIN_NAME); fi + + @cp $(OF_ROOT)/libs/openFrameworksCompiled/project/android/libneondetection.so libs/armeabi-v7a/ + @cp $(NDK_ROOT)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver libs/armeabi-v7a + + #create gdb.setup for armeabi-v7a + @echo "set solib-search-path $(PWD)/obj/local/armeabi-v7a:$(PWD)/libs/armeabi-v7a" > libs/armeabi-v7a/gdb.setup + @echo "directory $(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" >> libs/armeabi-v7a/gdb.setup + @echo "directory $(PWD)/src" >> libs/armeabi-v7a/gdb.setup + @echo "directory $(NDK_ROOT)/sources/cxx-stl/system" >> libs/armeabi-v7a/gdb.setup + @echo "directory $(PWD)/libs/armeabi-v7a" >> libs/armeabi-v7a/gdb.setup + @echo "" >> libs/armeabi-v7a/gdb.setup + + @if [ ! -d jni ]; then mkdir jni; fi + @echo "APP_ABI := armeabi armeabi-v7a" > jni/Application.mk + @echo "#LOCAL_MODULE := OFAndroidApp" > jni/Android.mk + +RESNAME=$(shell echo $(APPNAME)Resources | tr '[A-Z]' '[a-z]') + +AndroidInstall: + if [ -d "bin/data" ]; then \ + mkdir -p res/raw; \ + rm res/raw/$(RESNAME).zip; \ + cd bin/data; \ + zip -r ../../res/raw/$(RESNAME).zip *; \ + cd ../..; \ + fi + if [ -f obj/$(BIN_NAME) ]; then rm obj/$(BIN_NAME); fi + #touch AndroidManifest.xml + $(SDK_ROOT)/tools/android update project --target $(NDK_PLATFORM) --path $(PROJECT_PATH) + if [ -d bin/classes ]; then rm -r bin/classes; fi + if [ -d bin/classes.dex ]; then rm bin/classes.dex; fi + if [ -d bin/OFActivity.ap_ ]; then rm bin/OFActivity.ap_; fi + if [ -d bin/OFActivity-debug.apk ]; then rm bin/OFActivity-debug.apk; fi + if [ -d bin/OFActivity-debug-unaligned.apk ]; then rm bin/OFActivity-debug-unaligned.apk; fi + if [ -d bin/$(APPNAME).apk ]; then rm bin/$(APPNAME).apk; fi + ant debug + cp bin/OFActivity-debug.apk bin/$(APPNAME).apk + #if [ "$(shell $(SDK_ROOT)/platform-tools/adb get-state)" = "device" ]; then + $(SDK_ROOT)/platform-tools/adb install -r bin/$(APPNAME).apk; + #fi + $(SDK_ROOT)/platform-tools/adb shell am start -a android.intent.action.MAIN -n cc.openframeworks.$(APPNAME)/cc.openframeworks.$(APPNAME).OFActivity + + +after:$(TARGET) + cp -r $(OF_ROOT)/export/$(LIBSPATH)/libs bin/ + @echo + @echo " compiling done" + @echo " to launch the application" + @echo + @echo " cd bin" + @echo " ./$(BIN_NAME)" + @echo + + +.PHONY: help +help: + @echo + @echo openFrameworks universal makefile + @echo + @echo targets: + @echo "make Debug: builds the application with debug symbols" + @echo "make Release: builds the app 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 + @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 diff --git a/examples/android/androidTouchExample/config.make b/examples/android/androidTouchExample/config.make new file mode 100644 index 00000000000..8266e5d914e --- /dev/null +++ b/examples/android/androidTouchExample/config.make @@ -0,0 +1,32 @@ +# add custom variables to this file + +# OF_ROOT allows to move projects outside apps/* just set this variable to the +# absoulte path to the OF root folder + +OF_ROOT = ../../.. + + +# USER_CFLAGS allows to pass custom flags to the compiler +# for example search paths like: +# USER_CFLAGS = -I src/objects + +USER_CFLAGS = + + +# USER_LDFLAGS allows to pass custom flags to the linker +# for example libraries like: +# USER_LD_FLAGS = libs/libawesomelib.a + +USER_LDFLAGS = + +# android specific, in case you want to use different optimizations +USER_LIBS_ARM = +USER_LIBS_ARM7 = +USER_LIBS_NEON = + +# android optimizations + +ANDROID_COMPILER_OPTIMIZATION = -Os + + +EXCLUDE_FROM_SOURCE="bin,.xcodeproj,obj" diff --git a/examples/android/androidVBOExample/Makefile b/examples/android/androidVBOExample/Makefile new file mode 100644 index 00000000000..f61fe5d517a --- /dev/null +++ b/examples/android/androidVBOExample/Makefile @@ -0,0 +1,475 @@ +# openFrameworks universal makefile +# +# make help : shows this message +# make Debug: makes the application with debug symbols +# make Release: makes the app with optimizations +# make: the same as make Release +# make CleanDebug: cleans the Debug target +# make CleanRelease: cleans the Release target +# make clean: cleans everything +# +# +# this should work with any OF app, just copy any example +# change the name of the folder and it should compile +# only .cpp support, don't use .c files +# it will look for files in any folder inside the application +# folder except that in the EXCLUDE_FROM_SOURCE variable +# it doesn't autodetect include paths yet +# add the include paths in the USER_CFLAGS variable +# using the gcc syntax: -Ipath +# +# to add addons to your application, edit the addons.make file +# in this directory and add the names of the addons you want to +# include +# +# edit the following vars to customize the makefile + +include config.make + +ifeq ($(findstring Android,$(MAKECMDGOALS)),Android) + include $(OF_ROOT)/libs/openFrameworksCompiled/project/android/paths.make + ARCH = android + ifeq ($(shell uname),Darwin) + HOST_PLATFORM = darwin-x86 + else + HOST_PLATFORM = linux-x86 + endif +endif + +ifeq ($(ARCH),android) + COMPILER_OPTIMIZATION = $(ANDROID_COMPILER_OPTIMIZATION) + NDK_PLATFORM = android-8 +else + COMPILER_OPTIMIZATION = $(USER_COMPILER_OPTIMIZATION) +endif + + + + +# you shouldn't modify anything below this line + + +SHELL = /bin/sh +ifneq ($(ARCH),android) + CXX = g++ + ARCH = $(shell uname -m) + ifeq ($(ARCH),x86_64) + LIBSPATH=linux64 + else + LIBSPATH=linux + endif +else + ifeq ($(findstring Release_arm7,$(MAKECMDGOALS)),Release_arm7) + LIBSPATH =android/armeabi-v7a + else + LIBSPATH =android/armeabi + endif + #NDK_ROOT = $(shell cat $(OF_ROOT)/libs/openFrameworksCompiled/project/android/ndk_path.make) + #SDK_ROOT = $(shell cat $(OF_ROOT)/libs/openFrameworksCompiled/project/android/sdk_path.make) + TOOLCHAIN=arm-linux-androideabi-4.4.3 + TOOLCHAIN_PATH=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/ + ANDROID_PREFIX=arm-linux-androideabi- + CC=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)gcc + CXX=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)g++ + AR=$(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/$(HOST_PLATFORM)/bin/$(ANDROID_PREFIX)ar + SYSROOT=$(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/ + CFLAGS += -nostdlib --sysroot=$(SYSROOT) -fno-short-enums + CFLAGS += -I"$(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" -I"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/include/" -I"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include" + CFLAGS += -DANDROID +endif + +NODEPS = clean +SED_EXCLUDE_FROM_SRC = $(shell echo $(EXCLUDE_FROM_SOURCE) | sed s/\,/\\\\\|/g) +SOURCE_DIRS = $(shell find . -maxdepth 1 -mindepth 1 -type d | grep -v $(SED_EXCLUDE_FROM_SRC) | sed s/.\\///) +SOURCES = $(shell find $(SOURCE_DIRS) -name "*.cpp" -or -name "*.c" -or -name "*.cc") +OBJFILES = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(patsubst %.cc,%.o,$(SOURCES)))) + +ifneq (,$(USER_SOURCE_DIR)) + USER_SOURCES = $(shell find $(USER_SOURCE_DIR) -name "*.cpp" -or -name "*.c" -or -name "*.cc") + USER_OBJFILES = $(subst $(USER_SOURCE_DIR)/, ,$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(patsubst %.cc,%.o,$(USER_SOURCES))))) +endif + +APPNAME = $(shell basename `pwd`) +CORE_INCLUDES = $(shell find $(OF_ROOT)/libs/openFrameworks/ -type d) +CORE_INCLUDE_FLAGS = $(addprefix -I,$(CORE_INCLUDES)) +INCLUDES = $(shell find $(OF_ROOT)/libs/*/include -type d | grep -v glu | grep -v quicktime | grep -v poco) +INCLUDES_FLAGS = $(addprefix -I,$(INCLUDES)) +INCLUDES_FLAGS += -I$(OF_ROOT)/libs/poco/include +ifeq ($(ARCH),android) + INCLUDES_FLAGS += -I$(OF_ROOT)/libs/glu/include_android +else + INCLUDES_FLAGS += -I$(OF_ROOT)/libs/glu/include + INCLUDES_FLAGS += $(shell pkg-config glew gstreamer-0.10 gstreamer-video-0.10 gstreamer-base-0.10 libudev --cflags) + #check if gtk exists and add it + GTK = $(shell pkg-config gtk+-2.0 --exists; echo $$?) + ifeq ($(GTK),0) + CFLAGS += $(shell pkg-config gtk+-2.0 --cflags) -DOF_USING_GTK + SYSTEMLIBS += $(shell pkg-config gtk+-2.0 --libs) + endif + + #check if mpg123 exists and add it + MPG123 = $(shell pkg-config libmpg123 --exists; echo $$?) + ifeq ($(MPG123),0) + CFLAGS += -DOF_USING_MPG123 + SYSTEMLIBS += -lmpg123 + endif +endif +LIB_STATIC = $(shell ls $(OF_ROOT)/libs/*/lib/$(LIBSPATH)/*.a 2> /dev/null | grep -v openFrameworksCompiled | grep -v Poco) +LIB_SHARED = $(shell ls $(OF_ROOT)/libs/*/lib/$(LIBSPATH)/*.so 2> /dev/null | grep -v openFrameworksCompiled | sed "s/.*\\/lib\([^/]*\)\.so/-l\1/") +LIB_STATIC += $(OF_ROOT)/libs/poco/lib/$(LIBSPATH)/libPocoNet.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoXML.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoUtil.a ../../../libs/poco/lib/$(LIBSPATH)/libPocoFoundation.a +LIB_PATHS_FLAGS = $(shell ls -d $(OF_ROOT)/libs/*/lib/$(LIBSPATH) | sed "s/\(\.*\)/-L\1/") + +CFLAGS += -Wall -fexceptions +CFLAGS += -I. +CFLAGS += $(INCLUDES_FLAGS) +CFLAGS += $(CORE_INCLUDE_FLAGS) + + + +ifeq ($(ARCH),android) + LDFLAGS = --sysroot=$(SYSROOT) -nostdlib -L"$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi" + SYSTEMLIBS += -lstdc++ -lsupc++ -lgcc -lz -lGLESv1_CM -llog -ldl -lm -lc +else + LDFLAGS = -Wl,-rpath=./libs + SYSTEMLIBS += $(shell pkg-config jack glew gstreamer-0.10 gstreamer-video-0.10 gstreamer-base-0.10 gstreamer-app-0.10 libudev --libs) + SYSTEMLIBS += -lglut -lGL -lasound -lopenal -lsndfile -lvorbis -lFLAC -logg -lfreeimage +endif + + +ifeq ($(findstring addons.make,$(wildcard *.make)),addons.make) + ifneq ($(ARCH),android) + ADDONS = $(shell cat addons.make | grep -v ofxAndroid) + else + ADDONS = $(shell cat addons.make) + endif + + ifneq ($(strip $(ADDONS)),) + ADDONS_REL_DIRS = $(addsuffix /src, $(ADDONS)) + ADDONS_LIBS_REL_DIRS = $(addsuffix /libs, $(ADDONS)) + ADDONS_DIRS = $(addprefix $(OF_ROOT)/addons/, $(ADDONS_REL_DIRS) ) + ADDONS_LIBS_DIRS = $(addprefix $(OF_ROOT)/addons/, $(ADDONS_LIBS_REL_DIRS) ) + ADDONS_BIN_LIBS_DIRS = $(addsuffix /*/lib/$(LIBSPATH), $(ADDONS_LIBS_DIRS) ) + + ADDONS_INCLUDES = $(ADDONS_DIRS) + ADDONS_INCLUDES = $(ADDONS_LIBS_DIRS) + ADDONS_INCLUDES += $(shell find $(ADDONS_DIRS) -type d 2> /dev/null) + ADDONS_INCLUDES += $(shell find $(ADDONS_LIBS_DIRS) -type d 2> /dev/null) + ADDONSCFLAGS = $(addprefix -I,$(ADDONS_INCLUDES)) + + ifeq ($(findstring libsorder.make,$(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null)),libsorder.make) + ADDONS_LIBS_W_ORDER = $(shell cat $(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null)) + EXCLUDE_LIBS_FILTER = $(addprefix %,$(addsuffix .a,$(ADDONS_LIBS_W_ORDER))) + ADDONS_LIBS_STATICS = $(filter-out $(EXCLUDE_LIBS_FILTER), $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.a)) + ADDONS_LIBS_STATICS += $(addprefix -l, $(ADDONS_LIBS_W_ORDER)) + ADDONS_LIBS_STATICS += $(addprefix -L, $(shell find $(ADDONS_BIN_LIBS_DIRS) -name libsorder.make 2> /dev/null | sed s/libsorder.make//g)) + else + ADDONS_LIBS_STATICS = $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.a 2> /dev/null) + endif + + ADDONS_LIBS_SHARED = $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.so 2> /dev/null) + ADDONSLIBS = $(ADDONS_LIBS_STATICS) + ADDONSLIBS += $(ADDONS_LIBS_SHARED) + + + ADDONS_SOURCES = $(shell find $(ADDONS_DIRS) -name "*.cpp" -or -name "*.c" 2> /dev/null) + ADDONS_SOURCES += $(shell find $(ADDONS_LIBS_DIRS) -name "*.cpp" -or -name "*.c" -or -name "*.cc" 2>/dev/null) + ADDONS_OBJFILES = $(subst $(OF_ROOT)/, ,$(patsubst %.cc,%.o,$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(ADDONS_SOURCES))))) + endif +endif + + +ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) + TARGET_CFLAGS = -g + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworksDebug.a + TARGET_NAME = Debug +endif + +ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) + TARGET_CFLAGS = $(COMPILER_OPTIMIZATION) + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworks.a + TARGET_NAME = Release +endif + +ifeq ($(ARCH),android) + ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) + TARGET = libs/armeabi/libOFAndroidApp.so + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworksDebug.a + LDFLAGS += -Wl,--fix-cortex-a8 -shared + USER_LIBS = $(USER_LIBS_ARM) + endif + + ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) + TARGET = libs/armeabi/libOFAndroidApp.so + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks.a + LDFLAGS += -Wl,--fix-cortex-a8 -shared + USER_LIBS = $(USER_LIBS_ARM) + endif + + ifeq ($(findstring Release_arm7,$(MAKECMDGOALS)),Release_arm7) + TARGET_NAME = Release_arm7 + TARGET_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mthumb + TARGET = libs/armeabi-v7a/libOFAndroidApp.so + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks_arm7.a + USER_LIBS = $(USER_LIBS_ARM7) + endif + + ifeq ($(findstring Release_neon,$(MAKECMDGOALS)),Release_neon) + TARGET_NAME = Release_neon + TARGET_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mfpu=neon + TARGET = libs/armeabi-v7a/libOFAndroidApp_neon.so + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworks_neon.a + USER_LIBS = $(USER_LIBS_NEON) + endif + + ifeq ($(findstring TestLink,$(MAKECMDGOALS)),TestLink) + TARGET_NAME = Debug + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(ARCH)/libopenFrameworksDebug.a + LDFLAGS += -Wl,--entry=main,--fix-cortex-a8 + BIN_NAME = $(APPNAME) + TARGET = obj/$(BIN_NAME) + USER_LIBS = $(USER_LIBS_ARM) + endif +else + ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug) + BIN_NAME = $(APPNAME)_debug + TARGET = bin/$(BIN_NAME) + endif + + ifeq ($(findstring Release,$(MAKECMDGOALS)),Release) + BIN_NAME = $(APPNAME) + TARGET = bin/$(BIN_NAME) + endif + + ifeq ($(MAKECMDGOALS),) + TARGET_NAME = Release + BIN_NAME = $(APPNAME) + TARGET = bin/$(BIN_NAME) + TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/$(LIBSPATH)/libopenFrameworks.a + endif +endif + +ifeq ($(MAKECMDGOALS),clean) + TARGET = bin/$(APPNAME)_debug bin/$(APPNAME) + TARGET_NAME = Release +endif + +ifeq ($(MAKECMDGOALS),AndroidInstall) + TARGET_NAME = Install +endif + +OBJ_OUTPUT = obj/$(ARCH)$(TARGET_NAME)/ +CLEANTARGET = clean$(TARGET_NAME) + +OBJS = $(addprefix $(OBJ_OUTPUT), $(OBJFILES)) +DEPFILES = $(patsubst %.o,%.d,$(OBJS)) + +USER_OBJS = $(addprefix $(OBJ_OUTPUT), $(USER_OBJFILES)) +DEPFILES += $(patsubst %.o,%.d,$(USER_OBJS)) + +ifeq ($(findstring addons.make,$(wildcard *.make)),addons.make) + ADDONS_OBJS = $(addprefix $(OBJ_OUTPUT), $(ADDONS_OBJFILES)) + DEPFILES += $(patsubst %.o,%.d,$(ADDONS_OBJS)) +endif + +.PHONY: Debug Release all after afterDebugAndroid afterReleaseAndroid + +Release: $(TARGET) after + +Debug: $(TARGET) after + +all: + $(MAKE) Release + +DebugAndroid: $(TARGET) + +ReleaseAndroid: $(TARGET) + +Release_arm7Android: $(TARGET) + +Release_neonAndroid: $(TARGET) afterReleaseAndroid + +TestLinkAndroid: $(TARGET) afterDebugAndroid + +AndroidDebug: + $(MAKE) DebugAndroid + $(MAKE) TestLinkAndroid + +AndroidRelease: + $(MAKE) ReleaseAndroid + $(MAKE) Release_arm7Android + $(MAKE) Release_neonAndroid + + +#This rule does the compilation +#$(OBJS): $(SOURCES) +$(OBJ_OUTPUT)%.o: %.cpp + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CXX) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: %.c + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CC) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: %.cc + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CC) -c $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.cpp + @echo "compiling addon object for" $< + mkdir -p $(@D) + $(CXX) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< + +$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.c + @echo "compiling addon object for" $< + mkdir -p $(@D) + $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< + +$(OBJ_OUTPUT)%.o: $(OF_ROOT)/%.cc + @echo "compiling addon object for" $< + mkdir -p $(@D) + $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $< + +$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.c + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.cc + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CC) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(OBJ_OUTPUT)%.o: $(USER_SOURCE_DIR)/%.cpp + @echo "compiling object for: " $< + mkdir -p $(@D) + $(CXX) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o$@ -c $< + +$(TARGET): $(OBJS) $(ADDONS_OBJS) $(USER_OBJS) $(TARGET_LIBS) $(LIB_STATIC) + @echo 'linking $(TARGET)' + mkdir -p $(@D) + $(CXX) -o $@ $(OBJS) $(ADDONS_OBJS) $(USER_OBJS) $(LDFLAGS) $(USER_LDFLAGS) $(TARGET_LIBS) $(ADDONSLIBS) $(USER_LIBS) $(LIB_STATIC) $(LIB_PATHS_FLAGS) $(LIB_SHARED) $(SYSTEMLIBS) + +-include $(DEPFILES) + +.PHONY: clean cleanDebug cleanRelease CleanAndroid +clean: + rm -rf $(OBJ_OUTPUT) + rm -f $(TARGET) + rm -r bin/libs + +$(CLEANTARGET): + rm -rf $(OBJ_OUTPUT) + rm -f $(TARGET) + rm -rf bin/libs + +CleanAndroid: + rm -Rf obj + rm -f libs/armeabi-v7a/libOFAndroidApp.so + rm -f libs/armeabi/libOFAndroidApp.so + rm -f obj/$(APPNAME) + + +afterDebugAndroid:$(TARGET) + @if [ -d libs/armeabi-v7a ]; then rm -r libs/armeabi-v7a; fi + + @cp $(NDK_ROOT)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver libs/armeabi + + #create gdb.setup for armeabi + @echo "set solib-search-path $(PWD)/obj/local/armeabi:$(PWD)/libs/armeabi" > libs/armeabi/gdb.setup + @echo "directory $(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" >> libs/armeabi/gdb.setup + @echo "directory $(PWD)/src" >> libs/armeabi/gdb.setup + @echo "directory $(NDK_ROOT)/sources/cxx-stl/system" >> libs/armeabi/gdb.setup + @echo "directory $(PWD)/libs/armeabi" >> libs/armeabi/gdb.setup + @echo "" >> libs/armeabi/gdb.setup + + @if [ ! -d jni ]; then mkdir jni; fi + @echo "APP_ABI := armeabi" > jni/Application.mk + @echo "#LOCAL_MODULE := OFAndroidApp" > jni/Android.mk + +afterReleaseAndroid:$(TARGET) + @if [ -f obj/$(BIN_NAME) ]; then rm obj/$(BIN_NAME); fi + + @cp $(OF_ROOT)/libs/openFrameworksCompiled/project/android/libneondetection.so libs/armeabi-v7a/ + @cp $(NDK_ROOT)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver libs/armeabi-v7a + + #create gdb.setup for armeabi-v7a + @echo "set solib-search-path $(PWD)/obj/local/armeabi-v7a:$(PWD)/libs/armeabi-v7a" > libs/armeabi-v7a/gdb.setup + @echo "directory $(NDK_ROOT)/platforms/$(NDK_PLATFORM)/arch-arm/usr/include" >> libs/armeabi-v7a/gdb.setup + @echo "directory $(PWD)/src" >> libs/armeabi-v7a/gdb.setup + @echo "directory $(NDK_ROOT)/sources/cxx-stl/system" >> libs/armeabi-v7a/gdb.setup + @echo "directory $(PWD)/libs/armeabi-v7a" >> libs/armeabi-v7a/gdb.setup + @echo "" >> libs/armeabi-v7a/gdb.setup + + @if [ ! -d jni ]; then mkdir jni; fi + @echo "APP_ABI := armeabi armeabi-v7a" > jni/Application.mk + @echo "#LOCAL_MODULE := OFAndroidApp" > jni/Android.mk + +RESNAME=$(shell echo $(APPNAME)Resources | tr '[A-Z]' '[a-z]') + +AndroidInstall: + if [ -d "bin/data" ]; then \ + mkdir -p res/raw; \ + rm res/raw/$(RESNAME).zip; \ + cd bin/data; \ + zip -r ../../res/raw/$(RESNAME).zip *; \ + cd ../..; \ + fi + if [ -f obj/$(BIN_NAME) ]; then rm obj/$(BIN_NAME); fi + #touch AndroidManifest.xml + $(SDK_ROOT)/tools/android update project --target $(NDK_PLATFORM) --path $(PROJECT_PATH) + if [ -d bin/classes ]; then rm -r bin/classes; fi + if [ -d bin/classes.dex ]; then rm bin/classes.dex; fi + if [ -d bin/OFActivity.ap_ ]; then rm bin/OFActivity.ap_; fi + if [ -d bin/OFActivity-debug.apk ]; then rm bin/OFActivity-debug.apk; fi + if [ -d bin/OFActivity-debug-unaligned.apk ]; then rm bin/OFActivity-debug-unaligned.apk; fi + if [ -d bin/$(APPNAME).apk ]; then rm bin/$(APPNAME).apk; fi + ant debug + cp bin/OFActivity-debug.apk bin/$(APPNAME).apk + #if [ "$(shell $(SDK_ROOT)/platform-tools/adb get-state)" = "device" ]; then + $(SDK_ROOT)/platform-tools/adb install -r bin/$(APPNAME).apk; + #fi + $(SDK_ROOT)/platform-tools/adb shell am start -a android.intent.action.MAIN -n cc.openframeworks.$(APPNAME)/cc.openframeworks.$(APPNAME).OFActivity + + +after:$(TARGET) + cp -r $(OF_ROOT)/export/$(LIBSPATH)/libs bin/ + @echo + @echo " compiling done" + @echo " to launch the application" + @echo + @echo " cd bin" + @echo " ./$(BIN_NAME)" + @echo + + +.PHONY: help +help: + @echo + @echo openFrameworks universal makefile + @echo + @echo targets: + @echo "make Debug: builds the application with debug symbols" + @echo "make Release: builds the app 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 + @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 diff --git a/examples/android/androidVBOExample/config.make b/examples/android/androidVBOExample/config.make new file mode 100644 index 00000000000..8266e5d914e --- /dev/null +++ b/examples/android/androidVBOExample/config.make @@ -0,0 +1,32 @@ +# add custom variables to this file + +# OF_ROOT allows to move projects outside apps/* just set this variable to the +# absoulte path to the OF root folder + +OF_ROOT = ../../.. + + +# USER_CFLAGS allows to pass custom flags to the compiler +# for example search paths like: +# USER_CFLAGS = -I src/objects + +USER_CFLAGS = + + +# USER_LDFLAGS allows to pass custom flags to the linker +# for example libraries like: +# USER_LD_FLAGS = libs/libawesomelib.a + +USER_LDFLAGS = + +# android specific, in case you want to use different optimizations +USER_LIBS_ARM = +USER_LIBS_ARM7 = +USER_LIBS_NEON = + +# android optimizations + +ANDROID_COMPILER_OPTIMIZATION = -Os + + +EXCLUDE_FROM_SOURCE="bin,.xcodeproj,obj" From 376d2cc331945721780361b093f1b5557973a5e7 Mon Sep 17 00:00:00 2001 From: Christoph Buchner Date: Tue, 24 Apr 2012 21:02:45 +0200 Subject: [PATCH 13/13] Adapt gitignore rules to except some Android files until PG works. --- examples/.gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/examples/.gitignore b/examples/.gitignore index 4040dfc3ae9..e320c0b3bb8 100644 --- a/examples/.gitignore +++ b/examples/.gitignore @@ -43,6 +43,9 @@ Android.mk #Linux /*/*/Makefile /*/*/config.make +# Leave Android files in until project generation works +!/android/*/Makefile +!/android/*/config.make #Android /*/*/test link