Re: NMakefile from freetds-0.83.dev.20101006 RE: [Fwd: FreeTDS for MS VC++ 2010]

[email protected]
Newsgroups gmane.comp.db.tds.freetds
Message-ID <[email protected]>
On Tue, Oct 12, 2010 at 03:21:47PM +0100, Neuhauser, Roman (GE Capital, consultant) wrote:
> > > I think at one time types.h was in the include directory 
> > > and later we decided to leave in the the tds directory.  
> > > NMakefile assumes it will be in include.  If you copy the 
> > > file, you satisfy the dependency without needing Perl or types.pl.  
> 
> > for me, NMAKE ends later with another error message:
> > 
> > NMAKE : fatal error U1073: don't know how to make 'src\tds\tds_willconvert.pl'
> > Stop.
> 
> yes, you'd need to remove the rule that mentions this script, but you won't get far.
> see my other email when / if it makes through to the list.

My apologies to anyone trying to follow my advice to use the distributed NMakefile.  It works fine from CVS with Perl installed, but there were a few problems with using it with the distribution tarball.  

Attached is an NMakefile that works.  I committed it to CVS HEAD and the nightly snapshot should work out of the box tomorrow.  Changes:

1.  Requires FROM_TARBALL= to be defined on the command line, cf. comments at the top of the file.  
2.  Skips building generated files if FROM_TARBALL is defined. 
3.  Includes getopt.c in src/replacements.  

