xref: /reactos/subsystems/mvdm/asm16.cmake (revision f9e1e23d)
1c2c66affSColin Finck## EXPERIMENTAL!!
2c2c66affSColin Finck
3c2c66affSColin Finck# We need to use almost the same tricks as the ones used for MSVC 'add_asm_files'
4c2c66affSColin Finck# support because we are going to compile ASM files for a fixed target (16-bit x86)
5c2c66affSColin Finck# that is different from the main target.
6c2c66affSColin Finck
7c2c66affSColin Finckif(NOT MSVC)
8c2c66affSColin Finck###
9c2c66affSColin Finck### For GCC
10c2c66affSColin Finck###
11c2c66affSColin Finckfunction(add_asm16_bin _target _binary_file _base_address)
12c2c66affSColin Finck    set(_concatenated_asm_file ${CMAKE_CURRENT_BINARY_DIR}/${_target}.asm)
13c2c66affSColin Finck    set(_object_file ${CMAKE_CURRENT_BINARY_DIR}/${_target}.o)
14c2c66affSColin Finck
15c2c66affSColin Finck    # unset(_source_file_list)
16c2c66affSColin Finck
17c2c66affSColin Finck    get_defines(_directory_defines)
18c2c66affSColin Finck    get_includes(_directory_includes)
19c2c66affSColin Finck    get_directory_property(_defines COMPILE_DEFINITIONS)
20c2c66affSColin Finck
21c2c66affSColin Finck    # Build a list of all the defines needed.
22c2c66affSColin Finck    foreach(_source_file ${ARGN})
23c2c66affSColin Finck        get_filename_component(_source_file_full_path ${_source_file} ABSOLUTE)
24c2c66affSColin Finck        get_source_file_property(_defines_semicolon_list ${_source_file_full_path} COMPILE_DEFINITIONS)
25c2c66affSColin Finck
26c2c66affSColin Finck        # unset(_source_file_defines)
27c2c66affSColin Finck
28c2c66affSColin Finck        foreach(_define ${_defines_semicolon_list})
29c2c66affSColin Finck            if(NOT ${_define} STREQUAL "NOTFOUND")
30c2c66affSColin Finck                list(APPEND _source_file_defines -D${_define})
31c2c66affSColin Finck            endif()
32c2c66affSColin Finck        endforeach()
33c2c66affSColin Finck
34c2c66affSColin Finck        list(APPEND _source_file_list ${_source_file_full_path})
35c2c66affSColin Finck    endforeach()
36c2c66affSColin Finck
37c2c66affSColin Finck    # We do not support 16-bit ASM linking so the only way to compile
38c2c66affSColin Finck    # many ASM files is by concatenating them into a single one and
39c2c66affSColin Finck    # compile the resulting file.
40c2c66affSColin Finck    concatenate_files(${_concatenated_asm_file} ${_source_file_list})
41c2c66affSColin Finck    set_source_files_properties(${_concatenated_asm_file} PROPERTIES GENERATED TRUE)
42c2c66affSColin Finck
43c2c66affSColin Finck    ##
44c2c66affSColin Finck    ## All this part is the same as CreateBootSectorTarget
45c2c66affSColin Finck    ##
46c2c66affSColin Finck    add_custom_command(
47c2c66affSColin Finck        OUTPUT ${_object_file}
48c2c66affSColin Finck        COMMAND ${CMAKE_ASM_COMPILER} -x assembler-with-cpp -o ${_object_file} -I${REACTOS_SOURCE_DIR}/sdk/include/asm -I${REACTOS_BINARY_DIR}/sdk/include/asm ${_directory_includes} ${_source_file_defines} ${_directory_defines} -D__ASM__ -c ${_concatenated_asm_file}
49c2c66affSColin Finck        DEPENDS ${_concatenated_asm_file})
50c2c66affSColin Finck
51c2c66affSColin Finck    add_custom_command(
52c2c66affSColin Finck        OUTPUT ${_binary_file}
53c2c66affSColin Finck        COMMAND native-obj2bin ${_object_file} ${_binary_file} ${_base_address}
54c2c66affSColin Finck        # COMMAND objcopy --output-target binary --image-base 0x${_base_address} ${_object_file} ${_binary_file}
55c2c66affSColin Finck        DEPENDS ${_object_file} native-obj2bin)
56c2c66affSColin Finck
57c2c66affSColin Finck    add_custom_target(${_target} ALL DEPENDS ${_binary_file})
58c2c66affSColin Finck    # set_target_properties(${_target} PROPERTIES OUTPUT_NAME ${_target} SUFFIX ".bin")
59*f9e1e23dSThomas Faber    set_target_properties(${_target} PROPERTIES BINARY_PATH ${_binary_file})
60c2c66affSColin Finck    add_clean_target(${_target})
61c2c66affSColin Finckendfunction()
62c2c66affSColin Finck
63c2c66affSColin Finckelse()
64c2c66affSColin Finck###
65c2c66affSColin Finck### For MSVC
66c2c66affSColin Finck###
67c2c66affSColin Finckfunction(add_asm16_bin _target _binary_file _base_address)
68c2c66affSColin Finck    set(_concatenated_asm_file ${CMAKE_CURRENT_BINARY_DIR}/${_target}.asm)
69c2c66affSColin Finck    set(_preprocessed_asm_file ${CMAKE_CURRENT_BINARY_DIR}/${_target}.tmp)
70c2c66affSColin Finck    set(_object_file ${CMAKE_CURRENT_BINARY_DIR}/${_target}.obj)
71c2c66affSColin Finck
72c2c66affSColin Finck    # unset(_source_file_list)
73c2c66affSColin Finck
74c2c66affSColin Finck    get_defines(_directory_defines)
75c2c66affSColin Finck    get_includes(_directory_includes)
76c2c66affSColin Finck    get_directory_property(_defines COMPILE_DEFINITIONS)
77c2c66affSColin Finck
78c2c66affSColin Finck    # Build a list of all the defines needed.
79c2c66affSColin Finck    foreach(_source_file ${ARGN})
80c2c66affSColin Finck        get_filename_component(_source_file_full_path ${_source_file} ABSOLUTE)
81c2c66affSColin Finck        get_source_file_property(_defines_semicolon_list ${_source_file_full_path} COMPILE_DEFINITIONS)
82c2c66affSColin Finck
83c2c66affSColin Finck        # unset(_source_file_defines)
84c2c66affSColin Finck
85c2c66affSColin Finck        foreach(_define ${_defines_semicolon_list})
86c2c66affSColin Finck            if(NOT ${_define} STREQUAL "NOTFOUND")
87c2c66affSColin Finck                list(APPEND _source_file_defines -D${_define})
88c2c66affSColin Finck            endif()
89c2c66affSColin Finck        endforeach()
90c2c66affSColin Finck
91c2c66affSColin Finck        list(APPEND _source_file_list ${_source_file_full_path})
92c2c66affSColin Finck    endforeach()
93c2c66affSColin Finck
94c2c66affSColin Finck    # We do not support 16-bit ASM linking so the only way to compile
95c2c66affSColin Finck    # many ASM files is by concatenating them into a single one and
96c2c66affSColin Finck    # compile the resulting file.
97c2c66affSColin Finck    concatenate_files(${_concatenated_asm_file} ${_source_file_list})
98c2c66affSColin Finck    set_source_files_properties(${_concatenated_asm_file} PROPERTIES GENERATED TRUE)
99c2c66affSColin Finck
100c2c66affSColin Finck    ##
101c2c66affSColin Finck    ## All this part is the same as CreateBootSectorTarget
102c2c66affSColin Finck    ##
103c2c66affSColin Finck    if(ARCH STREQUAL "arm")
104c2c66affSColin Finck        set(_pp_asm16_compile_command ${CMAKE_ASM16_COMPILER} -nologo -o ${_object_file} ${_preprocessed_asm_file})
105c2c66affSColin Finck    else()
106c2c66affSColin Finck        set(_pp_asm16_compile_command ${CMAKE_ASM16_COMPILER} /nologo /Cp /Fo${_object_file} /c /Ta ${_preprocessed_asm_file})
107c2c66affSColin Finck    endif()
108c2c66affSColin Finck
10909c06a2fSAmine Khaldi    # FIXME: clang-cl can't compile this so use cl here instead of ${CMAKE_C_COMPILER} in the meantime
110c2c66affSColin Finck    add_custom_command(
111c2c66affSColin Finck        OUTPUT ${_preprocessed_asm_file} ${_object_file}
11209c06a2fSAmine Khaldi        COMMAND cl /nologo /X /I${REACTOS_SOURCE_DIR}/sdk/include/asm /I${REACTOS_BINARY_DIR}/sdk/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}
113c2c66affSColin Finck        DEPENDS ${_concatenated_asm_file})
114c2c66affSColin Finck
115c2c66affSColin Finck    add_custom_command(
116c2c66affSColin Finck        OUTPUT ${_binary_file}
117c2c66affSColin Finck        COMMAND native-obj2bin ${_object_file} ${_binary_file} ${_base_address}
118c2c66affSColin Finck        DEPENDS ${_object_file} native-obj2bin)
119c2c66affSColin Finck
120c2c66affSColin Finck    add_custom_target(${_target} ALL DEPENDS ${_binary_file})
121c2c66affSColin Finck    # set_target_properties(${_target} PROPERTIES OUTPUT_NAME ${_target} SUFFIX ".bin")
122*f9e1e23dSThomas Faber    set_target_properties(${_target} PROPERTIES BINARY_PATH ${_binary_file})
123c2c66affSColin Finck    add_clean_target(${_target})
124c2c66affSColin Finckendfunction()
125c2c66affSColin Finck
126c2c66affSColin Finckendif()
127