[BOOTVID] Modularize the different bootvid's build rules (#8548)

The aim is to be able to compile multiple bootvids for a given ReactOS
build without having to duplicate the same commands.
This commit is contained in:
Hermès Bélusca-Maïto
2025-12-29 14:14:04 +01:00
parent 668c9c0528
commit fda2ee2ad8
8 changed files with 119 additions and 62 deletions

View File

@@ -1,43 +1,70 @@
spec2def(bootvid.dll bootvid.spec ADD_IMPORTLIB)
function(add_bootvid _target _configfile)
cmake_parse_arguments(_bviddata "" "NAME_ON_CD" "SOURCES" ${ARGN})
if((ARCH STREQUAL "i386") OR (ARCH STREQUAL "amd64"))
if(SARCH STREQUAL "pc98")
list(APPEND SOURCE
i386/pc98/pc98.h
i386/pc98/bootvid.c)
elseif(SARCH STREQUAL "xbox")
list(APPEND SOURCE
i386/xbox/xbox.h
i386/xbox/bootvid.c)
else()
list(APPEND SOURCE
i386/pc/pc.h
i386/pc/cmdcnst.h
i386/pc/bootvid.c
i386/pc/bootdata.c
i386/pc/vga.h
i386/pc/vga.c)
# Handle the spec file for the dll name
spec2def(${_target}.dll bootvid.spec ADD_IMPORTLIB)
# Set default values for the version resource file
set(REACTOS_STR_INTERNAL_NAME "$<TARGET_NAME:${_target}>")
set(REACTOS_STR_ORIGINAL_FILENAME "$<TARGET_FILE_NAME:${_target}>")
# Include the per-target definitions (COMPILE_DEFINITIONS, MODULE_HEADER, and SOURCE)
include(${_configfile})
list(APPEND SOURCE ${_bviddata_SOURCES})
# Manage the module-specific header for precomp.h
if(MODULE_HEADER)
#get_filename_component(MODULE_HEADER "${MODULE_HEADER}" ABSOLUTE)
file(RELATIVE_PATH MODULE_HEADER "${CMAKE_CURRENT_SOURCE_DIR}" "${MODULE_HEADER}")
#string(REPLACE "\\" "/" MODULE_HEADER "${MODULE_HEADER}")
file(TO_CMAKE_PATH "${MODULE_HEADER}" MODULE_HEADER)
list(APPEND COMPILE_DEFINITIONS "MODULE_HEADER=\"${MODULE_HEADER}\"")
endif()
elseif(ARCH STREQUAL "arm")
list(APPEND SOURCE
arm/arm.h
arm/bootvid.c)
# Add the common sources
list(APPEND SOURCE common.c console.c fontdata.c precomp.h)
# Generate the per-target version resource file in two passes:
# 1. Configure-time generation to replace the values with generator expressions;
# 2. Generation-time by overwriting the file with the resolved expressions.
configure_file(bootvid.rc ${CMAKE_CURRENT_BINARY_DIR}/${_target}.rc)
file(GENERATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${_target}.rc
INPUT ${CMAKE_CURRENT_BINARY_DIR}/${_target}.rc) # TARGET ${_target}
# Create the actual target
add_library(${_target} MODULE
${SOURCE}
${CMAKE_CURRENT_BINARY_DIR}/${_target}.rc
${CMAKE_CURRENT_BINARY_DIR}/${_target}.def)
add_pch(${_target} precomp.h "")
target_compile_definitions(${_target} PRIVATE ${COMPILE_DEFINITIONS})
set_module_type(${_target} kerneldll ENTRYPOINT 0)
add_importlibs(${_target} ntoskrnl hal)
add_dependencies(${_target} psdk)
if(NOT _bviddata_NAME_ON_CD)
set(_bviddata_NAME_ON_CD "$<TARGET_FILE_NAME:${_target}>")
endif()
add_cd_file(TARGET ${_target} DESTINATION reactos/system32 NO_CAB NAME_ON_CD ${_bviddata_NAME_ON_CD} FOR all)
endfunction()
if(ARCH STREQUAL "i386")
## FIXME: Temporary bootvid.dll renames on the CD.
## These should be done instead by the setup program during install.
if(SARCH STREQUAL "pc98")
set(PC98BVID_NAME_ON_CD bootvid.dll)
set(VGABVID_NAME_ON_CD vgabvid.dll)
elseif(SARCH STREQUAL "xbox")
set(XBOXBVID_NAME_ON_CD bootvid.dll)
set(VGABVID_NAME_ON_CD vgabvid.dll)
endif()
add_bootvid(pc98bvid i386/pc98/pc98bvid.cmake NAME_ON_CD ${PC98BVID_NAME_ON_CD})
add_bootvid(xboxbvid i386/xbox/xboxbvid.cmake NAME_ON_CD ${XBOXBVID_NAME_ON_CD})
endif()
if((ARCH STREQUAL "i386") OR (ARCH STREQUAL "amd64"))
add_bootvid(bootvid i386/pc/vgabvid.cmake NAME_ON_CD ${VGABVID_NAME_ON_CD})
elseif(ARCH STREQUAL "arm")
add_bootvid(bootvid arm/armbvid.cmake)
endif()
list(APPEND SOURCE
common.c
console.c
fontdata.c
precomp.h)
add_library(bootvid MODULE
${SOURCE}
bootvid.rc
${CMAKE_CURRENT_BINARY_DIR}/bootvid.def)
set_module_type(bootvid kerneldll ENTRYPOINT 0)
add_importlibs(bootvid ntoskrnl hal)
add_pch(bootvid precomp.h SOURCE)
add_dependencies(bootvid psdk)
add_cd_file(TARGET bootvid DESTINATION reactos/system32 NO_CAB FOR all)