To use it right now, extract the attached file from this message, and download any copy of src/replacements/getopt.c from CVS.  (The file was not being distributed.  I'm surprised no one reported that before.) 

I just built freetds-0.83.dev.20101012 using the following command:

$ nmake -f Nmakefile -nologo PLATFORM=win32 CONFIGURATION=debug FROM_TARBALL=

It doesn't matter what FROM_TARBALL is defined as, as long as it's defined.  I don't see a way to "just define" it on the Nmake command line.  

A more elegant solution would be to !INCLUDE a file to make the generated files.  In CVS, that file would invoke Perl, but the distributed version would be empty.  Patches welcome.  

Your humble maintainer, 

--jkl

_______________________________________________
FreeTDS mailing list
[email protected]
http://lists.ibiblio.org/mailman/listinfo/freetds
Nmakefile (text/plain, 10.7 KB)
# $Id: Nmakefile,v 1.6 2010/10/12 15:36:24 jklowden Exp $
# Build FreeTDS and assorted utilities for Win32/Win64 without an IDE. 
# Makefiles, unlike Visual Studio project files, are stable over time.  
# Contributed to the public domain by James K. Lowden, February 2009

# Define in the environment or on the command line:
# 1. CONFIGURATION = debug/release
# 2. PLATFORM = win32/x64
# These will determine what is built and where outputs are placed. 
#
# Example invocation:
#	nmake.exe -f Nmakefile -nologo PLATFORM=win32 CONFIGURATION=debug
# If using with tarball distribution (not CVS):
#	nmake.exe -f Nmakefile PLATFORM=win32 CONFIGURATION=debug FROM_TARBALL=
#	

MKDIR = MD
MV = move /Y

DBLIB_DIR        = src\dblib
REPLACEMENTS_DIR = src\replacements
TDS_DIR          = src\tds
APPS_DIR         = src\apps

DBLIB_OUT        = $(DBLIB_DIR)\$(PLATFORM)\$(CONFIGURATION)
REPLACEMENTS_OUT = $(REPLACEMENTS_DIR)\$(PLATFORM)\$(CONFIGURATION)
TDS_OUT          = $(TDS_DIR)\$(PLATFORM)\$(CONFIGURATION)
APPS_OUT         = $(APPS_DIR)\$(PLATFORM)\$(CONFIGURATION)

DBLIB_SRC = 	$(DBLIB_DIR)\bcp.c \
		$(DBLIB_DIR)\dblib.c \
		$(DBLIB_DIR)\dbopen.c \
		$(DBLIB_DIR)\dbutil.c \
		$(DBLIB_DIR)\rpc.c \
		$(DBLIB_DIR)\xact.c 

DBLIB_OBJ = 	$(DBLIB_OUT)\bcp.obj \
		$(DBLIB_OUT)\dblib.obj \
		$(DBLIB_OUT)\dbopen.obj \
		$(DBLIB_OUT)\dbutil.obj \
		$(DBLIB_OUT)\rpc.obj \
		$(DBLIB_OUT)\xact.obj 

REPLACEMENTS_SRC =	$(REPLACEMENTS_DIR)\asprintf.c \
			$(REPLACEMENTS_DIR)\basename.c \
			$(REPLACEMENTS_DIR)\fakepoll.c \
			$(REPLACEMENTS_DIR)\gettimeofday.c \
			$(REPLACEMENTS_DIR)\getopt.c \
			$(REPLACEMENTS_DIR)\iconv.c \
			$(REPLACEMENTS_DIR)\readpassphrase.c \
			$(REPLACEMENTS_DIR)\strlcat.c \
			$(REPLACEMENTS_DIR)\strlcpy.c \
			$(REPLACEMENTS_DIR)\strtok_r.c \
			$(REPLACEMENTS_DIR)\vasprintf.c 

REPLACEMENTS_OBJ =	$(REPLACEMENTS_OUT)\asprintf.obj \
			$(REPLACEMENTS_OUT)\basename.obj \
			$(REPLACEMENTS_OUT)\fakepoll.obj \
			$(REPLACEMENTS_OUT)\gettimeofday.obj \
			$(REPLACEMENTS_OUT)\getopt.obj \
			$(REPLACEMENTS_OUT)\iconv.obj \
			$(REPLACEMENTS_OUT)\readpassphrase.obj \
			$(REPLACEMENTS_OUT)\strlcat.obj \
			$(REPLACEMENTS_OUT)\strlcpy.obj \
			$(REPLACEMENTS_OUT)\strtok_r.obj \
			$(REPLACEMENTS_OUT)\vasprintf.obj 

TDS_SRC =	$(TDS_DIR)\bulk.c \
		$(TDS_DIR)\challenge.c \
		$(TDS_DIR)\config.c \
		$(TDS_DIR)\convert.c \
		$(TDS_DIR)\data.c \
		$(TDS_DIR)\des.c \
		$(TDS_DIR)\getmac.c \
		$(TDS_DIR)\gssapi.c \
		$(TDS_DIR)\hmac_md5.c \
		$(TDS_DIR)\iconv.c \
		$(TDS_DIR)\locale.c \
		$(TDS_DIR)\log.c \
		$(TDS_DIR)\login.c \
		$(TDS_DIR)\md4.c \
		$(TDS_DIR)\md5.c \
		$(TDS_DIR)\mem.c \
		$(TDS_DIR)\net.c \
		$(TDS_DIR)\numeric.c \
		$(TDS_DIR)\query.c \
		$(TDS_DIR)\read.c \
		$(TDS_DIR)\sspi.c \
		$(TDS_DIR)\tds_checks.c \
		$(TDS_DIR)\tdsstring.c \
		$(TDS_DIR)\threadsafe.c \
		$(TDS_DIR)\token.c \
		$(TDS_DIR)\util.c \
		$(TDS_DIR)\vstrbuild.c \
		$(TDS_DIR)\win_mutex.c \
		$(TDS_DIR)\write.c 

TDS_OBJ =	$(TDS_OUT)\bulk.obj \
		$(TDS_OUT)\challenge.obj \
		$(TDS_OUT)\config.obj \
		$(TDS_OUT)\convert.obj \
		$(TDS_OUT)\data.obj \
		$(TDS_OUT)\des.obj \
		$(TDS_OUT)\getmac.obj \
		$(TDS_OUT)\gssapi.obj \
		$(TDS_OUT)\hmac_md5.obj \
		$(TDS_OUT)\iconv.obj \
		$(TDS_OUT)\locale.obj \
		$(TDS_OUT)\log.obj \
		$(TDS_OUT)\login.obj \
		$(TDS_OUT)\md4.obj \
		$(TDS_OUT)\md5.obj \
		$(TDS_OUT)\mem.obj \
		$(TDS_OUT)\net.obj \
		$(TDS_OUT)\numeric.obj \
		$(TDS_OUT)\query.obj \
		$(TDS_OUT)\read.obj \
		$(TDS_OUT)\sspi.obj \
		$(TDS_OUT)\tds_checks.obj \
		$(TDS_OUT)\tdsstring.obj \
		$(TDS_OUT)\threadsafe.obj \
		$(TDS_OUT)\token.obj \
		$(TDS_OUT)\util.obj \
		$(TDS_OUT)\vstrbuild.obj \
		$(TDS_OUT)\win_mutex.obj \
		$(TDS_OUT)\write.obj 

# not yet:	$(APPS_DIR)\bsqlodbc.c 

APPS_SRC =	$(APPS_DIR)\bsqldb.c \
		$(APPS_DIR)\datacopy.c \
		$(APPS_DIR)\defncopy.c \
		$(APPS_DIR)\freebcp.c \
		$(APPS_DIR)\tsql.c 

APPS_OBJ =	$(APPS_OUT)\bsqldb.obj \
		$(APPS_OUT)\datacopy.obj \
		$(APPS_OUT)\defncopy.obj \
		$(APPS_OUT)\freebcp.obj \
		$(APPS_OUT)\tsql.obj 

APPS_EXE =	$(APPS_OUT)\bsqldb.exe \
		$(APPS_OUT)\datacopy.exe \
		$(APPS_OUT)\defncopy.exe \
		$(APPS_OUT)\freebcp.exe \
		$(APPS_OUT)\tsql.exe 

db-lib: $(DBLIB_OUT)\db-lib.lib 

apps: $(DBLIB_OUT)\db-lib.lib $(APPS_EXE)
tsql: $(APPS_OUT)\tsql.exe 
bsqldb: $(APPS_OUT)\bsqldb.exe 

##(APPS_OUT)\bsqldb.exe: $(APPS_DIR)\bsqldb.exe $(DBLIB_OUT)\db-lib.lib
# Don't know how to create this dependency without explicitly defining every output. 

#
# Sadly the environment settings for building for different architectures
# is undocumented.  Microsoft's directions are to run the requisite 
# batch file without explaining what it does.  While it's possible to 
# read the file -- and it's not complicated -- it's impossible to 
# know the purpose of setting PATH/INCLUDE/LIB just so.  Worse, the 
# settings are per-machine, and if the file is lost, the only way to 
# recreate it is to reinstall the compiler.  
#
# The "solution" is to follow their advice.  Run vcvarsall.bat with the 
# appropriate argument to set up the environment, and go from there.  
#
# As of this writing, the variables are:
# x86 Native: Vcvarsall "x86" 
# x64 Native: Vcvarsall "amd64"
# x64 Cross:  Vcvarsall "x86_amd64"
#

all: build-win32d build-win32r build-win64d build-win64r

build-win32d: 
	$(MAKE) -fNmakefile -nologo apps PLATFORM=win32 CONFIGURATION=debug
build-win32r: 
	$(MAKE) -fNmakefile -nologo apps PLATFORM=win32 CONFIGURATION=release
build-win64d: 
	$(MAKE) -fNmakefile -nologo apps PLATFORM=win64 CONFIGURATION=debug
build-win64r: 
	$(MAKE) -fNmakefile -nologo apps PLATFORM=win64 CONFIGURATION=release

clean:
	@if "" equ "$(PLATFORM)" 	PLATFORM not defined, see comments in Nmakefile >&2 && exit 1
	@if "" equ "$(CONFIGURATION)" 	CONFIGURATION not defined, see comments in Nmakefile >&2 && exit 1
	if exist $(DBLIB_OUT) 		del /q $(DBLIB_OUT)\*.obj 
	if exist $(REPLACEMENTS_OUT) 	del /q $(REPLACEMENTS_OUT)\*.obj 
	if exist $(TDS_OUT) 		del /q $(TDS_OUT)\*.obj 
	if exist $(APPS_OUT) 		del /q $(APPS_OUT)\*.obj $(APPS_OUT)\*.exe

clean-app:
	@if "" equ "$(PLATFORM)" 	PLATFORM not defined, see comments in Nmakefile >&2 && exit 1
	@if "" equ "$(CONFIGURATION)" 	CONFIGURATION not defined, see comments in Nmakefile >&2 && exit 1
	if exist $(APPS_OUT) 		del /q $(APPS_OUT)\*.obj $(APPS_OUT)\*.exe

# Create output directories
$(DBLIB_OUT) $(REPLACEMENTS_OUT) $(TDS_OUT) $(APPS_OUT):
	@echo creating output directory for configuration: "$(PLATFORM)|$(CONFIGURATION)"
	@if "" equ "$(PLATFORM)" 	PLATFORM not defined, see comments in Nmakefile >&2 && exit 1
	@if "" equ "$(CONFIGURATION)" 	CONFIGURATION not defined, see comments in Nmakefile >&2 && exit 1
	$(MKDIR) $@

!IFNDEF FROM_TARBALL
#
# Generate distributed header files
#
include\tdsver.h:
	perl -e"@a=localtime; printf qq(#undef  TDS_VERSION_NO\n#define TDS_VERSION_NO \"freetds v0.83.dev.%d%02d%02d\"\n), 1900+$$a[5], 1+$$a[-1], $$a[3]" \
	> [email protected] 
	move /Y [email protected] $@

src\tds\types.h:
	perl src\tds\types.pl misc\types.txt > [email protected]
	move /Y [email protected] $@

src\tds\tds_willconvert.h: src\tds\tds_willconvert.pl
	perl src\tds\tds_willconvert.pl > [email protected]
	$(MV) [email protected] $@

src\tds\encodings.h: src\tds\encodings.pl src\tds\alternative_character_sets.h
	perl src\tds\encodings.pl src\tds > [email protected] 2> NUL:
	$(MV) [email protected] $@

src\tds\num_limits.h: src\tds\num_limits.pl
	perl src\tds\num_limits.pl > [email protected]
	$(MV) [email protected] $@
!ENDIF

GENERATED_FILES = include\tdsver.h src\tds\types.h \
	src\tds\tds_willconvert.h src\tds\encodings.h src\tds\num_limits.h

$(DBLIB_OUT)\db-lib.lib: $(GENERATED_FILES) $(DBLIB_OUT) $(DBLIB_OBJ) $(REPLACEMENTS_OUT)\replacements.lib $(TDS_OUT)\tds.lib
	@echo building $@ >&2
	lib -nologo -out:"$@" 	$(DBLIB_OBJ) \
				$(REPLACEMENTS_OUT)\replacements.lib \
				$(TDS_OUT)\tds.lib
$(REPLACEMENTS_OUT)\replacements.lib: $(REPLACEMENTS_OUT) $(REPLACEMENTS_OBJ)
	lib -nologo -out:"$@" $(REPLACEMENTS_OBJ) 
$(TDS_OUT)\tds.lib: $(TDS_OUT) $(TDS_OBJ)
	lib -nologo -out:"$@" $(TDS_OBJ) 

#
# set compiler flags
#
INC = 	-I "include" -I "win32" -I "include\x64" 
FLG = 	-nologo	-W3 -Wp64 -EHsc -TC -Gm  -errorReport:prompt 
DEF = 	-D "_MBCS" -D "_LIB" -D "WIN32" \
	-D "_CRT_SECURE_NO_WARNINGS" -D _CRT_NONSTDC_NO_DEPRECATE \
	-D "HAVE_CONFIG_H" \
	-D "_FREETDS_LIBRARY_SOURCE" 
DBG = -MTd -Od -D "_DEBUG"  -ZI -RTC1	
REL = -MT  -O2 -D "_NDEBUG" -Zi

MSLIBS = Ws2_32.lib shell32.lib	

CC = cl $(CFLAGS) $(FLG) $(DEF) $(INC)
CC32 = $(CC)
CC64 = $(CC)

## Rules ##

#
# dblib
#
#c.{$(DBLIB_DIR)\win32\debug}.obj::
{$(DBLIB_DIR)}.c{$(DBLIB_DIR)\win32\debug}.obj::
	$(CC32) -c $(DBG) 	-Fo"$(DBLIB_OUT)\\" \
				-Fd"$(DBLIB_OUT)\vc80.pdb" \
	$<

{$(DBLIB_DIR)\}.c{$(DBLIB_DIR)\win32\release}.obj::
	$(CC32) -c $(REL) 	-Fo"$(DBLIB_OUT)\\" \
				-Fd"$(DBLIB_OUT)\vc80.pdb" \
	$<

{$(DBLIB_DIR)}.c{$(DBLIB_DIR)\x64\debug}.obj::
	$(CC64) -c $(DBG) 	-Fo"$(DBLIB_OUT)\\" \
				-Fd"$(DBLIB_OUT)\vc80.pdb" \
	$<

{$(DBLIB_DIR)}.c{$(DBLIB_DIR)\x64\release}.obj::
	$(CC64) -c $(REL) 	-Fo"$(DBLIB_OUT)\\" \
				-Fd"$(DBLIB_OUT)\vc80.pdb" \
	$<

#
# replacements
#
{$(REPLACEMENTS_DIR)}.c{$(REPLACEMENTS_DIR)\win32\debug}.obj::
	$(CC32) -c $(DBG) 	-Fo"$(REPLACEMENTS_OUT)\\" \
				-Fd"$(REPLACEMENTS_OUT)\vc80.pdb" \
	$<

{$(REPLACEMENTS_DIR)}.c{$(REPLACEMENTS_DIR)\win32\release}.obj::
	$(CC32) -c $(REL) 	-Fo"$(REPLACEMENTS_OUT)\\" \
				-Fd"$(REPLACEMENTS_OUT)\vc80.pdb" \
	$<

{$(REPLACEMENTS_DIR)}.c{$(REPLACEMENTS_DIR)\x64\debug}.obj::
	$(CC64) -c $(DBG) 	-Fo"$(REPLACEMENTS_OUT)\\" \
			-Fd"$(REPLACEMENTS_OUT)\vc80.pdb" \
	$<		

{$(REPLACEMENTS_DIR)}.c{$(REPLACEMENTS_DIR)\x64\release}.obj::
	$(CC64) -c $(REL) 	-Fo"$(REPLACEMENTS_OUT)\\" \
				-Fd"$(REPLACEMENTS_OUT)\vc80.pdb" \
	$<

#
# tds
#
{$(TDS_DIR)}.c{$(TDS_DIR)\win32\debug}.obj::
	$(CC32) -c $(DBG) 	-Fo"$(TDS_OUT)\\" \
				-Fd"$(TDS_OUT)\vc80.pdb" \
	$<

{$(TDS_DIR)}.c{$(TDS_DIR)\win32\release}.obj::
	$(CC32) -c $(REL) 	-Fo"$(TDS_OUT)\\" \
				-Fd"$(TDS_OUT)\vc80.pdb" \
	$<

{$(TDS_DIR)}.c{$(TDS_DIR)\x64\debug}.obj::
	$(CC64) -c $(DBG) 	-Fo"$(TDS_OUT)\\" \
				-Fd"$(TDS_OUT)\vc80.pdb" \
	$<

{$(TDS_DIR)}.c{$(TDS_DIR)\x64\release}.obj::
	$(CC64) -c $(REL) 	-Fo"$(TDS_OUT)\\" \
				-Fd"$(TDS_OUT)\vc80.pdb" \
	$<

#
# Utilities
#
$(APPS_EXE): $(DBLIB_OUT)\db-lib.lib

{$(APPS_DIR)}.c{$(APPS_DIR)\win32\debug}.exe:
	@if not exist $(APPS_OUT) $(MKDIR) $(APPS_OUT)
	$(CC32) $(DBG) 	-Fd"$(APPS_OUT)\vc80.pdb" -Fe$@ \
	$< -link -LIBPATH:$(DBLIB_OUT) db-lib.lib $(MSLIBS)
	
{$(APPS_DIR)\}.c{$(APPS_DIR)\win32\release}.exe:
	@if not exist $(APPS_OUT) $(MKDIR) $(APPS_OUT)
	$(CC32) $(REL) -Fe$@ -Fd"$(APPS_OUT)\vc80.pdb" \
	$< -link -LIBPATH:$(DBLIB_OUT) db-lib.lib $(MSLIBS)

{$(APPS_DIR)}.c{$(APPS_DIR)\x64\debug}.exe:
	@if not exist $(APPS_OUT) $(MKDIR) $(APPS_OUT)
	$(CC64) $(DBG) -Fe$@ -Fd"$(APPS_OUT)\vc80.pdb" \
	$< -link -LIBPATH:$(DBLIB_OUT) db-lib.lib $(MSLIBS)

{$(APPS_DIR)}.c{$(APPS_DIR)\x64\release}.exe:
	@if not exist $(APPS_OUT) $(MKDIR) $(APPS_OUT)
	$(CC64) $(REL) -Fe$@ -Fd"$(APPS_OUT)\vc80.pdb" \
	$< -link -LIBPATH:$(DBLIB_OUT) db-lib.lib $(MSLIBS)
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.