HOWTO Compile Firmata test program under Windows using GCC and WxWidgets

From Firmata

Revision as of 18:48, 25 January 2012 by Firmata (Talk | contribs)
Jump to: navigation, search

First, you'll need to install:

  • MinGV including Msys to compile using gcc on windows [1];
  • wxpack a prebuilt wxwidget library [2].

Second, modify the gcc version variable in the wxwidget build folder under yourwxwidgetpath\build\msw\config.gcc and set the GCC_VERSION variable to your current gcc version for exemple "4.61". You can find the version using the following command:

 gcc -v

Note: These instruction can be found in the "compiling wxwidgets" help file, see Cygwin/MinGW compilation section in the document

Then,unzip the firmata_test souce code in a directory under the wxwidget samples directory. And copy a makefile.gcc of another sample and modify it or take the following makefile.gcc.

Or get it here: http://www.pjrc.com/teensy/firmata_test/makefile.gcc

Or copy this one:

  1. =========================================================================
  2. This makefile was generated by
  3. Bakefile 0.2.8 (http://www.bakefile.org)
  4. Do not modify, all changes will be overwritten!
  5. =========================================================================

include ../../build/msw/config.gcc

  1. -------------------------------------------------------------------------
  2. Do not modify the rest of this file!
  3. -------------------------------------------------------------------------
      1. Variables: ###

CPPDEPS = -MT$@ -MF$@.d -MD -MP WX_RELEASE_NODOT = 28 OBJS = \ gcc_$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WXDLLFLAG)$(CFG) LIBDIRNAME = .\..\..\lib\gcc_$(LIBTYPE_SUFFIX)$(CFG) SETUPHDIR = \ $(LIBDIRNAME)\$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$(WXDEBUGFLAG) ACCESSTEST_CXXFLAGS = $(__DEBUGINFO) $(__OPTIMIZEFLAG_2) $(__THREADSFLAG) \ $(GCCFLAGS) -DHAVE_W32API_H -D__WXMSW__ $(__WXUNIV_DEFINE_p) \ $(__DEBUG_DEFINE_p) $(__NDEBUG_DEFINE_p) $(__EXCEPTIONS_DEFINE_p) \ $(__RTTI_DEFINE_p) $(__THREAD_DEFINE_p) $(__UNICODE_DEFINE_p) \ $(__MSLU_DEFINE_p) $(__GFXCTX_DEFINE_p) -I$(SETUPHDIR) -I.\..\..\include \ $(____CAIRO_INCLUDEDIR_FILENAMES_p) -W -Wall -I. $(__DLLFLAG_p) \ -I.\..\..\samples -DNOPCH $(__RTTIFLAG_5) $(__EXCEPTIONSFLAG_6) \ -Wno-ctor-dtor-privacy $(CPPFLAGS) $(CXXFLAGS) ACCESSTEST_OBJECTS = \ $(OBJS)\firmata_test.o \ $(OBJS)\serial.o

      1. Conditionally set variables: ###

