Author: hbelusca
Date: Sun Mar 29 14:51:14 2015
New Revision: 66963

URL: http://svn.reactos.org/svn/reactos?rev=66963&view=rev
Log:
[NTVDM]: Introduce the possibility to compile multiple x86-16bit ASM files by 
using the trick of concatenating them in correct order so that the resulting 
file is a compilable ASM file. (We cannot do linking or 16-bit objects, so we 
need to take a middle approach).
CORE-9442 #resolve

Added:
    trunk/reactos/subsystems/mvdm/asm16.cmake   (with props)
Modified:
    trunk/reactos/subsystems/mvdm/CMakeLists.txt

Modified: trunk/reactos/subsystems/mvdm/CMakeLists.txt
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/mvdm/CMakeLists.txt?rev=66963&r1=66962&r2=66963&view=diff
==============================================================================
--- trunk/reactos/subsystems/mvdm/CMakeLists.txt        [iso-8859-1] (original)
+++ trunk/reactos/subsystems/mvdm/CMakeLists.txt        [iso-8859-1] Sun Mar 29 
14:51:14 2015
@@ -1,3 +1,6 @@
+
+## Experimental 16-bit ASM compilation support
+include(asm16.cmake)
 
 add_subdirectory(config)
 #add_subdirectory(dos)

