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") 59f9e1e23dSThomas 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 ## 103447ef2aaSVictor Perevertkin if(CMAKE_C_COMPILER_ID STREQUAL "Clang") 10419f6fc25SHermès Bélusca-Maïto set(_no_std_includes_flag "-nostdinc") 10519f6fc25SHermès Bélusca-Maïto else() 10619f6fc25SHermès Bélusca-Maïto set(_no_std_includes_flag "/X") 10719f6fc25SHermès Bélusca-Maïto endif() 10819f6fc25SHermès Bélusca-Maïto 109c2c66affSColin Finck add_custom_command( 1100493e8e4STimo Kreuzer OUTPUT ${_preprocessed_asm_file} 1110493e8e4STimo Kreuzer #COMMAND ${CMAKE_C_COMPILER} /nologo ${_no_std_includes_flag} /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} 1120493e8e4STimo Kreuzer 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} 113c2c66affSColin Finck DEPENDS ${_concatenated_asm_file}) 114c2c66affSColin Finck 115*4e5e72faSTimo Kreuzer if(MSVC_VERSION GREATER_EQUAL 1936) 116*4e5e72faSTimo Kreuzer set(_quiet_flag "/quiet") 117*4e5e72faSTimo Kreuzer endif() 118*4e5e72faSTimo Kreuzer set(_pp_asm16_compile_command ${CMAKE_ASM16_COMPILER} /nologo ${_quiet_flag} /Cp /Fo${_object_file} /c /Ta ${_preprocessed_asm_file}) 11993beefacSHermès Bélusca-Maïto 120c2c66affSColin Finck add_custom_command( 1210493e8e4STimo Kreuzer OUTPUT ${_object_file} 1220493e8e4STimo Kreuzer COMMAND ${_pp_asm16_compile_command} 1230493e8e4STimo Kreuzer DEPENDS ${_preprocessed_asm_file}) 1240493e8e4STimo Kreuzer 1250493e8e4STimo Kreuzer add_custom_command( 126c2c66affSColin Finck OUTPUT ${_binary_file} 127c2c66affSColin Finck COMMAND native-obj2bin ${_object_file} ${_binary_file} ${_base_address} 128c2c66affSColin Finck DEPENDS ${_object_file} native-obj2bin) 129c2c66affSColin Finck 130c2c66affSColin Finck add_custom_target(${_target} ALL DEPENDS ${_binary_file}) 131c2c66affSColin Finck # set_target_properties(${_target} PROPERTIES OUTPUT_NAME ${_target} SUFFIX ".bin") 132f9e1e23dSThomas Faber set_target_properties(${_target} PROPERTIES BINARY_PATH ${_binary_file}) 133c2c66affSColin Finck add_clean_target(${_target}) 134c2c66affSColin Finckendfunction() 135c2c66affSColin Finck 136c2c66affSColin Finckendif() 137