Skip to content

Instantly share code, notes, and snippets.

@labe-me
Created September 3, 2011 10:31

Revisions

  1. labe-me revised this gist Sep 3, 2011. 1 changed file with 4 additions and 6 deletions.
    10 changes: 4 additions & 6 deletions Makefile.osx
    Original file line number Diff line number Diff line change
    @@ -194,14 +194,12 @@ $(CLEANTARGET):

    after:$(TARGET)
    @echo Preparing MacOS .app
    -rm -rf -v $(TARGET).app
    mkdir $(TARGET).app
    mkdir $(TARGET).app/Contents/
    mkdir $(TARGET).app/Contents/Frameworks
    mkdir $(TARGET).app/Contents/MacOS
    #-rm -rf -v $(TARGET).app
    mkdir -p $(TARGET).app/Contents/Frameworks
    mkdir -p $(TARGET).app/Contents/MacOS
    cp -r $(OF_ROOT)/libs/glut/lib/osx/* $(TARGET).app/Contents/Frameworks/
    cp -r $(OF_ROOT)/libs/fmodex/lib/osx/* $(TARGET).app/Contents/MacOS/
    mv $(TARGET) $(TARGET).app/Contents/MacOS/
    cp $(TARGET) $(TARGET).app/Contents/MacOS/
    install_name_tool -change ./libfmodex.dylib @executable_path/libfmodex.dylib $(TARGET).app/Contents/MacOS/$(BIN_NAME)
    @echo
    @echo " compiling done"
  2. labe-me created this gist Sep 3, 2011.
    241 changes: 241 additions & 0 deletions Makefile.osx
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,241 @@
    # openFrameworks OS X 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
    ARCH = i386

    COMPILER_OPTIMIZATION = $(USER_COMPILER_OPTIMIZATION)

    EXCLUDE_FROM_SOURCE="bin,.xcodeproj,obj"

    # you shouldn't modify anything below this line
    SHELL = /bin/sh
    CXX = g++
    LIBSPATH=osx

    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")
    OBJFILES = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SOURCES)))
    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
    INCLUDES_FLAGS += -I$(OF_ROOT)/libs/glu/include
    #INCLUDES_FLAGS += -I$(OF_ROOT)/libs/quicktime/include

    LIB_STATIC = $(shell ls $(OF_ROOT)/libs/*/lib/$(LIBSPATH)/*.a | grep -v openFrameworksCompiled | grep -v poco)
    LIB_STATIC += $(OF_ROOT)/libs/fmodex/lib/osx/libfmodex.dylib
    LIB_SHARED = $(shell ls $(OF_ROOT)/libs/*/lib/$(LIBSPATH)/*.so | grep -v openFrameworksCompiled | grep -v poco)
    LIB_STATIC += $(OF_ROOT)/libs/poco/lib/$(LIBSPATH)/PocoNet.a $(OF_ROOT)/libs/poco/lib/$(LIBSPATH)/PocoXML.a $(OF_ROOT)/libs/poco/lib/$(LIBSPATH)/PocoUtil.a $(OF_ROOT)/libs/poco/lib/$(LIBSPATH)/PocoFoundation.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)
    CFLAGS += -x c++ -arch $(ARCH) -fmessage-length=0 -pipe -Wno-trigraphs -fpascal-strings -Os -fasm-blocks -Wno-deprecated-declarations -Wno-invalid-offsetof -gdwarf-2 -msse3 -mssse3

    LIBS += $(LIB_SHARED)
    LIBS += $(LIB_STATIC)

    LDFLAGS = $(LIB_PATHS_FLAGS) -Wl
    LIBS += -F$(OF_ROOT)/libs/glut/lib/osx -framework AppKit -framework Cocoa -framework IOKit -framework AGL -framework AudioToolbox -framework Carbon -framework CoreAudio -CoreFoundation -framework CoreServices -framework GLUT -framework OpenGL -framework Quicktime

    #Targets
    ifeq ($(findstring Debug,$(MAKECMDGOALS)),Debug)
    TARGET_CFLAGS = -g
    TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/osx/openFrameworksDebug.a
    TARGET_NAME = Debug
    endif

    ifeq ($(findstring Release,$(MAKECMDGOALS)),Release)
    TARGET_CFLAGS = $(COMPILER_OPTIMIZATION)
    TARGET_LIBS = $(OF_ROOT)/libs/openFrameworksCompiled/lib/osx/openFrameworks.a
    TARGET_NAME = Release
    endif

    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/osx/openFrameworks.a
    endif

    ifeq ($(MAKECMDGOALS),clean)
    TARGET = bin/$(APPNAME)_debug bin/$(APPNAME)
    endif


    #Output
    OBJ_OUTPUT = obj/$(TARGET_NAME)/
    CLEANTARGET = clean$(TARGET_NAME)
    OBJS = $(addprefix $(OBJ_OUTPUT), $(OBJFILES))
    DEPFILES = $(patsubst %.o,%.d,$(OBJS))
    ifeq ($(findstring addons.make,$(wildcard *.make)),addons.make)
    ADDONS = $(shell cat addons.make)
    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))
    SED_EXCLUDE_LIBS = $(addsuffix \|,$(ADDONS_LIBS_W_ORDER))
    ADDONS_LIBS_STATICS = $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.a 2> /dev/null | grep -v '$(SED_EXCLUDE_LIBS)')
    else
    ADDONS_LIBS_STATICS = $(shell find $(ADDONS_BIN_LIBS_DIRS) -name *.a 2> /dev/null)
    endif

    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))
    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)))))
    ADDONS_OBJS = $(addprefix $(OBJ_OUTPUT), $(ADDONS_OBJFILES))
    DEPFILES += $(patsubst %.o,%.d,$(ADDONS_OBJS))
    endif

    .PHONY: Debug Release all after

    Release: $(TARGET) after

    Debug: $(TARGET) after

    all:
    $(MAKE) Release



    #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)
    $(CXX) -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)
    $(CXX) $(TARGET_CFLAGS) $(CFLAGS) $(ADDONSCFLAGS) $(USER_CFLAGS) -MMD -MP -MF$(OBJ_OUTPUT)$*.d -MT$(OBJ_OUTPUT)$*.d -o $@ -c $<

    $(TARGET): $(OBJS) $(ADDONS_OBJS)
    @echo "linking" $(TARGET) $(GTK)
    $(CXX) -arch $(ARCH) -v -o $@ $(OBJS) $(ADDONS_OBJS) $(USER_CFLAGS) $(LDFLAGS) $(USER_LDFLAGS) $(TARGET_LIBS) $(ADDONSLIBS) $(USER_LIBS) $(LIBS)

    -include $(DEPFILES)

    .PHONY: clean cleanDebug cleanRelease
    clean:
    rm -Rf obj
    rm -f -v $(TARGET)
    rm -Rf -v bin/libs

    $(CLEANTARGET):
    rm -Rf -v $(OBJ_OUTPUT)
    rm -f -v $(TARGET)

    after:$(TARGET)
    @echo Preparing MacOS .app
    -rm -rf -v $(TARGET).app
    mkdir $(TARGET).app
    mkdir $(TARGET).app/Contents/
    mkdir $(TARGET).app/Contents/Frameworks
    mkdir $(TARGET).app/Contents/MacOS
    cp -r $(OF_ROOT)/libs/glut/lib/osx/* $(TARGET).app/Contents/Frameworks/
    cp -r $(OF_ROOT)/libs/fmodex/lib/osx/* $(TARGET).app/Contents/MacOS/
    mv $(TARGET) $(TARGET).app/Contents/MacOS/
    install_name_tool -change ./libfmodex.dylib @executable_path/libfmodex.dylib $(TARGET).app/Contents/MacOS/$(BIN_NAME)
    @echo
    @echo " compiling done"
    @echo " to launch the application"
    @echo
    @echo " open $(TARGET).app"
    @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