diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/renderer/qgl.h | 11 | ||||
-rw-r--r-- | src/renderer/tr_init.c | 8 | ||||
-rw-r--r-- | src/renderer/tr_local.h | 2 | ||||
-rw-r--r-- | src/renderer/tr_types.h | 2 | ||||
-rw-r--r-- | src/sdl/sdl_glimp.c | 20 | ||||
-rw-r--r-- | src/sys/con_win32.c | 216 | ||||
-rw-r--r-- | src/tools/asm/Makefile | 43 | ||||
-rw-r--r-- | src/tools/lcc/Makefile | 163 |
8 files changed, 234 insertions, 231 deletions
diff --git a/src/renderer/qgl.h b/src/renderer/qgl.h index 8c92eb36..f83eaf31 100644 --- a/src/renderer/qgl.h +++ b/src/renderer/qgl.h @@ -29,12 +29,13 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include "SDL_opengl.h" -extern PFNGLMULTITEXCOORD2FARBPROC qglMultiTexCoord2fARB; -extern PFNGLACTIVETEXTUREARBPROC qglActiveTextureARB; -extern PFNGLCLIENTACTIVETEXTUREARBPROC qglClientActiveTextureARB; +extern void (APIENTRYP qglActiveTextureARB) (GLenum texture); +extern void (APIENTRYP qglClientActiveTextureARB) (GLenum texture); +extern void (APIENTRYP qglMultiTexCoord2fARB) (GLenum target, GLfloat s, GLfloat t); + +extern void (APIENTRYP qglLockArraysEXT) (GLint first, GLsizei count); +extern void (APIENTRYP qglUnlockArraysEXT) (void); -extern PFNGLLOCKARRAYSEXTPROC qglLockArraysEXT; -extern PFNGLUNLOCKARRAYSEXTPROC qglUnlockArraysEXT; //=========================================================================== diff --git a/src/renderer/tr_init.c b/src/renderer/tr_init.c index d8e35ff7..1f3d19dc 100644 --- a/src/renderer/tr_init.c +++ b/src/renderer/tr_init.c @@ -81,7 +81,6 @@ cvar_t *r_nocurves; cvar_t *r_allowExtensions; cvar_t *r_ext_compressed_textures; -cvar_t *r_ext_gamma_control; cvar_t *r_ext_multitexture; cvar_t *r_ext_compiled_vertex_array; cvar_t *r_ext_texture_env_add; @@ -889,7 +888,6 @@ GfxInfo_f */ void GfxInfo_f( void ) { - cvar_t *sys_cpustring = ri.Cvar_Get( "sys_cpustring", "", 0 ); const char *enablestrings[] = { "disabled", @@ -906,7 +904,7 @@ void GfxInfo_f( void ) ri.Printf( PRINT_ALL, "GL_VERSION: %s\n", glConfig.version_string ); ri.Printf( PRINT_ALL, "GL_EXTENSIONS: %s\n", glConfig.extensions_string ); ri.Printf( PRINT_ALL, "GL_MAX_TEXTURE_SIZE: %d\n", glConfig.maxTextureSize ); - ri.Printf( PRINT_ALL, "GL_MAX_ACTIVE_TEXTURES_ARB: %d\n", glConfig.maxActiveTextures ); + ri.Printf( PRINT_ALL, "GL_MAX_TEXTURE_UNITS_ARB: %d\n", glConfig.numTextureUnits ); ri.Printf( PRINT_ALL, "\nPIXELFORMAT: color(%d-bits) Z(%d-bit) stencil(%d-bits)\n", glConfig.colorBits, glConfig.depthBits, glConfig.stencilBits ); ri.Printf( PRINT_ALL, "MODE: %d, %d x %d %s hz:", r_mode->integer, glConfig.vidWidth, glConfig.vidHeight, fsstrings[r_fullscreen->integer == 1] ); if ( glConfig.displayFrequency ) @@ -925,7 +923,6 @@ void GfxInfo_f( void ) { ri.Printf( PRINT_ALL, "GAMMA: software w/ %d overbright bits\n", tr.overbrightBits ); } - ri.Printf( PRINT_ALL, "CPU: %s\n", sys_cpustring->string ); // rendering primitives { @@ -991,10 +988,9 @@ void R_Register( void ) // r_allowExtensions = ri.Cvar_Get( "r_allowExtensions", "1", CVAR_ARCHIVE | CVAR_LATCH ); r_ext_compressed_textures = ri.Cvar_Get( "r_ext_compressed_textures", "0", CVAR_ARCHIVE | CVAR_LATCH ); - r_ext_gamma_control = ri.Cvar_Get( "r_ext_gamma_control", "1", CVAR_ARCHIVE | CVAR_LATCH ); r_ext_multitexture = ri.Cvar_Get( "r_ext_multitexture", "1", CVAR_ARCHIVE | CVAR_LATCH ); r_ext_compiled_vertex_array = ri.Cvar_Get( "r_ext_compiled_vertex_array", "1", CVAR_ARCHIVE | CVAR_LATCH); - r_ext_texture_env_add = ri.Cvar_Get( "r_ext_texture_env_add", "0", CVAR_ARCHIVE | CVAR_LATCH); + r_ext_texture_env_add = ri.Cvar_Get( "r_ext_texture_env_add", "1", CVAR_ARCHIVE | CVAR_LATCH); r_picmip = ri.Cvar_Get ("r_picmip", GENERIC_HW_R_PICMIP_DEFAULT, CVAR_ARCHIVE | CVAR_LATCH ); diff --git a/src/renderer/tr_local.h b/src/renderer/tr_local.h index 7c694759..a507e8a7 100644 --- a/src/renderer/tr_local.h +++ b/src/renderer/tr_local.h @@ -1035,8 +1035,6 @@ extern cvar_t *r_ignorehwgamma; // overrides hardware gamma capabilities extern cvar_t *r_allowExtensions; // global enable/disable of OpenGL extensions extern cvar_t *r_ext_compressed_textures; // these control use of specific extensions -extern cvar_t *r_ext_gamma_control; -extern cvar_t *r_ext_texenv_op; extern cvar_t *r_ext_multitexture; extern cvar_t *r_ext_compiled_vertex_array; extern cvar_t *r_ext_texture_env_add; diff --git a/src/renderer/tr_types.h b/src/renderer/tr_types.h index 3922f8ff..2d7c66d3 100644 --- a/src/renderer/tr_types.h +++ b/src/renderer/tr_types.h @@ -176,7 +176,7 @@ typedef struct { char extensions_string[BIG_INFO_STRING]; int maxTextureSize; // queried from GL - int maxActiveTextures; // multitexture ability + int numTextureUnits; // multitexture ability int colorBits, depthBits, stencilBits; diff --git a/src/sdl/sdl_glimp.c b/src/sdl/sdl_glimp.c index 07b80a81..a980b0ed 100644 --- a/src/sdl/sdl_glimp.c +++ b/src/sdl/sdl_glimp.c @@ -70,12 +70,12 @@ static SDL_Surface *screen = NULL; cvar_t *r_allowSoftwareGL; // Don't abort out if a hardware visual can't be obtained -PFNGLMULTITEXCOORD2FARBPROC qglMultiTexCoord2fARB; -PFNGLACTIVETEXTUREARBPROC qglActiveTextureARB; -PFNGLCLIENTACTIVETEXTUREARBPROC qglClientActiveTextureARB; +void (APIENTRYP qglActiveTextureARB) (GLenum texture); +void (APIENTRYP qglClientActiveTextureARB) (GLenum texture); +void (APIENTRYP qglMultiTexCoord2fARB) (GLenum target, GLfloat s, GLfloat t); -PFNGLLOCKARRAYSEXTPROC qglLockArraysEXT; -PFNGLUNLOCKARRAYSEXTPROC qglUnlockArraysEXT; +void (APIENTRYP qglLockArraysEXT) (GLint first, GLsizei count); +void (APIENTRYP qglUnlockArraysEXT) (void); /* =============== @@ -89,8 +89,8 @@ void GLimp_Shutdown( void ) SDL_QuitSubSystem( SDL_INIT_VIDEO ); screen = NULL; - memset( &glConfig, 0, sizeof( glConfig ) ); - memset( &glState, 0, sizeof( glState ) ); + Com_Memset( &glConfig, 0, sizeof( glConfig ) ); + Com_Memset( &glState, 0, sizeof( glState ) ); } /* @@ -396,8 +396,8 @@ static void GLimp_InitExtensions( void ) { GLint glint = 0; qglGetIntegerv( GL_MAX_TEXTURE_UNITS_ARB, &glint ); - glConfig.maxActiveTextures = (int) glint; - if ( glConfig.maxActiveTextures > 1 ) + glConfig.numTextureUnits = (int) glint; + if ( glConfig.numTextureUnits > 1 ) { ri.Printf( PRINT_ALL, "...using GL_ARB_multitexture\n" ); } @@ -490,7 +490,7 @@ void GLimp_Init( void ) { if( r_mode->integer != R_MODE_FALLBACK ) { - ri.Printf( PRINT_ALL, "Setting r_mode %d failed, falling back on r_mode %d", + ri.Printf( PRINT_ALL, "Setting r_mode %d failed, falling back on r_mode %d\n", r_mode->integer, R_MODE_FALLBACK ); if( !GLimp_StartDriverAndSetMode( R_MODE_FALLBACK, r_fullscreen->integer ) ) success = qfalse; diff --git a/src/sys/con_win32.c b/src/sys/con_win32.c index ea3cfb7c..55020e26 100644 --- a/src/sys/con_win32.c +++ b/src/sys/con_win32.c @@ -22,6 +22,21 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include "../qcommon/q_shared.h" #include "../qcommon/qcommon.h" +#include "windows.h" + + +#define QCONSOLE_THEME FOREGROUND_RED | \ + BACKGROUND_RED | \ + BACKGROUND_GREEN | \ + BACKGROUND_BLUE + +#define QCONSOLE_INPUT_RECORDS 1024 + +// used to track key input +static int qconsole_chars = 0; + +// used to restore original color theme +static int qconsole_orig_attrib; /* ================== @@ -48,6 +63,15 @@ CON_Shutdown */ void CON_Shutdown( void ) { + HANDLE hout; + COORD screen = { 0, 0 }; + DWORD written; + + hout = GetStdHandle( STD_OUTPUT_HANDLE ); + + SetConsoleTextAttribute( hout, qconsole_orig_attrib ); + FillConsoleOutputAttribute( hout, qconsole_orig_attrib, 63999, + screen, &written ); } /* @@ -57,6 +81,34 @@ CON_Init */ void CON_Init( void ) { + HANDLE hout; + COORD screen = { 0, 0 }; + DWORD written, read; + CONSOLE_SCREEN_BUFFER_INFO binfo; + SMALL_RECT rect; + WORD oldattrib; + + hout = GetStdHandle( STD_OUTPUT_HANDLE ); + + // remember original color theme + ReadConsoleOutputAttribute( hout, &oldattrib, 1, screen, &read ); + qconsole_orig_attrib = oldattrib; + + SetConsoleTitle("ioquake3 Dedicated Server Console"); + + SetConsoleTextAttribute( hout, QCONSOLE_THEME ); + FillConsoleOutputAttribute( hout, QCONSOLE_THEME, 63999, screen, &written ); + + // adjust console scroll to match up with cursor position + GetConsoleScreenBufferInfo( hout, &binfo ); + rect.Top = binfo.srWindow.Top; + rect.Left = binfo.srWindow.Left; + rect.Bottom = binfo.srWindow.Bottom; + rect.Right = binfo.srWindow.Right; + rect.Top += ( binfo.dwCursorPosition.Y - binfo.srWindow.Bottom ); + rect.Bottom = binfo.dwCursorPosition.Y; + SetConsoleWindowInfo( hout, TRUE, &rect ); + } /* @@ -66,5 +118,167 @@ CON_ConsoleInput */ char *CON_ConsoleInput( void ) { - return NULL; + HANDLE hin, hout; + INPUT_RECORD buff[ QCONSOLE_INPUT_RECORDS ]; + DWORD count = 0; + int i; + static char input[ 1024 ] = { "" }; + int inputlen; + int newlinepos = -1; + CHAR_INFO line[ QCONSOLE_INPUT_RECORDS ]; + int linelen = 0; + + inputlen = 0; + input[ 0 ] = '\0'; + + hin = GetStdHandle( STD_INPUT_HANDLE ); + if( hin == INVALID_HANDLE_VALUE ) + return NULL; + hout = GetStdHandle( STD_OUTPUT_HANDLE ); + if( hout == INVALID_HANDLE_VALUE ) + return NULL; + + if( !PeekConsoleInput( hin, buff, QCONSOLE_INPUT_RECORDS, &count ) ) + return NULL; + + // if we have overflowed, start dropping oldest input events + if( count == QCONSOLE_INPUT_RECORDS ) + { + ReadConsoleInput( hin, buff, 1, &count ); + return NULL; + } + + for( i = 0; i < count; i++ ) + { + if( buff[ i ].EventType == KEY_EVENT && buff[ i ].Event.KeyEvent.bKeyDown ) + { + if( buff[ i ].Event.KeyEvent.wVirtualKeyCode == VK_RETURN ) + { + newlinepos = i; + break; + } + + if( linelen < QCONSOLE_INPUT_RECORDS && + buff[ i ].Event.KeyEvent.uChar.AsciiChar ) + { + if( buff[ i ].Event.KeyEvent.wVirtualKeyCode == VK_BACK ) + { + if( linelen > 0 ) + linelen--; + + } + else + { + line[ linelen ].Attributes = QCONSOLE_THEME; + line[ linelen++ ].Char.AsciiChar = + buff[ i ].Event.KeyEvent.uChar.AsciiChar; + } + } + } + } + + // provide visual feedback for incomplete commands + if( linelen != qconsole_chars ) + { + CONSOLE_SCREEN_BUFFER_INFO binfo; + COORD writeSize = { QCONSOLE_INPUT_RECORDS, 1 }; + COORD writePos = { 0, 0 }; + SMALL_RECT writeArea = { 0, 0, 0, 0 }; + int i; + + // keep track of this so we don't need to re-write to console every frame + qconsole_chars = linelen; + + GetConsoleScreenBufferInfo( hout, &binfo ); + + // adjust scrolling to cursor when typing + if( binfo.dwCursorPosition.Y > binfo.srWindow.Bottom ) + { + SMALL_RECT rect; + + rect.Top = binfo.srWindow.Top; + rect.Left = binfo.srWindow.Left; + rect.Bottom = binfo.srWindow.Bottom; + rect.Right = binfo.srWindow.Right; + + rect.Top += ( binfo.dwCursorPosition.Y - binfo.srWindow.Bottom ); + rect.Bottom = binfo.dwCursorPosition.Y; + + SetConsoleWindowInfo( hout, TRUE, &rect ); + GetConsoleScreenBufferInfo( hout, &binfo ); + } + + writeArea.Left = 0; + writeArea.Top = binfo.srWindow.Bottom; + writeArea.Bottom = binfo.srWindow.Bottom; + writeArea.Right = QCONSOLE_INPUT_RECORDS; + + // pad line with ' ' to handle VK_BACK + for( i = linelen; i < QCONSOLE_INPUT_RECORDS; i++ ) + { + line[ i ].Char.AsciiChar = ' '; + line[ i ].Attributes = QCONSOLE_THEME; + } + + if( linelen > binfo.srWindow.Right ) + { + WriteConsoleOutput( hout, line + (linelen - binfo.srWindow.Right ), + writeSize, writePos, &writeArea ); + } + else + { + WriteConsoleOutput( hout, line, writeSize, writePos, &writeArea ); + } + + if( binfo.dwCursorPosition.X != linelen ) + { + COORD cursorPos = { 0, 0 }; + + cursorPos.X = linelen; + cursorPos.Y = binfo.srWindow.Bottom; + SetConsoleCursorPosition( hout, cursorPos ); + } + } + + // don't touch the input buffer if this is an incomplete command + if( newlinepos < 0) + { + return NULL; + } + else + { + // add a newline + COORD cursorPos = { 0, 0 }; + CONSOLE_SCREEN_BUFFER_INFO binfo; + + GetConsoleScreenBufferInfo( hout, &binfo ); + cursorPos.Y = binfo.srWindow.Bottom + 1; + SetConsoleCursorPosition( hout, cursorPos ); + } + + + if( !ReadConsoleInput( hin, buff, newlinepos+1, &count ) ) + return NULL; + + for( i = 0; i < count; i++ ) + { + if( buff[ i ].EventType == KEY_EVENT && buff[ i ].Event.KeyEvent.bKeyDown ) + { + if( buff[ i ].Event.KeyEvent.wVirtualKeyCode == VK_BACK ) + { + if( inputlen > 0 ) + input[ --inputlen ] = '\0'; + continue; + } + if( inputlen < ( sizeof( input ) - 1 ) && + buff[ i ].Event.KeyEvent.uChar.AsciiChar ) + { + input[ inputlen++ ] = buff[ i ].Event.KeyEvent.uChar.AsciiChar; + input[ inputlen ] = '\0'; + } + } + } + if( !inputlen ) + return NULL; + return input; } diff --git a/src/tools/asm/Makefile b/src/tools/asm/Makefile deleted file mode 100644 index 52f1060d..00000000 --- a/src/tools/asm/Makefile +++ /dev/null @@ -1,43 +0,0 @@ -# yeah, couldn't do more simple really - -ifeq ($(PLATFORM),mingw32) - BINEXT=.exe -else - BINEXT= -endif - -ifeq ($(PLATFORM),sunos) - INSTALL=ginstall -else - INSTALL=install -endif - -CC=gcc -Q3ASM_CFLAGS=-O2 -Wall -Werror -fno-strict-aliasing - -ifeq ($(PLATFORM),darwin) - LCC_CFLAGS += -DMACOS_X=1 -endif - -ifndef USE_CCACHE - USE_CCACHE=0 -endif - -ifeq ($(USE_CCACHE),1) - CC := ccache $(CC) - CXX := ccache $(CXX) -endif - -default: q3asm - -q3asm: q3asm.c cmdlib.c - $(CC) $(Q3ASM_CFLAGS) -o $@ $^ - -clean: - rm -f q3asm *~ *.o - -install: default - $(INSTALL) -s -m 0755 q3asm$(BINEXT) ../ - -uninstall: - rm -f ../q3asm$(BINEXT) diff --git a/src/tools/lcc/Makefile b/src/tools/lcc/Makefile deleted file mode 100644 index 8dd5fb2b..00000000 --- a/src/tools/lcc/Makefile +++ /dev/null @@ -1,163 +0,0 @@ -TEMPDIR=/tmp -A=.a -O=.o - -ifeq ($(PLATFORM),mingw32) - E=.exe -else - E= -endif - -CC=gcc -LCC_CFLAGS=-O2 -Wall -fno-strict-aliasing -MMD -LDFLAGS= -LD=gcc -AR=ar -ARFLAGS=cru -RANLIB=ranlib -DIFF=diff -RM=rm -f -RMDIR=rmdir -BUILDDIR=build-$(PLATFORM)-$(ARCH) -BD=$(BUILDDIR)/ - -ifeq ($(USE_CCACHE),1) - CC := ccache $(CC) -endif - -# Need MACOS_X defined or this won't build. -ifeq ($(PLATFORM),darwin) - LCC_CFLAGS += -DMACOS_X -endif - -ifeq ($(PLATFORM),sunos) - INSTALL=ginstall -else - INSTALL=install -endif - -all: q3rcc lburg q3cpp q3lcc - -q3rcc: makedirs $(BD)q3rcc$(E) -lburg: makedirs $(BD)lburg$(E) -q3cpp: makedirs $(BD)q3cpp$(E) -q3lcc: makedirs $(BD)q3lcc$(E) - -makedirs: - @if [ ! -d $(BD) ];then mkdir $(BD);fi - @if [ ! -d $(BD)/etc ];then mkdir $(BD)/etc;fi - @if [ ! -d $(BD)/rcc ];then mkdir $(BD)/rcc;fi - @if [ ! -d $(BD)/cpp ];then mkdir $(BD)/cpp;fi - @if [ ! -d $(BD)/lburg ];then mkdir $(BD)/lburg;fi - -# ===== RCC ===== -RCCOBJS= \ - $(BD)rcc/alloc$(O) \ - $(BD)rcc/bind$(O) \ - $(BD)rcc/bytecode$(O) \ - $(BD)rcc/dag$(O) \ - $(BD)rcc/dagcheck$(O) \ - $(BD)rcc/decl$(O) \ - $(BD)rcc/enode$(O) \ - $(BD)rcc/error$(O) \ - $(BD)rcc/event$(O) \ - $(BD)rcc/expr$(O) \ - $(BD)rcc/gen$(O) \ - $(BD)rcc/init$(O) \ - $(BD)rcc/inits$(O) \ - $(BD)rcc/input$(O) \ - $(BD)rcc/lex$(O) \ - $(BD)rcc/list$(O) \ - $(BD)rcc/main$(O) \ - $(BD)rcc/null$(O) \ - $(BD)rcc/output$(O) \ - $(BD)rcc/prof$(O) \ - $(BD)rcc/profio$(O) \ - $(BD)rcc/simp$(O) \ - $(BD)rcc/stmt$(O) \ - $(BD)rcc/string$(O) \ - $(BD)rcc/sym$(O) \ - $(BD)rcc/symbolic$(O) \ - $(BD)rcc/trace$(O) \ - $(BD)rcc/tree$(O) \ - $(BD)rcc/types$(O) - -$(BD)q3rcc$(E): $(RCCOBJS) - $(LD) $(LDFLAGS) -o $@ $(RCCOBJS) - -$(BD)rcc/%$(O): src/%.c - $(CC) $(LCC_CFLAGS) -c -Isrc -o $@ $< - -$(BD)rcc/dagcheck$(O): $(BD)rcc/dagcheck.c - $(CC) $(LCC_CFLAGS) -Wno-unused -c -Isrc -o $@ $< - -$(BD)rcc/dagcheck.c: $(BD)lburg/lburg$(E) src/dagcheck.md - $(BD)lburg/lburg$(E) src/dagcheck.md $@ - - -# ===== LBURG ===== -LBURGOBJS= \ - $(BD)lburg/lburg$(O) \ - $(BD)lburg/gram$(O) - -$(BD)lburg/lburg$(E): $(LBURGOBJS) - $(LD) $(LDFLAGS) -o $@ $(LBURGOBJS) - -$(BD)lburg/%$(O): lburg/%.c - $(CC) $(LCC_CFLAGS) -c -Ilburg -o $@ $< - - -# ===== CPP ===== -CPPOBJS= \ - $(BD)cpp/cpp$(O) \ - $(BD)cpp/lex$(O) \ - $(BD)cpp/nlist$(O) \ - $(BD)cpp/tokens$(O) \ - $(BD)cpp/macro$(O) \ - $(BD)cpp/eval$(O) \ - $(BD)cpp/include$(O) \ - $(BD)cpp/hideset$(O) \ - $(BD)cpp/getopt$(O) \ - $(BD)cpp/unix$(O) - -$(BD)q3cpp$(E): $(CPPOBJS) - $(LD) $(LDFLAGS) -o $@ $(CPPOBJS) - -$(BD)cpp/%$(O): cpp/%.c - $(CC) $(LCC_CFLAGS) -c -Icpp -o $@ $< - - -# ===== LCC ===== -LCCOBJS= \ - $(BD)etc/lcc$(O) \ - $(BD)etc/bytecode$(O) - -$(BD)q3lcc$(E): $(LCCOBJS) - $(LD) $(LDFLAGS) -o $@ $(LCCOBJS) - -$(BD)etc/%$(O): etc/%.c - $(CC) $(LCC_CFLAGS) -DTEMPDIR=\"$(TEMPDIR)\" -DSYSTEM=\"\" -c -Isrc -o $@ $< - - -install: q3lcc q3cpp q3rcc - $(INSTALL) -s -m 0755 $(BD)q3lcc$(E) ../ - $(INSTALL) -s -m 0755 $(BD)q3cpp$(E) ../ - $(INSTALL) -s -m 0755 $(BD)q3rcc$(E) ../ - -uninstall: - -$(RM) ../q3lcc$(E) - -$(RM) ../q3cpp$(E) - -$(RM) ../q3rcc$(E) - -clean: - if [ -d $(BD) ];then (find $(BD) -name '*.d' -exec rm {} \;)fi - $(RM) $(RCCOBJS) $(LBURGOBJS) $(CPPOBJS) $(LCCOBJS) - $(RM) $(BD)rcc/dagcheck.c $(BD)lburg/lburg$(E) - $(RM) $(BD)q3lcc$(E) $(BD)q3cpp$(E) $(BD)q3rcc$(E) - $(RM) -r $(BD) - -D_FILES=$(shell find . -name '*.d') - -ifneq ($(strip $(D_FILES)),) - include $(D_FILES) -endif |