View File

@@ -0,0 +1,7 @@
set(MODULE_HEADER ${CMAKE_CURRENT_LIST_DIR}/arm.h) # For precomp.h
list(APPEND SOURCE
${MODULE_HEADER}
${CMAKE_CURRENT_LIST_DIR}/bootvid.c)
set(REACTOS_STR_FILE_DESCRIPTION "ARM Versatile Boot Video Driver")

View File

@@ -7,14 +7,23 @@
#define REACTOS_VERSION_DLL
#if defined(SARCH_PC98)
#define REACTOS_STR_FILE_DESCRIPTION "NEC PC-98 Boot Video Driver"
#elif defined(SARCH_XBOX)
#define REACTOS_STR_FILE_DESCRIPTION "Original Xbox Boot Video Driver"
#else
#define REACTOS_STR_FILE_DESCRIPTION "VGA Boot Driver"
/* Each bootvid configuration file defines REACTOS_STR_FILE_DESCRIPTION */
#cmakedefine REACTOS_STR_FILE_DESCRIPTION "${REACTOS_STR_FILE_DESCRIPTION}"
#ifndef REACTOS_STR_FILE_DESCRIPTION
#define REACTOS_STR_FILE_DESCRIPTION "Boot Video Driver"
#endif
/* The main bootvid CMake file defines default values for
* REACTOS_STR_INTERNAL_NAME and REACTOS_STR_ORIGINAL_FILENAME.
* Each bootvid configuration file can override these values. */
#cmakedefine REACTOS_STR_INTERNAL_NAME "${REACTOS_STR_INTERNAL_NAME}"
#ifndef REACTOS_STR_INTERNAL_NAME
#define REACTOS_STR_INTERNAL_NAME "bootvid"
#endif
#cmakedefine REACTOS_STR_ORIGINAL_FILENAME "${REACTOS_STR_ORIGINAL_FILENAME}"
#ifndef REACTOS_STR_ORIGINAL_FILENAME
#define REACTOS_STR_ORIGINAL_FILENAME "bootvid.dll"
#endif
#define REACTOS_STR_INTERNAL_NAME "bootvid.dll"
#define REACTOS_STR_ORIGINAL_FILENAME "bootvid.dll"
#include <reactos/version.rc>

View File

@@ -0,0 +1,11 @@
set(MODULE_HEADER ${CMAKE_CURRENT_LIST_DIR}/pc.h) # For precomp.h
list(APPEND SOURCE
${MODULE_HEADER}
${CMAKE_CURRENT_LIST_DIR}/cmdcnst.h
${CMAKE_CURRENT_LIST_DIR}/bootvid.c
${CMAKE_CURRENT_LIST_DIR}/bootdata.c
${CMAKE_CURRENT_LIST_DIR}/vga.h
${CMAKE_CURRENT_LIST_DIR}/vga.c)
set(REACTOS_STR_FILE_DESCRIPTION "VGA Boot Driver")

View File

@@ -0,0 +1,7 @@
set(MODULE_HEADER ${CMAKE_CURRENT_LIST_DIR}/pc98.h) # For precomp.h
list(APPEND SOURCE
${MODULE_HEADER}
${CMAKE_CURRENT_LIST_DIR}/bootvid.c)
set(REACTOS_STR_FILE_DESCRIPTION "NEC PC-98 Boot Video Driver")

View File

@@ -0,0 +1,7 @@
set(MODULE_HEADER ${CMAKE_CURRENT_LIST_DIR}/xbox.h) # For precomp.h
list(APPEND SOURCE
${MODULE_HEADER}
${CMAKE_CURRENT_LIST_DIR}/bootvid.c)
set(REACTOS_STR_FILE_DESCRIPTION "Original Xbox Boot Video Driver")

View File

@@ -13,20 +13,9 @@
#include <ndk/halfuncs.h>
#include <drivers/bootvid/bootvid.h>
/* Arch-specific includes */
#if defined(_M_IX86) || defined(_M_AMD64)
#if defined(SARCH_PC98)
#include "i386/pc98/pc98.h"
#elif defined(SARCH_XBOX)
#include "i386/xbox/xbox.h"
#else
#include "i386/pc/vga.h"
#include "i386/pc/pc.h"
#endif
#elif defined(_M_ARM)
#include "arm/arm.h"
#else
#error Unknown architecture
/* Module-specific header */
#ifdef MODULE_HEADER
#include MODULE_HEADER
#endif
/* Define if FontData has upside-down characters */

View File

@@ -15,7 +15,7 @@
#include "version.h"
#include "buildno.h"
/* Define some defaults (shouldn't be overwritten by applications */
/* Define some defaults (shouldn't be overwritten by applications) */
#define REACTOS_DEFAULT_STR_COMPANY_NAME "ReactOS Project"
#define REACTOS_DEFAULT_STR_DESCRIPTION "ReactOS Core Component"
#define REACTOS_DEFAULT_STR_INTERNAL_NAME ""