1 ########################################################################
3 # Copyright (c) 2009-2011, Secure Endpoints Inc.
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions
10 # - Redistributions of source code must retain the above copyright
11 # notice, this list of conditions and the following disclaimer.
13 # - Redistributions in binary form must reproduce the above copyright
14 # notice, this list of conditions and the following disclaimer in
15 # the documentation and/or other materials provided with the
18 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
21 # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
22 # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
23 # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
24 # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26 # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
28 # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 # POSSIBILITY OF SUCH DAMAGE.
42 !include "NTMakefile.sdk"
50 !if exist($(MAKEDIR)\windows\NTMakefile.w32)
52 !elseif exist($(MAKEDIR)\..\windows\NTMakefile.w32)
54 !elseif exist($(MAKEDIR)\..\..\windows\NTMakefile.w32)
56 !elseif exist($(MAKEDIR)\..\..\..\windows\NTMakefile.w32)
57 SRC=$(MAKEDIR)\..\..\..
58 !elseif exist($(MAKEDIR)\..\..\..\..\windows\NTMakefile.w32)
59 SRC=$(MAKEDIR)\..\..\..\..
61 ! error Cant determine source directory
64 ! if "$(CPU)"=="i386" || "$(CPU)"=="x86"
66 ! elseif "$(CPU)"=="AMD64"
72 !include "NTMakefile.config"
74 #----------------------------------------------------------------
77 DESTDIR =$(SRC)\out\dest_$(CPU)
78 OBJDIR =$(SRC)\out\obj_$(CPU)
80 INCDIR =$(DESTDIR)\inc
81 LIBDIR =$(DESTDIR)\lib
82 BINDIR =$(DESTDIR)\bin
84 DOCDIR =$(DESTDIR)\doc
88 INSTDIR =$(DESTDIR)\install
89 SDKDIR =$(SRC)\out\sdk
90 SDKINCDIR =$(SDKDIR)\inc
91 SDKLIBDIR =$(SDKDIR)\lib\$(CPU)
92 SDKSRCDIR =$(SDKDIR)\src
93 SDKREDISTDIR =$(SDKDIR)\redist\$(CPU)
96 SRCDIR =$(SRC)\$(RELDIR)
97 OBJ =$(OBJDIR)\$(RELDIR)
103 PATH=$(PATH);$(BINDIR)
105 #----------------------------------------------------------------
108 RMAKE=nmake /nologo /f NTMakefile RECURSE=1
117 #----------------------------------------------------------------
128 MAKEINFO=makeinfo.exe
131 CANDLE_CMD=candle.exe
134 # Only used for tests
141 CANDLE=$(CANDLE_CMD) -nologo
142 LIGHT=$(LIGHT_CMD) -nologo
144 #----------------------------------------------------------------
145 # External dependencies
147 # For pthread support to be enabled, both PTHREAD_INC and PTHREAD_LIB
148 # should be defined. PTHREAD_INC should be the include directory
149 # where pthread.h is to be found (i.e. $(PTHREAD_INC)\pthread.h should
150 # exist), and PTHREAD_LIB is the full path to the pthread import
153 # Note that both paths should not contain any whitespace.
156 pthreadinc= -I$(PTHREAD_INC)
159 #----------------------------------------------------------------
162 cincdirs=$(cincdirs) -I$(INCDIR) -I$(INCDIR)\krb5 $(pthreadinc)
163 cdefines=$(cdefines) -DHAVE_CONFIG_H -Drestrict=
164 # Windows CNG provider
165 cdefines=$(cdefines) -DHCRYPTO_DEF_PROVIDER=w32crypto
167 ldebug=$(ldebug) /DEBUG
168 localcflags=$(localcflags) /Oy-
172 # C4996: 'function' was declared deprecated
173 # C4127: Conditional expression is constant
174 # C4244: Conversion from 'type1' to 'type2', possible loss of data
175 # C4100: 'identifier': unreferenced formal parameter
176 # C4706: Assignment within conditional expression
177 # C4214: Nonstandard extension used
178 # C4267: '': Conversion from 'type1' to 'type2', possible loss of data
179 # C4018: '': Signed/unsigned mismatch
180 # C4204: Nonstandard extension used: non-constant aggregate initializer
181 # C4221: Nonstandard extension used: 'v1': cannot be initialized using address of automatic variable 'v2'
182 # C4295: '': Array is too small to include a terminating null character
183 # C4146: Unary minus operator applied to unsigned type, result still unsigned.
185 cwarn=$(cwarn) -D_CRT_SECURE_NO_WARNINGS -wd4996 -wd4127 -wd4244 -wd4100 -wd4706
186 cwarn=$(cwarn) -wd4214 -wd4267 -wd4018 -wd4389 -wd4204 -wd4221 -wd4295 -wd4146
190 !elseif "$(CPU)"=="AMD64"
193 ! error Unknown CPU value
202 !ifndef STATICRUNTIME
204 C2OBJ_C = $(CC) $(cdebug) $(cflags) $(cvarsdll) $(AUXCFLAGS) $(intcflags) $(cdefines) $(cincdirs) $(cwarn)
205 EXECONLINK_C = $(LINK) $(ldebug) $(conlflags) $(conlibsdll) $(libmach)
206 EXEGUILINK_C = $(LINK) $(ldebug) $(guilflags) $(guilibsdll) $(libmach)
207 DLLCONLINK_C = $(LINK) $(ldebug) $(dlllflags) $(conlibsdll) $(libmach)
208 DLLGUILINK_C = $(LINK) $(ldebug) $(dlllflags) $(guilibsdll) $(libmach)
210 C2OBJ_C_MT = $(CC) $(cdebug) $(cflags) $(cvarsmt) $(AUXCFLAGS) $(intcflags) $(cdefines) $(cincdirs) $(cwarn)
212 !else # STATICRUNTIME
214 C2OBJ_C = $(CC) $(cdebug) $(cflags) $(cvarsmt) $(AUXCFLAGS) $(intcflags) $(cdefines) $(cincdirs) $(cwarn)
215 EXECONLINK_C = $(LINK) $(ldebug) $(conlflags) $(conlibsmt) $(libmach)
216 EXEGUILINK_C = $(LINK) $(ldebug) $(guilflags) $(guilibsmt) $(libmach)
217 DLLCONLINK_C = $(LINK) $(ldebug) $(dlllflags) $(conlibsmt) $(libmach)
218 DLLGUILINK_C = $(LINK) $(ldebug) $(dlllflags) $(guilibsmt) $(libmach)
222 LIBGUI_C = $(LM) /nologo $(libmach) /SUBSYSTEM:WINDOWS
223 LIBCON_C = $(LM) /nologo $(libmach) /SUBSYSTEM:CONSOLE
225 C2OBJ = $(C2OBJ_C) -Fo$@ -Fd$(@D)\ $**
226 C2OBJ_NP = $(C2OBJ_C) $(MPOPT) $<
227 C2OBJ_P = $(C2OBJ_NP) -Fo$(OBJ)\ -Fd$(OBJ)\ #
228 EXECONLINK = $(EXECONLINK_C) -OUT:$@ $**
229 EXEGUILINK = $(EXEGUILINK_C) -OUT:$@ $**
230 DLLCONLINK = $(DLLCONLINK_C) -OUT:$@ $**
231 DLLGUILINK = $(DLLGUILINK_C) -OUT:$@ $**
232 LIBGUI = $(LIBGUI_C) /OUT:$@ $**
233 LIBCON = $(LIBCON_C) /OUT:$@ $**
235 # Preprocess files to stdout using config.h
236 CPREPROCESSOUT = $(CC) /EP /FI$(INCDIR)\config.h /TC /DCPP_ONLY=1
240 RC2RES_C = $(RC) $(cincdirs) $(AUXRCFLAGS)
241 RC2RES = $(RC2RES_C) -fo $@ $**
243 #----------------------------------------------------------------------
244 # If this is the initial invocation, we check if all the build
245 # utilities are there. Also show the commands macros.
250 "$(AWK_CMD)" "$(YACC_CMD)" "$(LEX_CMD)" "$(PYTHON)" "$(PERL)" \
251 "$(CMP)" "$(SED)" "$(MAKECAT)" "$(MAKEINFO)" "$(HHC)"
253 !ifdef BUILD_INSTALLERS
254 REQUIRED_TOOLS=$(REQUIRED_TOOLS) "$(CANDLE_CMD)" "$(LIGHT_CMD)"
257 OPTIONAL_TOOLS="$(SH)"
260 @for %%g in ( $(REQUIRED_TOOLS) ) do @( \
261 for /f %%f in ( "%%g" ) do @( \
264 ) else if "%%~$$PATH:f"=="" @( \
265 echo Could not find %%f in PATH && \
268 echo Found %%~$$PATH:f \
272 @for %%g in ( $(OPTIONAL_TOOLS) ) do @( \
273 for /f %%f in ( "%%g" ) do @( \
276 ) else if "%%~$$PATH:f"=="" @( \
277 echo Could not find %%f in PATH && \
278 echo Optional targets may fail. \
280 echo Found %%~$$PATH:f \
289 @$(ECHO) C2OBJ=$(C2OBJ_C:\=\\)
291 @$(ECHO) EXECONLINK=$(EXECONLINK_C)
293 @$(ECHO) EXEGUILINK=$(EXEGUILINK_C)
295 @$(ECHO) DLLCONLINK=$(DLLCONLINK_C)
297 @$(ECHO) DLLGUILINK=$(DLLGUILINK_C)
299 @$(ECHO) LIBGUI=$(LIBGUI_C)
301 @$(ECHO) LIBCON=$(LIBCON_C)
308 $(C2OBJ_C) /Fd$(OBJ)\ /Fo$(OBJ)\ $(localcflags) $(MPOPT) @<<
312 {$(OBJ)}.c{$(OBJ)}.obj::
313 $(C2OBJ_C) /Fd$(OBJ)\ /Fo$(OBJ)\ $(extcflags) $(MPOPT) @<<
318 $(C2OBJ_C) /Fd$(OBJ)\ /Fo$(OBJ)\ $(localcflags) $(MPOPT) @<<
322 {$(OBJ)}.cpp{$(OBJ)}.obj::
323 $(C2OBJ_C) /Fd$(OBJ)\ /Fo$(OBJ)\ $(extcflags) $(MPOPT) @<<
333 {}.h{$(INCDIR)\krb5}.h:
336 {$(OBJ)}.h{$(INCDIR)}.h:
339 {$(OBJ)}.x{$(OBJ)}.c:
342 {$(OBJ)}.hx{$(INCDIR)}.h:
345 {$(OBJ)}.hx{$(OBJ)}.h:
351 #----------------------------------------------------------------------
352 # Announce the build directory
357 all-tools:: announce-tools
365 @echo --------- Entering $(RELDIR:\= ):
369 @echo --------- Entering $(RELDIR:\= ) tools:
372 #----------------------------------------------------------------------
373 # Create any required directories if they don't already exist
378 ! if !exist("$(OBJ)")
381 ! if !exist("$(DESTDIR)")
382 -$(MKDIR) "$(DESTDIR)"
384 ! if !exist("$(LIBDIR)")
385 -$(MKDIR) "$(LIBDIR)"
387 ! if !exist("$(BINDIR)")
388 -$(MKDIR) "$(BINDIR)"
390 ! if !exist("$(PLUGINDIR)")
391 -$(MKDIR) "$(PLUGINDIR)"
393 ! if !exist("$(INCDIR)")
394 -$(MKDIR) "$(INCDIR)"
396 ! if !exist("$(DOCDIR)")
397 -$(MKDIR) "$(DOCDIR)"
399 ! if !exist("$(INCDIR)\gssapi")
400 -$(MKDIR) "$(INCDIR)\gssapi"
402 ! if !exist("$(INCDIR)\hcrypto")
403 -$(MKDIR) "$(INCDIR)\hcrypto"
405 ! if !exist("$(INCDIR)\kadm5")
406 -$(MKDIR) "$(INCDIR)\kadm5"
408 ! if !exist("$(INCDIR)\krb5")
409 -$(MKDIR) "$(INCDIR)\krb5"
412 #----------------------------------------------------------------------
413 # If SUBDIRS is defined, we should recurse into the subdirectories
417 @for %%f in ( $(SUBDIRS) ) do @ (pushd %%f && $(RMAKE) && popd) || exit /b 1
420 @for %%f in ( $(SUBDIRS) ) do @ (pushd %%f && $(RMAKE) clean && popd) || exit /b 1
423 @for %%f in ( $(SUBDIRS) ) do @ (pushd %%f && $(RMAKE) test && popd) || exit /b 1
427 clean:: clean-subdirs
433 #----------------------------------------------------------------------
445 .SUFFIXES: .c .cpp .hin .h .x .hx
447 #----------------------------------------------------------------------
450 # Starting with Visual Studio 8, the C compiler and the linker
451 # generate manifests so that the applications will link with the
452 # correct side-by-side DLLs at run-time. These are required for
453 # correct operation under Windows XP and later. We also have custom
454 # manifests which need to be merged with the manifests that VS
457 # The syntax for invoking the _VC_MANIFEST_EMBED_FOO macro is:
458 # $(_VC_MANIFEST_EMBED_???) <additional manifests>
463 _VC_MANIFEST_EMBED_EXE= \
464 ( if exist $@.manifest $(MT) -outputresource:$@;1 -manifest $@.manifest $(APPMANIFEST) )
466 _VC_MANIFEST_EMBED_EXE_NOHEIM= \
467 ( if exist $@.manifest $(MT) -outputresource:$@;1 -manifest $@.manifest )
469 _VC_MANIFEST_EMBED_DLL= \
470 ( if exist $@.manifest $(MT) -outputresource:$@;2 -manifest $@.manifest )
472 _MERGE_MANIFEST_DLL= \
473 ( $(MT) -inputresource:$@;2 -manifest $(APPMANIFEST) -outputresource:$@;2 )
475 _INSERT_APPMANIFEST_DLL= \
476 ( $(MT) -manifest $(APPMANIFEST) -outputresource:$@;2 )
478 # Note that if you are merging manifests, then the VS generated
479 # manifest should be cleaned up after calling _VC_MANIFEST_EMBED_???.
480 # This ensures that even if the DLL or EXE is executed in-place, the
481 # embedded manifest will be used. Otherwise the $@.manifest file will
484 _VC_MANIFEST_CLEAN= \
485 ( if exist $@.manifest $(RM) $@.manifest )
487 # End of manifest handling
489 #----------------------------------------------------------------------
490 # Code and assembly signing
493 # SIGNTOOL is fullpath to signtool.exe from Windows v8.1 or later SDK
494 # (earlier versions do not support SHA-2 signatures)
496 # SIGNTOOL_C is any set of options required for certificate/private
497 # key selection for code signging.
499 # SIGNTOOL_O is any set of additional options to signtool.exe
501 # SIGNTOOL_T is the timestamp option
504 _CODESIGN=( $(CODESIGN) $@ )
505 _CODESIGN_SHA256=( $(CODESIGN_SHA256) $@ )
509 SIGNTOOL=signtool.exe
515 SIGNTOOL_T=http://timestamp.digicert.com
517 !ifndef SIGNTOOL_T_SHA256
518 SIGNTOOL_T_SHA256=http://timestamp.digicert.com
521 _CODESIGN=( $(SIGNTOOL) sign /fd sha1 $(SIGNTOOL_O) /t $(SIGNTOOL_T) $(SIGNTOOL_C) /v $@ )
522 _CODESIGN_SHA256=( $(SIGNTOOL) sign /as /fd sha256 /td sha256 $(SIGNTOOL_O) /tr $(SIGNTOOL_T_SHA256) $(SIGNTOOL_C) /v $@ )
524 _CODESIGN=( echo Skipping code sign )
525 _CODESIGN_SHA256=( echo Skipping sha256 code sign )
530 #----------------------------------------------------------------------
531 # Symbol Store Support
533 # SYMSTORE_EXE is full path to symstore.exe
535 # SYMSTORE_ROOT is full path to root directory of symbol store
537 # SYMSTORE_COMMENT is optional comment to include in symbol store catalog entry
540 !IF DEFINED(SYMSTORE_EXE) && DEFINED(SYMSTORE_ROOT)
541 !IF "$(SYMSTORE_COMMENT)" != ""
542 SYMSTORE_COMMENT = |$(SYMSTORE_COMMENT)
545 $(SYMSTORE_EXE) add /s $(SYMSTORE_ROOT) /t "Heimdal" /v "$(BUILD)-$(CPU)-$(VER_PACKAGE_VERSION)" /c "$(@F)$(SYMSTORE_COMMENT)" /f $*.*
547 SYMSTORE_IMPORT=@echo No symbol store
550 #----------------------------------------------------------------------
551 # Convenience macros for preparing EXEs and DLLs. These are multiline
552 # macros that deal with manifests and code signing. Unless we need to
553 # include custom manifests, these are what we should be using to
557 ( $(_VC_MANIFEST_EMBED_EXE) && $(_VC_MANIFEST_CLEAN) && $(SYMSTORE_IMPORT) && $(_CODESIGN) && $(_CODESIGN_SHA256) ) || ( $(RM) $@ && exit /b 1 )
560 ( $(_VC_MANIFEST_EMBED_EXE_NOHEIM) && $(_VC_MANIFEST_CLEAN) && $(SYMSTORE_IMPORT) && $(_CODESIGN) && $(_CODESIGN_SHA256) ) || ( $(RM) $@ && exit /b 1 )
563 ( $(_VC_MANIFEST_EMBED_EXE_NOHEIM) && $(_VC_MANIFEST_CLEAN) && $(SYMSTORE_IMPORT) ) || ( $(RM) $@ && exit /b 1 )
566 ( $(_VC_MANIFEST_EMBED_DLL) && $(_VC_MANIFEST_CLEAN) && $(SYMSTORE_IMPORT) && $(_CODESIGN) && $(_CODESIGN_SHA256) ) || ( $(RM) $@ && exit /b 1 )
569 ( $(_VC_MANIFEST_EMBED_DLL) && $(_VC_MANIFEST_CLEAN) && $(SYMSTORE_IMPORT) ) || ( $(RM) $@ && exit /b 1 )
572 ( ( $(_MERGE_MANIFEST_DLL) || $(_INSERT_APPMANIFEST_DLL) && $(SYMSTORE_IMPORT) ) && $(_CODESIGN) && $(_CODESIGN_SHA256) ) || ( $(RM) $@ && exit /b 1 )
574 #----------------------------------------------------------------------
575 # Convenience macros for import libraries and assemblies
578 LIBASN1 =$(LIBDIR)\libasn1.lib
579 LIBASN1_S =$(LIBDIR)\libasn1_s.lib
580 LIBCOMERR =$(LIBDIR)\libcom_err.lib
581 LIBEDITLINE =$(LIBDIR)\libeditline.lib
582 LIBGSSAPI =$(LIBDIR)\libgssapi.lib
583 LIBGSS_PREAUTH=$(LIBDIR)\libgss_preauth.lib
584 LIBHCRYPTO =$(LIBDIR)\libhcrypto.lib
585 LIBHDB =$(LIBDIR)\libhdb.lib
586 LIBHEIMBASE =$(LIBDIR)\libheimbase.lib
587 LIBHEIMDAL =$(LIBDIR)\heimdal.lib
588 LIBHEIMIPCC =$(LIBDIR)\libheim-ipcc.lib
589 LIBHEIMIPCS =$(LIBDIR)\libheim-ipcs.lib
590 LIBHEIMNTLM =$(LIBDIR)\libheimntlm.lib
591 LIBHX509 =$(LIBDIR)\libhx509.lib
592 LIBKADM5CLNT=$(LIBDIR)\libkadm5clnt.lib
593 LIBKADM5SRV =$(LIBDIR)\libkadm5srv.lib
594 LIBKDC =$(LIBDIR)\libkdc.lib
595 LIBLTM =$(LIBDIR)\libltm.lib
596 LIBKRB5 =$(LIBDIR)\libkrb5.lib
597 LIBRFC3961 =$(LIBDIR)\librfc3961.lib
598 LIBROKEN =$(LIBDIR)\libroken.lib
599 LIBSL =$(LIBDIR)\libsl.lib
600 LIBSQLITE =$(LIBDIR)\libsqlite.lib
601 LIBVERS =$(LIBDIR)\libvers.lib
602 LIBWIND =$(LIBDIR)\libwind.lib
603 LIBX25519 =$(LIBDIR)\libx25519.lib
608 !ifdef VER_PRERELEASE
618 ASMKRBNAME =Heimdal.Kerberos$(ASM_SPC)$(ASM_PVT)$(ASM_PRE)$(ASM_DBG)
619 APPMANIFEST =$(INCDIR)\Heimdal.Application.$(MCPU).manifest