macro(set_cpp)
- include_directories(BEFORE ${REACTOS_SOURCE_DIR}/include/c++/stlport)
set(IS_CPP 1)
- add_definitions(
- -DNATIVE_CPP_INCLUDE=${REACTOS_SOURCE_DIR}/include/c++
- -DNATIVE_C_INCLUDE=${REACTOS_SOURCE_DIR}/include/crt)
+ if(MSVC)
+ include_directories(${REACTOS_SOURCE_DIR}/include/c++)
+ endif()
endmacro()
function(add_dependency_node _node)
file(APPEND ${REACTOS_BINARY_DIR}/dependencies.graphml " </graph>\n</graphml>\n")
endfunction()
-function(add_message_headers)
+function(add_message_headers _type)
+ if(${_type} STREQUAL UNICODE)
+ set(_flag "-U")
+ else()
+ set(_flag "-A")
+ endif()
foreach(_in_FILE ${ARGN})
get_filename_component(FILE ${_in_FILE} NAME_WE)
- macro_mc(${FILE})
+ macro_mc(${_flag} ${FILE})
add_custom_command(
OUTPUT ${REACTOS_BINARY_DIR}/include/reactos/${FILE}.rc ${REACTOS_BINARY_DIR}/include/reactos/${FILE}.h
- COMMAND ${COMMAND_MC}
+ COMMAND ${COMMAND_MC} ${MC_FLAGS}
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${FILE}.mc)
set_source_files_properties(
${REACTOS_BINARY_DIR}/include/reactos/${FILE}.h ${REACTOS_BINARY_DIR}/include/reactos/${FILE}.rc
endforeach()
endfunction()
+function(add_link)
+ cmake_parse_arguments(_LINK "MINIMIZE" "NAME;PATH;CMD_LINE_ARGS;ICON;GUID" "" ${ARGN})
+ if(NOT _LINK_NAME OR NOT _LINK_PATH)
+ message(FATAL_ERROR "You must provide name and path")
+ endif()
+
+ if(_LINK_CMD_LINE_ARGS)
+ set(_LINK_CMD_LINE_ARGS -c ${_LINK_CMD_LINE_ARGS})
+ endif()
+
+ if(_LINK_ICON)
+ set(_LINK_ICON -i ${_LINK_ICON})
+ endif()
+
+ if(_LINK_GUID)
+ set(_LINK_GUID -g ${_LINK_GUID})
+ endif()
+
+ if(_LINK_MINIMIZE)
+ set(_LINK_MINIMIZE "-m")
+ endif()
+
+ add_custom_command(
+ OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${_LINK_NAME}.lnk
+ COMMAND native-mkshelllink -o ${CMAKE_CURRENT_BINARY_DIR}/${_LINK_NAME}.lnk ${_LINK_CMD_LINE_ARGS} ${_LINK_ICON} ${_LINK_GUID} ${_LINK_MINIMIZE} ${_LINK_PATH}
+ DEPENDS native-mkshelllink)
+ set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/${_LINK_NAME}.lnk PROPERTIES GENERATED TRUE)
+endfunction()
+
macro(dir_to_num dir var)
if(${dir} STREQUAL reactos/system32)
set(${var} 1)
set(${var} 6)
elseif(${dir} STREQUAL reactos/bin)
set(${var} 7)
- elseif(${dir} STREQUAL reactos/media)
+ elseif(${dir} STREQUAL reactos/bin/data)
set(${var} 8)
+ elseif(${dir} STREQUAL reactos/media)
+ set(${var} 9)
+ elseif(${dir} STREQUAL reactos/Microsoft.NET)
+ set(${var} 10)
+ elseif(${dir} STREQUAL reactos/Microsoft.NET/Framework)
+ set(${var} 11)
+ elseif(${dir} STREQUAL reactos/Microsoft.NET/Framework/v1.0.3705)
+ set(${var} 12)
+ elseif(${dir} STREQUAL reactos/Microsoft.NET/Framework/v1.1.4322)
+ set(${var} 13)
+ elseif(${dir} STREQUAL reactos/Microsoft.NET/Framework/v2.0.50727)
+ set(${var} 14)
else()
message(ERROR "Wrong destination: ${dir}")
endif()
else()
#add it in reactos.cab
dir_to_num(${_CD_DESTINATION} _num)
- if(CMAKE_HOST_SYSTEM_NAME MATCHES Windows)
- file(APPEND ${REACTOS_BINARY_DIR}/boot/bootdata/packages/reactos.dff.dyn "${_CD_FILE} ${_num}\n")
- else()
- file(APPEND ${REACTOS_BINARY_DIR}/boot/bootdata/packages/reactos.dff.dyn "\"${_CD_FILE}\" ${_num}\n")
- endif()
+ file(RELATIVE_PATH __relative_file ${REACTOS_SOURCE_DIR} ${_CD_FILE})
+ file(APPEND ${REACTOS_BINARY_DIR}/boot/bootdata/packages/reactos.dff.dyn "\"${__relative_file}\" ${_num}\n")
+ unset(__relative_file)
if(_CD_TARGET)
#manage dependency
add_dependencies(reactos_cab ${_CD_TARGET})
endfunction()
# Create module_clean targets
-function(add_clean_target target)
- if(CMAKE_GENERATOR MATCHES "Unix Makefiles" OR CMAKE_GENERATOR MATCHES "MinGW Makefiles")
- set(CLEAN_COMMAND make clean)
- elseif(CMAKE_GENERATOR MATCHES "NMake Makefiles")
- set(CLEAN_COMMAND nmake /nologo clean)
+function(add_clean_target _target)
+ set(_clean_working_directory ${CMAKE_CURRENT_BINARY_DIR})
+ if(CMAKE_GENERATOR STREQUAL "Unix Makefiles" OR CMAKE_GENERATOR STREQUAL "MinGW Makefiles")
+ set(_clean_command make clean)
+ elseif(CMAKE_GENERATOR STREQUAL "NMake Makefiles")
+ set(_clean_command nmake /nologo clean)
+ elseif(CMAKE_GENERATOR STREQUAL "Ninja")
+ set(_clean_command ninja -t clean ${_target})
+ set(_clean_working_directory ${REACTOS_BINARY_DIR})
endif()
- add_custom_target(${target}_clean
- COMMAND ${CLEAN_COMMAND}
- WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
- COMMENT "Cleaning ${target}")
+ add_custom_target(${_target}_clean
+ COMMAND ${_clean_command}
+ WORKING_DIRECTORY ${_clean_working_directory}
+ COMMENT "Cleaning ${_target}")
endfunction()
if(NOT MSVC_IDE)
endfunction()
endif()
-if(CMAKE_HOST_SYSTEM_NAME MATCHES Windows)
+if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
macro(to_win_path _cmake_path _native_path)
string(REPLACE "/" "\\" ${_native_path} "${_cmake_path}")
endmacro()
- function(concatenate_files _file1 _file2 _output)
+ # yeah the parameter mess sucks, but thats what works...
+ function(concatenate_files _file1 _target2 _output)
+ get_target_property(_file2 ${_target2} LOCATION)
to_win_path("${_file1}" _real_file1)
to_win_path("${_file2}" _real_file2)
to_win_path("${_output}" _real_output)
OUTPUT ${_output}
COMMAND cmd.exe /C "copy /Y /B ${_real_file1} + ${_real_file2} ${_real_output} > nul"
DEPENDS ${_file1}
- DEPENDS ${_file2})
+ DEPENDS ${_target2})
endfunction()
else()
- macro(concatenate_files _file1 _file2 _output)
+ macro(concatenate_files _file1 _target2 _output)
+ get_target_property(_file2 ${_target2} LOCATION)
add_custom_command(
OUTPUT ${_output}
COMMAND cat ${_file1} ${_file2} > ${_output}
DEPENDS ${_file1}
- DEPENDS ${_file2})
+ DEPENDS ${_target2})
endmacro()
endif()
function(add_importlibs _module)
add_dependency_node(${_module})
foreach(LIB ${ARGN})
- if ("${LIB}" MATCHES "msvcrt")
+ if("${LIB}" MATCHES "msvcrt")
add_target_compile_definitions(${_module} _DLL __USE_CRTIMP)
target_link_libraries(${_module} msvcrtex)
endif()
- target_link_libraries(${_module} ${CMAKE_BINARY_DIR}/importlibs/lib${LIB}${CMAKE_STATIC_LIBRARY_SUFFIX})
+ target_link_libraries(${_module} lib${LIB})
add_dependencies(${_module} lib${LIB})
add_dependency_edge(${_module} ${LIB})
endforeach()
function(set_module_type MODULE TYPE)
cmake_parse_arguments(__module "UNICODE" "IMAGEBASE" "ENTRYPOINT" ${ARGN})
-
+
if(__module_UNPARSED_ARGUMENTS)
message(STATUS "set_module_type : unparsed arguments ${__module_UNPARSED_ARGUMENTS}, module : ${MODULE}")
endif()
set(__subsystem console)
elseif(${TYPE} STREQUAL win32gui)
set(__subsystem windows)
- elseif(NOT ((${TYPE} STREQUAL win32dll) OR (${TYPE} STREQUAL win32ocx) OR (${TYPE} STREQUAL cpl)))
+ elseif(NOT ((${TYPE} STREQUAL win32dll) OR (${TYPE} STREQUAL win32ocx)
+ OR (${TYPE} STREQUAL cpl) OR (${TYPE} STREQUAL module)))
message(FATAL_ERROR "Unknown type ${TYPE} for module ${MODULE}")
endif()
-
+
if(DEFINED __subsystem)
set_subsystem(${MODULE} ${__subsystem})
endif()
-
+
#set unicode definitions
if(__module_UNICODE)
add_target_compile_definitions(${MODULE} UNICODE _UNICODE)
endif()
-
+
# set entry point
if(__module_ENTRYPOINT OR (__module_ENTRYPOINT STREQUAL "0"))
list(GET __module_ENTRYPOINT 0 __entrypoint)
elseif(${TYPE} STREQUAL nativedll)
set(__entrypoint DllMain)
set(__entrystack 12)
+ elseif(${TYPE} STREQUAL module)
+ set(__entrypoint 0)
endif()
-
+
if(DEFINED __entrypoint)
if(DEFINED __entrystack)
set_entrypoint(${MODULE} ${__entrypoint} ${__entrystack})
set_entrypoint(${MODULE} ${__entrypoint})
endif()
endif()
-
+
#set base address
if(__module_IMAGEBASE)
set_image_base(${MODULE} __module_IMAGEBASE)
elseif(${TYPE} STREQUAL kernelmodedriver)
set_image_base(${MODULE} 0x00010000)
endif()
-
- # Now do some stuff which is specific to each type
+
+ # Now do some stuff which is specific to each type
if(${TYPE} STREQUAL kernelmodedriver)
add_dependencies(${MODULE} bugcodes)
set_target_properties(${MODULE} PROPERTIES SUFFIX ".sys")
endif()
-
+
if(${TYPE} STREQUAL win32ocx)
set_target_properties(${MODULE} PROPERTIES SUFFIX ".ocx")
endif()
-
+
if(${TYPE} STREQUAL cpl)
set_target_properties(${MODULE} PROPERTIES SUFFIX ".cpl")
endif()
-
+
# do compiler specific stuff
set_module_type_toolchain(${MODULE} ${TYPE})
endfunction()
+
+function(preprocess_file __in __out)
+ set(__arg ${__in})
+ foreach(__def in ${ARGN})
+ list(APPEND __arg -D${__def})
+ endforeach()
+ if(MSVC)
+ add_custom_command(OUTPUT ${_out}
+ COMMAND ${CMAKE_C_COMPILER} /EP ${__arg}
+ DEPENDS ${__in})
+ else()
+ add_custom_command(OUTPUT ${_out}
+ COMMAND ${CMAKE_C_COMPILER} -E ${__arg}
+ DEPENDS ${__in})
+ endif()
+endfunction()
+
+function(get_includes OUTPUT_VAR)
+ get_directory_property(_includes INCLUDE_DIRECTORIES)
+ foreach(arg ${_includes})
+ list(APPEND __tmp_var -I${arg})
+ endforeach()
+ set(${OUTPUT_VAR} ${__tmp_var} PARENT_SCOPE)
+endfunction()
+
+function(get_defines OUTPUT_VAR)
+ get_directory_property(_defines COMPILE_DEFINITIONS)
+ foreach(arg ${_defines})
+ list(APPEND __tmp_var -D${arg})
+ endforeach()
+ set(${OUTPUT_VAR} ${__tmp_var} PARENT_SCOPE)
+endfunction()