2011-05-16 13:12:07 +00:00
2012-08-27 18:58:27 +00:00
#if(${CMAKE_BUILD_TYPE} STREQUAL "Debug")
if ( CMAKE_BUILD_TYPE STREQUAL "Debug" )
2011-10-04 14:20:25 +00:00
# no optimization
2011-05-16 13:12:07 +00:00
elseif ( OPTIMIZE STREQUAL "1" )
add_definitions ( /O1 )
elseif ( OPTIMIZE STREQUAL "2" )
add_definitions ( /O2 )
elseif ( OPTIMIZE STREQUAL "3" )
add_definitions ( /Ot /Ox /GS- )
elseif ( OPTIMIZE STREQUAL "4" )
add_definitions ( /Os /Ox /GS- )
elseif ( OPTIMIZE STREQUAL "5" )
add_definitions ( /GF /Gy /Ob2 /Os /Ox /GS- )
endif ( )
2012-08-27 18:58:27 +00:00
if ( ARCH STREQUAL "i386" )
2011-06-22 11:31:01 +00:00
add_definitions ( /DWIN32 /D_WINDOWS )
endif ( )
add_definitions ( /Dinline=__inline /D__STDC__=1 )
2011-05-16 13:12:07 +00:00
2011-09-03 14:57:27 +00:00
add_compile_flags ( "/X /GR- /GS- /Zl /W3" )
2011-06-22 13:17:37 +00:00
2012-07-08 19:59:33 +00:00
# HACK: for VS 11+ we need to explicitly disable SSE, which is off by
# default for older compilers. See bug #7174
2012-08-27 18:58:27 +00:00
if ( MSVC_VERSION GREATER 1699 AND ARCH STREQUAL "i386" )
2012-07-08 19:59:33 +00:00
add_compile_flags ( "/arch:IA32" )
endif ( )
2012-02-23 13:06:11 +00:00
# C4700 is almost always likely to result in broken code, so mark it as an error
add_compile_flags ( "/we4700" )
2012-01-14 17:27:17 +00:00
# Debugging
2012-08-27 18:58:27 +00:00
#if(${CMAKE_BUILD_TYPE} STREQUAL "Debug")
if ( CMAKE_BUILD_TYPE STREQUAL "Debug" )
2012-05-10 10:39:16 +00:00
if ( NOT ( _PREFAST_ OR _VS_ANALYZE_ ) )
2012-01-14 17:27:17 +00:00
add_compile_flags ( "/Zi" )
endif ( )
add_compile_flags ( "/Ob0 /Od" )
2012-08-27 18:58:27 +00:00
#elseif(${CMAKE_BUILD_TYPE} STREQUAL "Release")
elseif ( CMAKE_BUILD_TYPE STREQUAL "Release" )
2012-01-14 17:27:17 +00:00
add_compile_flags ( "/Ob2 /D NDEBUG" )
endif ( )
2011-05-16 13:12:07 +00:00
if ( ${ _MACHINE_ARCH_FLAG } MATCHES X86 )
2011-10-04 14:20:25 +00:00
set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SAFESEH:NO /NODEFAULTLIB /RELEASE" )
set ( CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /SAFESEH:NO /NODEFAULTLIB /RELEASE" )
set ( CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} /SAFESEH:NO /NODEFAULTLIB /RELEASE" )
2011-05-16 13:12:07 +00:00
endif ( )
2012-03-10 19:20:27 +00:00
set ( CMAKE_RC_COMPILE_OBJECT "<CMAKE_RC_COMPILER> <FLAGS> <DEFINES> ${I18N_DEFS} /fo<OBJECT> <SOURCE>" )
2011-06-11 16:09:57 +00:00
2011-06-14 15:28:16 +00:00
if ( MSVC_IDE )
# Asm source files are not supported in VS generators yet. As a result, <DEFINES> isn't recognized.
# We may temporarily use just the global defines, but this is not a solution as some modules (minihal for example) apply additional definitions to source files, so we get an incorrect build of such targets.
get_directory_property ( definitions DEFINITIONS )
set ( CMAKE_ASM_COMPILE_OBJECT
2012-08-24 16:21:33 +00:00
" c l / n o l o g o / X / I $ { R E A C T O S _ S O U R C E _ D I R } / i n c l u d e / a s m / I $ { R E A C T O S _ B I N A R Y _ D I R } / i n c l u d e / a s m < F L A G S > $ { d e f i n i t i o n s } / D _ _ A S M _ _ / D _ U S E _ M L / E P / c < S O U R C E > > < O B J E C T > . t m p "
2011-06-14 15:28:16 +00:00
" < C M A K E _ A S M _ C O M P I L E R > / n o l o g o / C p / F o < O B J E C T > / c / T a < O B J E C T > . t m p " )
else ( )
# NMake Makefiles
set ( CMAKE_ASM_COMPILE_OBJECT
2012-08-24 16:21:33 +00:00
" c l / n o l o g o / X / I $ { R E A C T O S _ S O U R C E _ D I R } / i n c l u d e / a s m / I $ { R E A C T O S _ B I N A R Y _ D I R } / i n c l u d e / a s m < F L A G S > < D E F I N E S > / D _ _ A S M _ _ / D _ U S E _ M L / E P / c < S O U R C E > > < O B J E C T > . t m p "
2011-06-14 15:28:16 +00:00
" < C M A K E _ A S M _ C O M P I L E R > / n o l o g o / C p / F o < O B J E C T > / c / T a < O B J E C T > . t m p " )
endif ( )
2011-06-11 16:09:57 +00:00
2012-05-10 10:39:16 +00:00
if ( _VS_ANALYZE_ )
message ( "VS static analysis enabled!" )
add_compile_flags ( "/analyze" )
elseif ( _PREFAST_ )
message ( "PREFAST enabled!" )
2012-08-24 15:36:17 +00:00
set ( CMAKE_C_COMPILE_OBJECT "prefast <CMAKE_C_COMPILER> ${CMAKE_START_TEMP_FILE} ${CMAKE_CL_NOLOGO} <FLAGS> <DEFINES> /Fo<OBJECT> -c <SOURCE>${CMAKE_END_TEMP_FILE}"
2012-01-07 21:50:10 +00:00
" p r e f a s t L I S T " )
2012-08-24 15:36:17 +00:00
set ( CMAKE_CXX_COMPILE_OBJECT "prefast <CMAKE_CXX_COMPILER> ${CMAKE_START_TEMP_FILE} ${CMAKE_CL_NOLOGO} <FLAGS> <DEFINES> /TP /Fo<OBJECT> -c <SOURCE>${CMAKE_END_TEMP_FILE}"
2012-01-07 21:50:10 +00:00
" p r e f a s t L I S T " )
2012-05-10 10:39:16 +00:00
set ( CMAKE_C_LINK_EXECUTABLE
2012-08-24 15:36:17 +00:00
" < C M A K E _ C _ C O M P I L E R > $ { C M A K E _ C L _ N O L O G O } < O B J E C T S > $ { C M A K E _ S T A R T _ T E M P _ F I L E } < F L A G S > / F e < T A R G E T > - l i n k / i m p l i b : < T A R G E T _ I M P L I B > / v e r s i o n : < T A R G E T _ V E R S I O N _ M A J O R > . < T A R G E T _ V E R S I O N _ M I N O R > < C M A K E _ C _ L I N K _ F L A G S > < L I N K _ F L A G S > < L I N K _ L I B R A R I E S > $ { C M A K E _ E N D _ T E M P _ F I L E } " )
2012-05-10 10:39:16 +00:00
set ( CMAKE_CXX_LINK_EXECUTABLE
2012-08-24 15:36:17 +00:00
" < C M A K E _ C X X _ C O M P I L E R > $ { C M A K E _ C L _ N O L O G O } < O B J E C T S > $ { C M A K E _ S T A R T _ T E M P _ F I L E } < F L A G S > / F e < T A R G E T > - l i n k / i m p l i b : < T A R G E T _ I M P L I B > / v e r s i o n : < T A R G E T _ V E R S I O N _ M A J O R > . < T A R G E T _ V E R S I O N _ M I N O R > < C M A K E _ C X X _ L I N K _ F L A G S > < L I N K _ F L A G S > < L I N K _ L I B R A R I E S > $ { C M A K E _ E N D _ T E M P _ F I L E } " )
2012-01-05 17:19:15 +00:00
endif ( )
2011-05-16 13:12:07 +00:00
set ( CMAKE_RC_CREATE_SHARED_LIBRARY ${ CMAKE_C_CREATE_SHARED_LIBRARY } )
set ( CMAKE_ASM_CREATE_SHARED_LIBRARY ${ CMAKE_C_CREATE_SHARED_LIBRARY } )
2011-06-11 16:09:57 +00:00
set ( CMAKE_ASM_CREATE_STATIC_LIBRARY ${ CMAKE_C_CREATE_STATIC_LIBRARY } )
2011-05-16 13:12:07 +00:00
2011-06-05 14:51:31 +00:00
macro ( add_pch _target_name _FILE )
2011-05-16 13:12:07 +00:00
endmacro ( )
2011-08-20 12:29:51 +00:00
function ( set_entrypoint _module _entrypoint )
if ( ${ _entrypoint } STREQUAL "0" )
2011-09-03 14:57:27 +00:00
add_target_link_flags ( ${ _module } "/NOENTRY" )
2012-08-27 18:58:27 +00:00
elseif ( ARCH STREQUAL "i386" )
2011-08-20 12:29:51 +00:00
set ( _entrysymbol ${ _entrypoint } )
2011-10-02 18:59:33 +00:00
if ( ${ ARGC } GREATER 2 )
2011-08-20 12:29:51 +00:00
set ( _entrysymbol ${ _entrysymbol } @ ${ ARGV2 } )
endif ( )
2011-09-03 14:57:27 +00:00
add_target_link_flags ( ${ _module } "/ENTRY:${_entrysymbol}" )
2011-05-16 13:12:07 +00:00
else ( )
2011-09-03 14:57:27 +00:00
add_target_link_flags ( ${ _module } "/ENTRY:${_entrypoint}" )
2011-05-16 13:12:07 +00:00
endif ( )
2011-08-08 11:54:20 +00:00
endfunction ( )
2011-05-16 13:12:07 +00:00
2011-08-08 11:54:20 +00:00
function ( set_subsystem MODULE SUBSYSTEM )
2011-09-03 14:57:27 +00:00
add_target_link_flags ( ${ MODULE } "/subsystem:${SUBSYSTEM}" )
2011-08-08 11:54:20 +00:00
endfunction ( )
2011-05-16 13:12:07 +00:00
2011-08-08 11:54:20 +00:00
function ( set_image_base MODULE IMAGE_BASE )
2011-09-03 14:57:27 +00:00
add_target_link_flags ( ${ MODULE } "/BASE:${IMAGE_BASE}" )
2011-08-08 11:54:20 +00:00
endfunction ( )
2011-05-16 13:12:07 +00:00
2011-09-03 17:48:57 +00:00
function ( set_module_type_toolchain MODULE TYPE )
2012-08-27 18:58:27 +00:00
if ( ( ${ TYPE } STREQUAL "win32dll" ) OR ( ${ TYPE } STREQUAL "win32ocx" ) OR ( ${ TYPE } STREQUAL "cpl" ) )
2011-09-03 14:57:27 +00:00
add_target_link_flags ( ${ MODULE } "/DLL" )
2012-08-27 18:58:27 +00:00
elseif ( ${ TYPE } STREQUAL "kernelmodedriver" )
2011-09-03 14:57:27 +00:00
add_target_link_flags ( ${ MODULE } "/DRIVER" )
2011-05-16 13:12:07 +00:00
endif ( )
2011-08-08 11:54:20 +00:00
endfunction ( )
2011-05-16 13:12:07 +00:00
2011-08-08 11:54:20 +00:00
function ( set_rc_compiler )
endfunction ( )
2011-05-16 13:12:07 +00:00
2012-02-21 14:32:05 +00:00
#define those for having real libraries
set ( CMAKE_IMPLIB_CREATE_STATIC_LIBRARY "LINK /LIB /NOLOGO <LINK_FLAGS> /OUT:<TARGET> <OBJECTS>" )
2012-02-21 15:52:30 +00:00
set ( CMAKE_STUB_ASM_COMPILE_OBJECT "<CMAKE_ASM_COMPILER> /Cp /Fo<OBJECT> /c /Ta <SOURCE>" )
2011-06-10 20:44:47 +00:00
macro ( add_delay_importlibs MODULE )
2011-08-11 13:39:06 +00:00
foreach ( LIB ${ ARGN } )
2011-09-03 14:57:27 +00:00
add_target_link_flags ( ${ MODULE } "/DELAYLOAD:${LIB}.dll" )
2012-02-21 14:32:05 +00:00
target_link_libraries ( ${ MODULE } lib ${ LIB } )
2011-08-11 13:39:06 +00:00
endforeach ( )
target_link_libraries ( ${ MODULE } delayimp )
2011-06-10 20:44:47 +00:00
endmacro ( )
2012-04-29 19:04:02 +00:00
function ( generate_import_lib _libname _dllname _spec_file )
2012-08-06 20:29:38 +00:00
set ( _def_file ${ CMAKE_CURRENT_BINARY_DIR } / ${ _libname } _exp.def )
set ( _asm_stubs_file ${ CMAKE_CURRENT_BINARY_DIR } / ${ _libname } _stubs.asm )
2012-04-29 19:04:02 +00:00
# Generate the asm stub file and the def file for import library
add_custom_command (
2012-08-06 20:29:38 +00:00
O U T P U T $ { _ a s m _ s t u b s _ f i l e } $ { _ d e f _ f i l e }
C O M M A N D n a t i v e - s p e c 2 d e f - - m s - - k i l l - a t - a = $ { S P E C 2 D E F _ A R C H } - - i m p l i b - n = $ { _ d l l n a m e } - d = $ { _ d e f _ f i l e } - l = $ { _ a s m _ s t u b s _ f i l e } $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / $ { _ s p e c _ f i l e }
2012-04-29 19:04:02 +00:00
D E P E N D S $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / $ { _ s p e c _ f i l e } n a t i v e - s p e c 2 d e f )
2012-08-06 20:29:38 +00:00
if ( MSVC_IDE )
# Compile the generated asm stub file
add_custom_command (
O U T P U T $ { _ a s m _ s t u b s _ f i l e } . o b j
2012-08-24 15:36:17 +00:00
C O M M A N D $ { C M A K E _ A S M _ C O M P I L E R } / C p / F o $ { _ a s m _ s t u b s _ f i l e } . o b j / c / T a $ { _ a s m _ s t u b s _ f i l e }
2012-08-06 20:29:38 +00:00
D E P E N D S $ { _ a s m _ s t u b s _ f i l e } )
else ( )
# be clear about the "language"
# Thanks MS for creating a stupid linker
set_source_files_properties ( ${ _asm_stubs_file } PROPERTIES LANGUAGE "STUB_ASM" )
endif ( )
2012-04-29 19:04:02 +00:00
# add our library
2012-08-06 20:29:38 +00:00
if ( MSVC_IDE )
add_library ( ${ _libname } STATIC EXCLUDE_FROM_ALL ${ _asm_stubs_file } .obj )
set_source_files_properties ( ${ _asm_stubs_file } .obj PROPERTIES EXTERNAL_OBJECT 1 )
set_target_properties ( ${ _libname } PROPERTIES LINKER_LANGUAGE "C" )
else ( )
# NOTE: as stub file and def file are generated in one pass, depending on one is like depending on the other
add_library ( ${ _libname } STATIC EXCLUDE_FROM_ALL ${ _asm_stubs_file } )
add_dependencies ( ${ _libname } ${ _def_file } )
# set correct "link rule"
set_target_properties ( ${ _libname } PROPERTIES LINKER_LANGUAGE "IMPLIB" )
endif ( )
set_target_properties ( ${ _libname } PROPERTIES STATIC_LIBRARY_FLAGS "/DEF:${_def_file}" )
2012-04-29 19:04:02 +00:00
endfunction ( )
2012-08-27 18:58:27 +00:00
if ( ARCH STREQUAL "amd64" )
2012-03-07 21:21:27 +00:00
add_definitions ( /D__x86_64 )
set ( SPEC2DEF_ARCH x86_64 )
else ( )
set ( SPEC2DEF_ARCH i386 )
endif ( )
2011-08-08 11:54:20 +00:00
function ( spec2def _dllname _spec_file )
2012-03-07 21:21:27 +00:00
# do we also want to add impotlib targets?
2011-08-15 15:36:25 +00:00
if ( ${ ARGC } GREATER 2 )
2012-03-07 21:21:27 +00:00
if ( ${ ARGN } STREQUAL "ADD_IMPORTLIB" )
set ( __add_importlib TRUE )
else ( )
message ( FATAL_ERROR "Wrong argument passed to spec2def, ${ARGN}" )
endif ( )
endif ( )
2012-04-20 12:39:00 +00:00
2012-03-07 21:21:27 +00:00
# get library basename
get_filename_component ( _file ${ _dllname } NAME_WE )
2012-04-20 12:39:00 +00:00
2012-03-07 21:21:27 +00:00
# error out on anything else than spec
if ( NOT ${ _spec_file } MATCHES ".*\\.spec" )
message ( FATAL_ERROR "spec2def only takes spec files as input." )
2011-08-15 15:36:25 +00:00
endif ( )
2012-04-20 12:39:00 +00:00
2012-03-07 21:21:27 +00:00
#generate def for the DLL and C stubs file
2011-05-16 13:12:07 +00:00
add_custom_command (
O U T P U T $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / $ { _ f i l e } . d e f $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / $ { _ f i l e } _ s t u b s . c
2011-06-06 09:58:58 +00:00
C O M M A N D n a t i v e - s p e c 2 d e f - - m s - - k i l l - a t - a = $ { S P E C 2 D E F _ A R C H } - n = $ { _ d l l n a m e } - d = $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / $ { _ f i l e } . d e f - s = $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / $ { _ f i l e } _ s t u b s . c $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / $ { _ s p e c _ f i l e }
2011-08-05 20:40:40 +00:00
D E P E N D S $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / $ { _ s p e c _ f i l e } n a t i v e - s p e c 2 d e f )
2012-03-31 21:52:09 +00:00
2012-04-29 19:04:02 +00:00
if ( __add_importlib )
generate_import_lib ( lib ${ _file } ${ _dllname } ${ _spec_file } )
2012-03-07 21:21:27 +00:00
endif ( )
2011-08-08 11:54:20 +00:00
endfunction ( )
2011-05-16 13:12:07 +00:00
2011-10-03 19:09:26 +00:00
macro ( macro_mc FLAG FILE )
2012-08-24 15:36:17 +00:00
set ( COMMAND_MC ${ CMAKE_MC_COMPILER } ${ FLAG } -r ${ REACTOS_BINARY_DIR } /include/reactos -h ${ REACTOS_BINARY_DIR } /include/reactos ${ CMAKE_CURRENT_SOURCE_DIR } / ${ FILE } .mc )
2011-05-16 13:12:07 +00:00
endmacro ( )
#pseh workaround
set ( PSEH_LIB "pseh" )
2011-06-07 23:22:38 +00:00
2012-08-24 15:36:17 +00:00
# Use a full path for the x86 version of ml when using x64 VS.
# It's not a problem when using the DDK/WDK because, in x64 mode,
# both the x86 and x64 versions of ml are available.
2012-08-27 18:58:27 +00:00
if ( ( ARCH STREQUAL "amd64" ) AND ( DEFINED ENV{VCINSTALLDIR} ) )
2011-08-26 17:33:33 +00:00
set ( CMAKE_ASM16_COMPILER $ENV{ VCINSTALLDIR } /bin/ml.exe )
else ( )
set ( CMAKE_ASM16_COMPILER ml.exe )
endif ( )
2012-04-20 12:39:00 +00:00
function ( CreateBootSectorTarget _target_name _asm_file _binary_file _base_address )
2011-06-07 23:22:38 +00:00
set ( _object_file ${ _binary_file } .obj )
set ( _temp_file ${ _binary_file } .tmp )
add_custom_command (
O U T P U T $ { _ t e m p _ f i l e }
2012-08-24 15:36:17 +00:00
C O M M A N D $ { C M A K E _ C _ C O M P I L E R } / n o l o g o / X / I $ { R E A C T O S _ S O U R C E _ D I R } / i n c l u d e / a s m / I $ { R E A C T O S _ B I N A R Y _ D I R } / i n c l u d e / a s m / D _ _ A S M _ _ / D _ U S E _ M L / E P / c $ { _ a s m _ f i l e } > $ { _ t e m p _ f i l e }
2011-06-07 23:22:38 +00:00
D E P E N D S $ { _ a s m _ f i l e } )
add_custom_command (
O U T P U T $ { _ o b j e c t _ f i l e }
2011-08-26 17:33:33 +00:00
C O M M A N D $ { C M A K E _ A S M 1 6 _ C O M P I L E R } / n o l o g o / C p / F o $ { _ o b j e c t _ f i l e } / c / T a $ { _ t e m p _ f i l e }
2011-06-07 23:22:38 +00:00
D E P E N D S $ { _ t e m p _ f i l e } )
add_custom_command (
O U T P U T $ { _ b i n a r y _ f i l e }
C O M M A N D n a t i v e - o b j 2 b i n $ { _ o b j e c t _ f i l e } $ { _ b i n a r y _ f i l e } $ { _ b a s e _ a d d r e s s }
2011-08-05 20:40:40 +00:00
D E P E N D S $ { _ o b j e c t _ f i l e } n a t i v e - o b j 2 b i n )
2011-06-07 23:22:38 +00:00
set_source_files_properties ( ${ _object_file } ${ _temp_file } ${ _binary_file } PROPERTIES GENERATED TRUE )
add_custom_target ( ${ _target_name } ALL DEPENDS ${ _binary_file } )
2011-08-08 11:54:20 +00:00
endfunction ( )
2011-09-11 00:44:13 +00:00
function ( allow_warnings __module )
endfunction ( )