Added: trunk/reactos/subsystems/mvdm/asm16.cmake
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/mvdm/asm16.cmake?rev=66963
==============================================================================
--- trunk/reactos/subsystems/mvdm/asm16.cmake   (added)
+++ trunk/reactos/subsystems/mvdm/asm16.cmake   [iso-8859-1] Sun Mar 29 
14:51:14 2015
@@ -0,0 +1,121 @@
+## EXPERIMENTAL!!
+
+# We need to use almost the same tricks as the ones used for MSVC 
'add_asm_files'
+# support because we are going to compile ASM files for a fixed target (16-bit 
x86)
+# that is different from the main target.
+
+if(NOT MSVC)
+###
+### For GCC
+###
+function(add_asm16_bin _target _binary_file _base_address)
+    set(_concatenated_asm_file ${CMAKE_CURRENT_BINARY_DIR}/${_target}.asm)
+    set(_object_file ${CMAKE_CURRENT_BINARY_DIR}/${_target}.o)
+
+    # unset(_source_file_list)
+
+    get_defines(_directory_defines)
+    get_includes(_directory_includes)
+    get_directory_property(_defines COMPILE_DEFINITIONS)
+
+    # Build a list of all the defines needed.
+    foreach(_source_file ${ARGN})
+        get_filename_component(_source_file_full_path ${_source_file} ABSOLUTE)
+        get_source_file_property(_defines_semicolon_list 
${_source_file_full_path} COMPILE_DEFINITIONS)
+
+        # unset(_source_file_defines)
+
+        foreach(_define ${_defines_semicolon_list})
+            if(NOT ${_define} STREQUAL "NOTFOUND")
+                list(APPEND _source_file_defines -D${_define})
+            endif()
+        endforeach()
+
+        list(APPEND _source_file_list ${_source_file_full_path})
+    endforeach()
+
+    # We do not support 16-bit ASM linking so the only way to compile
+    # many ASM files is by concatenating them into a single one and
+    # compile the resulting file.
+    concatenate_files(${_concatenated_asm_file} ${_source_file_list})
+
+    ##
+    ## All this part is the same as CreateBootSectorTarget
+    ##
+    add_custom_command(
+        OUTPUT ${_object_file}
+        COMMAND ${CMAKE_ASM_COMPILER} -x assembler-with-cpp -o ${_object_file} 
-I${REACTOS_SOURCE_DIR}/include/asm -I${REACTOS_BINARY_DIR}/include/asm 
${_directory_includes} ${_source_file_defines} ${_directory_defines} -D__ASM__ 
-c ${_concatenated_asm_file}
+        DEPENDS ${_concatenated_asm_file})
+
+    add_custom_command(
+        OUTPUT ${_binary_file}
+        COMMAND native-obj2bin ${_object_file} ${_binary_file} ${_base_address}
+        # COMMAND objcopy --output-target binary --image-base 
0x${_base_address} ${_object_file} ${_binary_file}
+        DEPENDS ${_object_file} native-obj2bin)
+
+    set_source_files_properties(${_object_file} ${_binary_file} PROPERTIES 
GENERATED TRUE)
+
+    add_custom_target(${_target} ALL DEPENDS ${_binary_file})
+endfunction()
+
+else()
+###
+### For MSVC
+###
+function(add_asm16_bin _target _binary_file _base_address)
+    set(_concatenated_asm_file ${CMAKE_CURRENT_BINARY_DIR}/${_target}.asm)
+    set(_preprocessed_asm_file ${CMAKE_CURRENT_BINARY_DIR}/${_target}.tmp)
+    set(_object_file ${CMAKE_CURRENT_BINARY_DIR}/${_target}.obj)
+
+    # unset(_source_file_list)
+
+    get_defines(_directory_defines)
+    get_includes(_directory_includes)
+    get_directory_property(_defines COMPILE_DEFINITIONS)
+
+    # Build a list of all the defines needed.
+    foreach(_source_file ${ARGN})
+        get_filename_component(_source_file_full_path ${_source_file} ABSOLUTE)
+        get_source_file_property(_defines_semicolon_list 
${_source_file_full_path} COMPILE_DEFINITIONS)
+
+        # unset(_source_file_defines)
+
+        foreach(_define ${_defines_semicolon_list})
+            if(NOT ${_define} STREQUAL "NOTFOUND")
+                list(APPEND _source_file_defines -D${_define})
+            endif()
+        endforeach()
+
+        list(APPEND _source_file_list ${_source_file_full_path})
+    endforeach()
+
+    # We do not support 16-bit ASM linking so the only way to compile
+    # many ASM files is by concatenating them into a single one and
+    # compile the resulting file.
+    concatenate_files(${_concatenated_asm_file} ${_source_file_list})
+
+    ##
+    ## All this part is the same as CreateBootSectorTarget
+    ##
+    if(ARCH STREQUAL "arm")
+        set(_pp_asm16_compile_command ${CMAKE_ASM16_COMPILER} -nologo -o 
${_object_file} ${_preprocessed_asm_file})
+    else()
+        set(_pp_asm16_compile_command ${CMAKE_ASM16_COMPILER} /nologo /Cp 
/Fo${_object_file} /c /Ta ${_preprocessed_asm_file})
+    endif()
+
+    add_custom_command(
+        OUTPUT ${_preprocessed_asm_file} ${_object_file}
+        COMMAND ${CMAKE_C_COMPILER} /nologo /X 
/I${REACTOS_SOURCE_DIR}/include/asm /I${REACTOS_BINARY_DIR}/include/asm 
${_directory_includes} ${_source_file_defines} ${_directory_defines} /D__ASM__ 
/D_USE_ML /EP /c ${_concatenated_asm_file} > ${_preprocessed_asm_file} && 
${_pp_asm16_compile_command}
+        DEPENDS ${_concatenated_asm_file})
+
+    add_custom_command(
+        OUTPUT ${_binary_file}
+        COMMAND native-obj2bin ${_object_file} ${_binary_file} ${_base_address}
+        DEPENDS ${_object_file} native-obj2bin)
+
+    set_source_files_properties(${_object_file} ${_preprocessed_asm_file} 
${_binary_file} PROPERTIES GENERATED TRUE)
+
+    add_custom_target(${_target} ALL DEPENDS ${_binary_file})
+endfunction()
+
+endif()

Propchange: trunk/reactos/subsystems/mvdm/asm16.cmake
------------------------------------------------------------------------------
    svn:eol-style = native


Reply via email to