diff --git a/api/Makefile.mingw b/api/Makefile.mingw index 954f7b482a..b09ffb8072 100644 --- a/api/Makefile.mingw +++ b/api/Makefile.mingw @@ -1,4 +1,4 @@ -BOINCDIR = ./boinc +BOINCDIR = .. DEBUG = -D__DEBUG__ -g3 OBJ = boinc_api.o util.o win_util.o app_ipc.o diagnostics.o diagnostics_win.o filesys.o hostinfo.o md5.o md5_file.o mem_usage.o mfile.o miofile.o parse.o prefs.o proxy_info.o str_util.o shmem.o stackwalker_win.o base64.o LINKOBJ = $(OBJ) diff --git a/api/boinc_api.h b/api/boinc_api.h index 0b25383c28..07a290bbd0 100644 --- a/api/boinc_api.h +++ b/api/boinc_api.h @@ -22,6 +22,10 @@ #include #endif +#ifdef _WIN32 +#include "boinc_win.h" +#endif + // ANSI C API BEGINS HERE // Do not put implementation stuff here diff --git a/checkin_notes b/checkin_notes index e02d845fcf..82268114a7 100644 --- a/checkin_notes +++ b/checkin_notes @@ -9226,3 +9226,19 @@ David 15 Nov 2009 sched/ credit_test.cpp + + +Bernd 16 Nov 2009 + - api: updates for building Win32 libs & API with MinGW gcc + added Makefile.mingw used for Einstein@home in lib/ as an + _alternative_ to api/Makefile.mingw + + lib/ + diagnostics.h + boinc_win.h + diagnostics.cpp + Makefile.mingw + diagnostics_win.cpp + api/ + Makefile.mingw + boinc_api.h diff --git a/lib/Makefile.mingw b/lib/Makefile.mingw new file mode 100644 index 0000000000..3feaa31bb3 --- /dev/null +++ b/lib/Makefile.mingw @@ -0,0 +1,134 @@ +# Makefile for building BOINC with MinGW (gcc and gnumake) + +# if you want to use install/uninstall targets, set this to the prefix +BOINC_PREFIX ?= /usr/local/boinc + +# set this for the BOINC sourc directory. This default should work for calling from within lib/ or api/ +BOINC_SRC ?= .. + + +# headers to install +HEADERS = version.h api/boinc_api.h api/graphics2.h lib/app_ipc.h lib/boinc_win.h \ + lib/common_defs.h lib/diagnostics.h lib/diagnostics_win.h lib/filesys.h lib/hostinfo.h \ + lib/proxy_info.h lib/prefs.h lib/miofile.h lib/mfile.h lib/parse.h lib/util.h \ + win_build/config.h + +ZIP_HEADERS = zip/boinc_zip.h + +# objects to compile + +API_OBJ = boinc_api.o graphics2_util.o + +GPH_OBJ = graphics2.o graphics2_util.o + +LIB_OBJ = util.o win_util.o app_ipc.o diagnostics.o diagnostics_win.o filesys.o \ + hostinfo.o md5.o md5_file.o mem_usage.o mfile.o miofile.o parse.o prefs.o \ + proxy_info.o str_util.o shmem.o base64.o stackwalker_win.o + +ZIP_OBJ = boinc_zip.o z_win32.o win32zip.o zipup.o zipfile.o zip.o z_globals.o z_fileio.o \ + z_util.o trees.o deflate.o zipinfo.o win32.o unzip.o unshrink.o unreduce.o ttyio.o \ + process.o match.o list.o inflate.o globals.o fileio.o extract.o explode.o envargs.o \ + crctab.o crc32.o apihelp.o api.o + + +# libraries to build +API_BIN = libboinc_api.a +LIB_BIN = libboinc.a +GPH_BIN = libboinc_graphics2.a +ZIP_BIN = libboinc_zip.a + +# all objects (for clean target) +OBJ = $(API_OBJ) $(LIB_OBJ) $(GPH_OBJ) $(ZIP_OBJ) + +# all libraries (zip not listed anymore) +BIN = $(API_BIN) $(LIB_BIN) $(GPH_BIN) + +# -gstabs is necessary for MinGWs backtrace to work +DEBUG = -D__DEBUG__ -gstabs -g3 + +# where to find headers +INCS = -I"$(BOINC_SRC)" -I"$(BOINC_SRC)/db" -I"$(BOINC_SRC)/lib" -I"$(BOINC_SRC)/api" -I"$(BOINC_SRC)/zip" -I"$(BOINC_SRC)/win_build" + + +# various cpp & gcc flags (for both C and C++ mode) +# set NOCYGWIN=-mno-cygwin to build non-Cywin Windows libs under Cygwin +# -D_WIN32_WINDOWS=0x0410 sets to use Win98 API +CCXXFLAGS = $(INCS) $(DEBUG) --include $(BOINC_SRC)/version.h -DEINSTEINATHOME_CROSS_BUILD -DMINGW_WIN32 \ + -DWIN32 -D_WIN32 -D_WIN32_WINDOWS=0x0410 -D_MT -DNDEBUG -D_WINDOWS -DBOINC \ + -DNODB -D_CONSOLE -mtune=pentium-m -fexceptions -march=i386 -O2 $(NOCYGWIN) + +# flags for compiling boinc_zip +ZIP_FLAGS = -DWIN32 -DNDEBUG -D_LIB -D_MBCS -DNO_MKTEMP $(INCS) -O2 -DDLL $(NOCYGWIN) + +LDFLAGS = -lwinmm -march=i386 + +CFLAGS = $(CCXXFLAGS) +CXXFLAGS = $(CCXXFLAGS) + +# default target +all: $(BIN) + +# zip target +boinc_zip: $(ZIP_BIN) + +# rules for the indivisual libraries +$(API_BIN): $(API_OBJ) + $(AR) rc $@ $^ +$(LIB_BIN): $(LIB_OBJ) + $(AR) rc $@ $^ +$(GPH_BIN): $(GPH_OBJ) + $(AR) rc $@ $^ +$(ZIP_BIN): $(ZIP_OBJ) + $(AR) rc $@ $^ + +# standard BOINC code - .C and .cpp versions +%.o: $(BOINC_SRC)/api/%.C + $(CXX) -c $< -o $@ $(CPPFLAGS) $(CXXFLAGS) +%.o: $(BOINC_SRC)/lib/%.C + $(CXX) -c $< -o $@ $(CPPFLAGS) $(CXXFLAGS) +%.o: $(BOINC_SRC)/api/%.cpp + $(CXX) -c $< -o $@ $(CPPFLAGS) $(CXXFLAGS) +%.o: $(BOINC_SRC)/lib/%.cpp + $(CXX) -c $< -o $@ $(CPPFLAGS) $(CXXFLAGS) + +# C-mode file +md5.o: $(BOINC_SRC)/lib/md5.c + $(CXX) -c $(BOINC_SRC)/lib/md5.c -o md5.o $(CPPFLAGS) $(CXXFLAGS) + +# for boinc_zip. Don't change the order! +%.o: $(BOINC_SRC)/zip/%.cpp + $(CXX) -c $< -o $@ $(ZIP_FLAGS) +%.o: $(BOINC_SRC)/zip/unzip/win32/%.c + $(CC) -c $< -o $@ $(ZIP_FLAGS) +%.o: $(BOINC_SRC)/zip/unzip/%.c + $(CC) -c $< -o $@ $(ZIP_FLAGS) +%.o: $(BOINC_SRC)/zip/zip/win32/%.c + $(CC) -c $< -o $@ $(ZIP_FLAGS) +%.o: $(BOINC_SRC)/zip/zip/%.c + $(CC) -c $< -o $@ $(ZIP_FLAGS) +z_util.o: $(BOINC_SRC)/zip/zip/util.c + $(CC) -c $< -o $@ $(ZIP_FLAGS) + +# set to the target ranlib when cross-compiling +RANLIB ?= ranlib + +# additional targets + +install: $(BIN) $(HEADERS) + mkdir -p $(BOINC_PREFIX)/include/BOINC $(BOINC_PREFIX)/lib + cp $(HEADERS) $(BOINC_PREFIX)/include/BOINC + $(RANLIB) $(BIN) + cp $(BIN) $(BOINC_PREFIX)/lib + +install-zip: $(ZIP_BIN) $(ZIP_HEADERS) + mkdir -p $(BOINC_PREFIX)/include/BOINC $(BOINC_PREFIX)/lib + cp $(ZIP_HEADERS) $(BOINC_PREFIX)/include/BOINC + $(RANLIB) $(ZIP_BIN) + cp $(ZIP_BIN) $(BOINC_PREFIX)/lib + +uninstall: + rm -f $(BOINC_PREFIX)/include/BOINC/*.h + ( cd $(BOINC_PREFIX)/lib && rm -f $(BIN) || exit 0 ) + +clean: + ${RM} $(OBJ) $(BIN) $(ZIP_BIN) diff --git a/lib/boinc_win.h b/lib/boinc_win.h index 14eccc7f46..6d020669ed 100644 --- a/lib/boinc_win.h +++ b/lib/boinc_win.h @@ -97,6 +97,7 @@ typedef size_t socklen_t; #include #include #if defined(MINGW_WIN32) +#include #include #else #include diff --git a/lib/diagnostics.cpp b/lib/diagnostics.cpp index 72f75909c3..f35001ba65 100644 --- a/lib/diagnostics.cpp +++ b/lib/diagnostics.cpp @@ -22,7 +22,7 @@ #include "boinc_win.h" #endif -#ifdef _MSC_VER +#if defined(_WIN32) && !defined(__CYGWIN32__) #define snprintf _snprintf #define strdate _strdate #define strtime _strtime @@ -152,7 +152,7 @@ int boinc_finish_diag() { int boinc_install_signal_handlers() { #ifdef _WIN32 SetUnhandledExceptionFilter(boinc_catch_signal); -#if _MSC_VER >= 1400 +#if defined(_MSC_VER) && (_MSC_VER >= 1400) _set_invalid_parameter_handler(boinc_catch_signal_invalid_parameter); #endif #else //_WIN32 diff --git a/lib/diagnostics.h b/lib/diagnostics.h index f71801b2bb..ab36e26257 100644 --- a/lib/diagnostics.h +++ b/lib/diagnostics.h @@ -114,12 +114,7 @@ extern int diagnostics_finish_unhandled_exception_monitor(); #ifdef _WIN32 extern UINT WINAPI diagnostics_unhandled_exception_monitor(LPVOID lpParameter); extern LONG CALLBACK boinc_catch_signal(EXCEPTION_POINTERS *ExceptionInfo); -#ifndef MINGW_WIN32 extern void boinc_catch_signal_invalid_parameter(const wchar_t* expression, const wchar_t* function, const wchar_t* file, unsigned int line, uintptr_t pReserved); -#else -extern void boinc_catch_signal_invalid_parameter(const wchar_t* expression, const wchar_t* function, const wchar_t* file, unsigned int line); -#endif - #else extern void boinc_catch_signal(int signal); extern void boinc_set_signal_handler(int sig, void(*handler)(int)); diff --git a/lib/diagnostics_win.cpp b/lib/diagnostics_win.cpp index a5ab49f773..ca39e9f43e 100644 --- a/lib/diagnostics_win.cpp +++ b/lib/diagnostics_win.cpp @@ -22,7 +22,7 @@ #include "boinc_win.h" #endif -#ifdef _MSC_VER +#if defined(_WIN32) && !defined(__CYGWIN__) #define snprintf _snprintf #define strdate _strdate #define strtime _strtime @@ -2070,7 +2070,7 @@ LONG CALLBACK boinc_catch_signal(PEXCEPTION_POINTERS pExPtrs) { // then throw a breakpoint exception to dump all the rest of the useful // information. void boinc_catch_signal_invalid_parameter( - const wchar_t* expression, const wchar_t* function, const wchar_t* file, unsigned int line, uintptr_t /* pReserved */ + const wchar_t* expression, const wchar_t* function, const wchar_t* file, unsigned int line, uintptr_t /* pReserved */ ) { fprintf( stderr,