ifeq ($(GCC_VERSION),2.95) GCCFLAGS = -fvtable-thunks endif ifeq ($(USE_GUI),0) PORTNAME = base endif ifeq ($(USE_GUI),1) PORTNAME = msw endif ifeq ($(BUILD),debug) ifeq ($(DEBUG_FLAG),default) WXDEBUGFLAG = d endif endif ifeq ($(DEBUG_FLAG),1) WXDEBUGFLAG = d endif ifeq ($(UNICODE),1) WXUNICODEFLAG = u endif ifeq ($(WXUNIV),1) WXUNIVNAME = univ endif ifeq ($(SHARED),1) WXDLLFLAG = dll endif ifeq ($(SHARED),0) LIBTYPE_SUFFIX = lib endif ifeq ($(SHARED),1) LIBTYPE_SUFFIX = dll endif ifeq ($(MONOLITHIC),0) EXTRALIBS_FOR_BASE = endif ifeq ($(MONOLITHIC),1) EXTRALIBS_FOR_BASE = endif ifeq ($(BUILD),debug) __OPTIMIZEFLAG_2 = -O0 endif ifeq ($(BUILD),release) __OPTIMIZEFLAG_2 = -O2 endif ifeq ($(USE_RTTI),0) __RTTIFLAG_5 = -fno-rtti endif ifeq ($(USE_RTTI),1) __RTTIFLAG_5 = endif ifeq ($(USE_EXCEPTIONS),0) __EXCEPTIONSFLAG_6 = -fno-exceptions endif ifeq ($(USE_EXCEPTIONS),1) __EXCEPTIONSFLAG_6 = endif ifeq ($(WXUNIV),1) __WXUNIV_DEFINE_p = -D__WXUNIVERSAL__ endif ifeq ($(WXUNIV),1) __WXUNIV_DEFINE_p_1 = --define __WXUNIVERSAL__ endif ifeq ($(BUILD),debug) ifeq ($(DEBUG_FLAG),default) __DEBUG_DEFINE_p = -D__WXDEBUG__ endif endif ifeq ($(DEBUG_FLAG),1) __DEBUG_DEFINE_p = -D__WXDEBUG__ endif ifeq ($(BUILD),debug) ifeq ($(DEBUG_FLAG),default) __DEBUG_DEFINE_p_1 = --define __WXDEBUG__ endif endif ifeq ($(DEBUG_FLAG),1) __DEBUG_DEFINE_p_1 = --define __WXDEBUG__ endif ifeq ($(BUILD),release) __NDEBUG_DEFINE_p = -DNDEBUG endif ifeq ($(BUILD),release) __NDEBUG_DEFINE_p_1 = --define NDEBUG endif ifeq ($(USE_EXCEPTIONS),0) __EXCEPTIONS_DEFINE_p = -DwxNO_EXCEPTIONS endif ifeq ($(USE_EXCEPTIONS),0) __EXCEPTIONS_DEFINE_p_1 = --define wxNO_EXCEPTIONS endif ifeq ($(USE_RTTI),0) __RTTI_DEFINE_p = -DwxNO_RTTI endif ifeq ($(USE_RTTI),0) __RTTI_DEFINE_p_1 = --define wxNO_RTTI endif ifeq ($(USE_THREADS),0) __THREAD_DEFINE_p = -DwxNO_THREADS endif ifeq ($(USE_THREADS),0) __THREAD_DEFINE_p_1 = --define wxNO_THREADS endif ifeq ($(UNICODE),1) __UNICODE_DEFINE_p = -D_UNICODE endif ifeq ($(UNICODE),1) __UNICODE_DEFINE_p_1 = --define _UNICODE endif ifeq ($(MSLU),1) __MSLU_DEFINE_p = -DwxUSE_UNICODE_MSLU=1 endif ifeq ($(MSLU),1) __MSLU_DEFINE_p_1 = --define wxUSE_UNICODE_MSLU=1 endif ifeq ($(USE_GDIPLUS),1) __GFXCTX_DEFINE_p = -DwxUSE_GRAPHICS_CONTEXT=1 endif ifeq ($(USE_GDIPLUS),1) __GFXCTX_DEFINE_p_1 = --define wxUSE_GRAPHICS_CONTEXT=1 endif ifeq ($(USE_CAIRO),1) ____CAIRO_INCLUDEDIR_FILENAMES_p = -I$(CAIRO_ROOT)\include\cairo endif ifeq ($(USE_CAIRO),1) __CAIRO_INCLUDEDIR_p = --include-dir $(CAIRO_ROOT)/include/cairo endif ifeq ($(SHARED),1) __DLLFLAG_p = -DWXUSINGDLL endif ifeq ($(SHARED),1) __DLLFLAG_p_1 = --define WXUSINGDLL endif ifeq ($(MONOLITHIC),0) __WXLIB_CORE_p = \ -lwx$(PORTNAME)$(WXUNIVNAME)$(WX_RELEASE_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_core endif ifeq ($(MONOLITHIC),0) __WXLIB_BASE_p = \ -lwxbase$(WX_RELEASE_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR) endif ifeq ($(MONOLITHIC),1) __WXLIB_MONO_p = \ -lwx$(PORTNAME)$(WXUNIVNAME)$(WX_RELEASE_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR) endif ifeq ($(USE_GUI),1) __LIB_TIFF_p = -lwxtiff$(WXDEBUGFLAG) endif ifeq ($(USE_GUI),1) __LIB_JPEG_p = -lwxjpeg$(WXDEBUGFLAG) endif ifeq ($(USE_GUI),1) __LIB_PNG_p = -lwxpng$(WXDEBUGFLAG) endif ifeq ($(MSLU),1) __UNICOWS_LIB_p = -lunicows endif ifeq ($(USE_GDIPLUS),1) __GDIPLUS_LIB_p = -lgdiplus endif ifeq ($(USE_CAIRO),1) __CAIRO_LIB_p = -lcairo endif ifeq ($(USE_CAIRO),1) ____CAIRO_LIBDIR_FILENAMES_p = -L$(CAIRO_ROOT)\lib endif ifeq ($(BUILD),debug) ifeq ($(DEBUG_INFO),default) __DEBUGINFO = -g endif endif ifeq ($(BUILD),release) ifeq ($(DEBUG_INFO),default) __DEBUGINFO = endif endif ifeq ($(DEBUG_INFO),0) __DEBUGINFO = endif ifeq ($(DEBUG_INFO),1) __DEBUGINFO = -g endif ifeq ($(USE_THREADS),0) __THREADSFLAG = endif ifeq ($(USE_THREADS),1) __THREADSFLAG = -mthreads endif


all: $(OBJS) $(OBJS): -if not exist $(OBJS) mkdir $(OBJS)

      1. Targets: ###

all: $(OBJS)\firmata_test.exe

clean: -if exist $(OBJS)\*.o del $(OBJS)\*.o -if exist $(OBJS)\*.d del $(OBJS)\*.d -if exist $(OBJS)\firmata_test.exe del $(OBJS)\firmata_test.exe

$(OBJS)\firmata_test.exe: $(ACCESSTEST_OBJECTS) $(CXX) -o $@ $(ACCESSTEST_OBJECTS) $(__DEBUGINFO) $(__THREADSFLAG) -L$(LIBDIRNAME) -Wl,--subsystem,windows -mwindows $(____CAIRO_LIBDIR_FILENAMES_p) $(LDFLAGS) $(__WXLIB_CORE_p) $(__WXLIB_BASE_p) $(__WXLIB_MONO_p) $(__LIB_TIFF_p) $(__LIB_JPEG_p) $(__LIB_PNG_p) -lwxzlib$(WXDEBUGFLAG) -lwxregex$(WXUNICODEFLAG)$(WXDEBUGFLAG) -lwxexpat$(WXDEBUGFLAG) $(EXTRALIBS_FOR_BASE) $(__UNICOWS_LIB_p) $(__GDIPLUS_LIB_p) $(__CAIRO_LIB_p) -lkernel32 -luser32 -lgdi32 -lcomdlg32 -lwinspool -lwinmm -lshell32 -lcomctl32 -lole32 -loleaut32 -luuid -lrpcrt4 -ladvapi32 -lwsock32 -lodbc32

$(OBJS)\firmata_test.o: ./firmata_test.cpp $(CXX) -c -o $@ $(ACCESSTEST_CXXFLAGS) $(CPPDEPS) $<

$(OBJS)\serial.o: ./serial.cpp $(CXX) -c -o $@ $(ACCESSTEST_CXXFLAGS) $(CPPDEPS) -DWINDOWS $<


.PHONY: all clean


SHELL := $(COMSPEC)

  1. Dependencies tracking:

-include $(OBJS)/*.d

Now you can buil the firmata_test executable, to do it start the MinGW shell, go to the firmata_test directory and issue the following command to build in debug mode:

 mingw32-make -f makefile.gcc BUILD=debug
Personal tools