Skip to content
Snippets Groups Projects
Makefile 4.76 KiB
Newer Older
  • Learn to ignore specific revisions
  • ###########################################################################
    # Fadecandy Server
    
    TARGET := fcserver
    
    CPP_FILES += \
    
    	src/usbdevice.cpp \
    	src/fcdevice.cpp \
    	src/enttecdmxdevice.cpp \
    
    	src/fcserver.cpp \
    
    	src/tinythread.cpp \
    	src/httpdocs.cpp
    
    CLEAN_FILES += src/*.d src/*.o src/httpdocs.cpp
    
    CPPFLAGS += -Wno-strict-aliasing
    
    ###########################################################################
    # System Support
    
    UNAME := $(shell uname)
    MINGW := $(findstring MINGW32, $(UNAME))
    LIBS += -lstdc++ -lm
    
    VERSION := $(shell git describe --match "fcserver-*")
    CXXFLAGS += -DFCSERVER_VERSION=$(VERSION)
    
    ifeq ($(UNAME), Darwin)
    	# Mac OS X (32-bit build)
    	LDFLAGS += -m32
    
    	CPPFLAGS += -m32 -Wno-tautological-constant-out-of-range-compare -DHAVE_POLL_H
    
    ifneq ("$(MINGW)", "")
    	# Windows
    	TARGET := $(TARGET).exe
    
    	CPPFLAGS += -D_WIN32_WINNT=0x0501
    
    
    	# Static build makes it portable but big, UPX packer decreases size a lot.
    	LDFLAGS += -static
    	PACK_CMD := upx\upx391w.exe $(TARGET)
    
    endif
    
    ifneq ("$(DEBUG)", "")
    	# Debug build
    	TARGET := debug-$(TARGET)
    
    	CPPFLAGS += -g -DDEBUG -DENABLE_LOGGING
    
    	PACK_CMD :=
    
    else
    	# Optimized build	
    
    	STRIP_CMD := strip $(TARGET)
    
    	CPPFLAGS += -Os -DNDEBUG
    	LDFLAGS += -Os
    endif
    
    ###########################################################################
    # Built-in rapidjson
    
    INCLUDES += -I.
    
    
    ###########################################################################
    # Built-in libwebsockets
    
    C_FILES += \
    	libwebsockets/lib/handshake.c \
    	libwebsockets/lib/libwebsockets.c \
    	libwebsockets/lib/parsers.c \
    	libwebsockets/lib/server-handshake.c \
    	libwebsockets/lib/server.c \
    	libwebsockets/lib/output.c \
    	libwebsockets/lib/sha-1.c \
    	libwebsockets/lib/base64-decode.c
    
    # For lws_get_library_version(), which we don't use.
    CPPFLAGS += -DLWS_LIBRARY_VERSION= -DLWS_BUILD_HASH=
    
    # Disable a bunch of features
    
    CPPFLAGS += -DLWS_NO_EXTENSIONS -DLWS_NO_CLIENT -DLWS_NO_WSAPOLL
    
    
    INCLUDES += -Ilibwebsockets/lib
    CLEAN_FILES += libwebsockets/lib/*.d libwebsockets/lib/*.o
    
    
    ifneq ("$(MINGW)", "")
    	# Windows
    	INCLUDES += -Ilibwebsockets/win32port/win32helpers
    else
    	# This is redundant on Windows, but we want it on other platforms
    	CPPFLAGS += -DLWS_NO_DAEMONIZE
    endif
    
    
    ###########################################################################
    # Built-in libusbx
    
    C_FILES += \
    	libusbx/libusb/core.c \
    	libusbx/libusb/descriptor.c \
    	libusbx/libusb/hotplug.c \
    	libusbx/libusb/io.c \
    	libusbx/libusb/strerror.c \
    	libusbx/libusb/sync.c
    
    ifeq ($(UNAME), Darwin)
    	# Mac OS X
    
    	C_FILES += \
    		libusbx/libusb/os/darwin_usb.c \
    		libusbx/libusb/os/poll_posix.c \
    		libusbx/libusb/os/threads_posix.c
    
    	LIBS += -framework CoreFoundation -framework IOKit -lobjc
    
    	CPPFLAGS += -DOS_DARWIN -DTHREADS_POSIX -DPOLL_NFDS_TYPE=nfds_t \
    
    		-DLIBUSB_CALL= -DDEFAULT_VISIBILITY= -DHAVE_GETTIMEOFDAY
    endif
    
    
    Micah Elizabeth Scott's avatar
    Micah Elizabeth Scott committed
    ifeq ($(UNAME), Linux)
    	# Linux
    
    	C_FILES += \
    		libusbx/libusb/os/linux_usbfs.c \
    		libusbx/libusb/os/linux_netlink.c \
    		libusbx/libusb/os/poll_posix.c \
    		libusbx/libusb/os/threads_posix.c
    
    	LIBS += -lpthread -lrt
    	CPPFLAGS += -DOS_LINUX -DTHREADS_POSIX -DPOLL_NFDS_TYPE=nfds_t \
    		-DLIBUSB_CALL= -DDEFAULT_VISIBILITY= -DHAVE_GETTIMEOFDAY -DHAVE_POLL_H \
    		-DHAVE_ASM_TYPES_H -DHAVE_SYS_SOCKET_H -DHAVE_LINUX_NETLINK_H -DHAVE_LINUX_FILTER_H
    endif
    
    
    ifneq ("$(MINGW)", "")
    	# Windows
    
    
    	C_FILES += \
    		libusbx/libusb/os/windows_usb.c \
    		libusbx/libusb/os/poll_windows.c \
    		libusbx/libusb/os/threads_windows.c
    
    	LIBS += -lws2_32
    	CPPFLAGS += -DOS_WINDOWS -DPOLL_NFDS_TYPE=int -DDEFAULT_VISIBILITY= -DHAVE_GETTIMEOFDAY
    
    endif
    
    INCLUDES += -Ilibusbx/libusb
    
    CLEAN_FILES += \
    	libusbx/libusb/*.d libusbx/libusb/*.o \
    	libusbx/libusb/os/*.d libusbx/libusb/os/*.o
    
    
    ###########################################################################
    # Build Rules
    
    # Compiler options for C and C++
    CPPFLAGS += -MMD $(INCLUDES)
    
    # Compiler options for C++ only
    CXXFLAGS += -std=gnu++0x -felide-constructors -fno-exceptions -fno-rtti
    
    OBJS := $(CPP_FILES:.cpp=.o) $(C_FILES:.c=.o)
    
    # FIXME: A race condition between objects regeneration and their source mtime in make ? 
    $(TARGET): $(SUBMODULES_TARGETS) $(OBJS)
    
    	$(CXX) $(LDFLAGS) -o $@ $(OBJS) $(LIBS)
    
    	$(STRIP_CMD)
    	$(PACK_CMD)
    
    	rm -f src/version.o
    
    
    -include $(OBJS:.o=.d)
    
    
    src/httpdocs.cpp: http/* http/js/* http/css/*
    
    	(cd http; python manifest.py) > $@
    
    
    	rm -f $(CLEAN_FILES) $(TARGET)
    
    # Git submodules handling. TODO: Add submodules cleaning to clean target 
    
    SUBMODULES_TARGETS:=$(shell git config -f ../.gitmodules --get-regexp submodule'.*\.'path|cut -d ' ' -f 2|cut -d '/' -f 2)
    
    $(SUBMODULES_TARGETS):
    
    	cd .. && git submodule update --init -- server/$@ && cd server/$@ && git checkout -f HEAD && git clean -dfx
    
    submodules: $(SUBMODULES_TARGETS)
    
    .PHONY: submodules $(SUBMODULES_TARGETS) clean all