meta: add build system

This commit is contained in:
2026-02-05 09:54:46 +00:00
parent 62c5653d5b
commit 9c8fbc72ac
15 changed files with 694 additions and 0 deletions

95
cmake/BSP.cmake Normal file
View File

@@ -0,0 +1,95 @@
find_package(Python COMPONENTS Interpreter)
set(bsp_manifest ${CMAKE_CURRENT_BINARY_DIR}/bsp-manifest.json)
set(bsp_tool ${CMAKE_SOURCE_DIR}/util/bsp-tool.py)
function(bsp_reset)
execute_process(
COMMAND ${Python_EXECUTABLE} ${bsp_tool} reset ${bsp_manifest}
COMMAND_ERROR_IS_FATAL ANY)
endfunction(bsp_reset)
function(bsp_add_library)
set(options)
set(one_value_args NAME HEADER_DIR LIB_DIR)
set(multi_value_args)
cmake_parse_arguments(PARSE_ARGV 0 arg
"${options}"
"${one_value_args}"
"${multi_value_args}")
set(target_name ${arg_NAME})
set(bsp_target_name _bsp-${target_name})
meta_target_get_header_directories(TARGET ${target_name} OUT header_dirs)
get_property(bsp_targets GLOBAL PROPERTY bsp_target_list)
list(LENGTH bsp_targets nr_bsp_targets)
if (${nr_bsp_targets} GREATER 0)
math(EXPR serialiser_index "${nr_bsp_targets}-1")
list(GET bsp_targets ${serialiser_index} serialiser)
endif ()
add_custom_target(${bsp_target_name}
COMMAND ${Python_EXECUTABLE} ${bsp_tool}
add-binary ${bsp_manifest} ${target_name}
${arg_LIB_DIR} $<TARGET_FILE:${target_name}>
COMMAND ${Python_EXECUTABLE} ${bsp_tool}
add-headers ${bsp_manifest} ${target_name}
${arg_HEADER_DIR} ${header_dirs}
COMMENT "Preparing bsp component: ${target_name}"
DEPENDS ${target_name} ${serialiser})
set_property(GLOBAL PROPERTY bsp_target_list ${bsp_targets} ${bsp_target_name})
endfunction(bsp_add_library)
function(bsp_add_program)
set(options)
set(one_value_args NAME BIN_DIR)
set(multi_value_args)
cmake_parse_arguments(PARSE_ARGV 0 arg
"${options}"
"${one_value_args}"
"${multi_value_args}")
set(target_name ${arg_NAME})
set(bsp_target_name _bsp-${target_name})
get_property(bsp_targets GLOBAL PROPERTY bsp_target_list)
list(LENGTH bsp_targets nr_bsp_targets)
if (${nr_bsp_targets} GREATER 0)
math(EXPR serialiser_index "${nr_bsp_targets}-1")
list(GET bsp_targets ${serialiser_index} serialiser)
endif ()
add_custom_target(${bsp_target_name}
COMMAND ${Python_EXECUTABLE} ${bsp_tool}
add-binary ${bsp_manifest} ${target_name}
${arg_BIN_DIR} $<TARGET_FILE:${target_name}>
COMMENT "Preparing bsp component: ${target_name}"
DEPENDS ${target_name} ${serialiser})
set_property(GLOBAL PROPERTY bsp_target_list ${bsp_targets} ${bsp_target_name})
endfunction(bsp_add_program)
function(bsp_finalise)
set(options)
set(one_value_args BSP_NAME)
set(multi_value_args)
cmake_parse_arguments(PARSE_ARGV 0 arg
"${options}"
"${one_value_args}"
"${multi_value_args}")
set(bsp_output_path ${CMAKE_CURRENT_BINARY_DIR}/${arg_BSP_NAME})
get_property(bsp_targets GLOBAL PROPERTY bsp_target_list)
add_custom_command(OUTPUT ${bsp_output_path}
COMMAND ${Python_EXECUTABLE} ${bsp_tool}
build-bsp ${bsp_manifest} ${bsp_output_path}
DEPENDS ${bsp_targets}
COMMENT "Building bsp: ${arg_BSP_NAME}")
add_custom_target(bsp
DEPENDS ${bsp_output_path})
endfunction(bsp_finalise)

34
cmake/Meta.cmake Normal file
View File

@@ -0,0 +1,34 @@
function(meta_target_add_header_directory)
set(options)
set(one_value_args TARGET PATH)
set(multi_value_args)
cmake_parse_arguments(PARSE_ARGV 0 arg
"${options}"
"${one_value_args}"
"${multi_value_args}")
get_property(header_dir_list
TARGET ${arg_TARGET}
PROPERTY meta_header_directories)
set_property(
TARGET ${arg_TARGET}
PROPERTY meta_header_directories
${header_dir_list} ${arg_PATH})
endfunction(meta_target_add_header_directory)
function(meta_target_get_header_directories)
set(options)
set(one_value_args TARGET OUT)
set(multi_value_args)
cmake_parse_arguments(PARSE_ARGV 0 arg
"${options}"
"${one_value_args}"
"${multi_value_args}")
get_property(header_dir_list
TARGET ${arg_TARGET}
PROPERTY meta_header_directories)
set(${arg_OUT} ${header_dir_list} PARENT_SCOPE)
endfunction(meta_target_get_header_directories)

115
cmake/Sysroot.cmake Normal file
View File

@@ -0,0 +1,115 @@
find_package(Python COMPONENTS Interpreter)
set(sysroot_manifest ${CMAKE_CURRENT_BINARY_DIR}/sysroot-manifest.json)
set(sysroot_tool ${CMAKE_SOURCE_DIR}/util/sysroot-tool.py)
function(sysroot_reset)
execute_process(
COMMAND ${Python_EXECUTABLE} ${sysroot_tool} reset ${sysroot_manifest}
COMMAND_ERROR_IS_FATAL ANY)
endfunction(sysroot_reset)
function(sysroot_add_library)
set(options)
set(one_value_args NAME HEADER_DIR LIB_DIR)
set(multi_value_args)
cmake_parse_arguments(PARSE_ARGV 0 arg
"${options}"
"${one_value_args}"
"${multi_value_args}")
set(target_name ${arg_NAME})
set(sysroot_target_name _sysroot-${target_name})
meta_target_get_header_directories(TARGET ${target_name} OUT header_dirs)
get_property(sysroot_targets GLOBAL PROPERTY sysroot_target_list)
list(LENGTH sysroot_targets nr_sysroot_targets)
if (${nr_sysroot_targets} GREATER 0)
math(EXPR serialiser_index "${nr_sysroot_targets}-1")
list(GET sysroot_targets ${serialiser_index} serialiser)
endif ()
add_custom_target(${sysroot_target_name}
COMMAND ${Python_EXECUTABLE} ${sysroot_tool}
add-binary ${sysroot_manifest} ${target_name}
${arg_LIB_DIR} $<TARGET_FILE:${target_name}>
COMMAND ${Python_EXECUTABLE} ${sysroot_tool}
add-headers ${sysroot_manifest} ${target_name}
${arg_HEADER_DIR} ${header_dirs}
COMMENT "Preparing sysroot component: ${target_name}"
DEPENDS ${target_name} ${serialiser})
set_property(GLOBAL PROPERTY sysroot_target_list ${sysroot_targets} ${sysroot_target_name})
endfunction(sysroot_add_library)
function(sysroot_add_program)
set(options)
set(one_value_args NAME BIN_DIR)
set(multi_value_args)
cmake_parse_arguments(PARSE_ARGV 0 arg
"${options}"
"${one_value_args}"
"${multi_value_args}")
set(target_name ${arg_NAME})
set(sysroot_target_name _sysroot-${target_name})
get_property(sysroot_targets GLOBAL PROPERTY sysroot_target_list)
list(LENGTH sysroot_targets nr_sysroot_targets)
if (${nr_sysroot_targets} GREATER 0)
math(EXPR serialiser_index "${nr_sysroot_targets}-1")
list(GET sysroot_targets ${serialiser_index} serialiser)
endif ()
add_custom_target(${sysroot_target_name}
COMMAND ${Python_EXECUTABLE} ${sysroot_tool}
add-binary ${sysroot_manifest} ${target_name}
${arg_BIN_DIR} $<TARGET_FILE:${target_name}>
COMMENT "Preparing sysroot component: ${target_name}"
DEPENDS ${target_name} ${serialiser})
set_property(GLOBAL PROPERTY sysroot_target_list ${sysroot_targets} ${sysroot_target_name})
endfunction(sysroot_add_program)
function(sysroot_add_file)
set(options)
set(one_value_args ID SRC_PATH DEST_DIR)
set(multi_value_args DEPENDS)
cmake_parse_arguments(PARSE_ARGV 0 arg
"${options}"
"${one_value_args}"
"${multi_value_args}")
set(src_path ${arg_SRC_PATH})
set(dest_dir ${arg_DEST_DIR})
set(sysroot_target_name _sysroot-${arg_ID})
get_property(sysroot_targets GLOBAL PROPERTY sysroot_target_list)
list(LENGTH sysroot_targets nr_sysroot_targets)
if (${nr_sysroot_targets} GREATER 0)
math(EXPR serialiser_index "${nr_sysroot_targets}-1")
list(GET sysroot_targets ${serialiser_index} serialiser)
endif ()
add_custom_target(${sysroot_target_name}
COMMAND ${Python_EXECUTABLE} ${sysroot_tool}
add-binary ${sysroot_manifest} ${arg_ID}
${dest_dir} ${src_path}
COMMENT "Preparing sysroot component: ${arg_ID}"
DEPENDS ${target_name} ${serialiser} ${arg_DEPENDS})
set_property(GLOBAL PROPERTY sysroot_target_list ${sysroot_targets} ${sysroot_target_name})
endfunction(sysroot_add_file)
function(sysroot_finalise)
get_property(sysroot_targets GLOBAL PROPERTY sysroot_target_list)
add_custom_target(sysroot
COMMAND ${Python_EXECUTABLE} ${sysroot_tool}
build-sysroot ${sysroot_manifest} ${CMAKE_BINARY_DIR}/sysroot
DEPENDS ${sysroot_targets}
COMMENT "Building sysroot...")
endfunction(sysroot_finalise)

80
cmake/Templates.cmake Normal file
View File

@@ -0,0 +1,80 @@
function(rosetta_add_executable)
set(options)
set(one_value_args NAME SYSROOT_PATH)
set(multi_value_args
SUBDIRS
EXTRA_SOURCES)
cmake_parse_arguments(PARSE_ARGV 0 arg
"${options}"
"${one_value_args}"
"${multi_value_args}")
set(exec_name ${arg_NAME})
get_property(programs GLOBAL PROPERTY rosetta_program_list)
set_property(GLOBAL PROPERTY rosetta_program_list ${programs} ${exec_name})
file(GLOB sources *.c *.h)
foreach (dir ${arg_SUBDIRS})
file(GLOB dir_sources ${dir}/*.c ${dir}/*.h)
set(sources ${sources} ${dir_sources})
endforeach (dir)
message(STATUS "Building program ${exec_name}")
add_executable(${exec_name}
${sources}
${arg_EXTRA_SOURCES})
set_target_properties(${exec_name} PROPERTIES
POSITION_INDEPENDENT_CODE ON
sys_bin_dir ${arg_SYSROOT_PATH})
install(TARGETS ${exec_name}
DESTINATION ${arg_SYSROOT_PATH})
endfunction(rosetta_add_executable)
function(rosetta_add_library)
set(options SHARED)
set(one_value_args NAME SYSROOT_PATH)
set(multi_value_args
SOURCE_DIRS
EXTRA_SOURCES)
cmake_parse_arguments(PARSE_ARGV 0 arg
"${options}"
"${one_value_args}"
"${multi_value_args}")
set(lib_name ${arg_NAME})
get_property(libs GLOBAL PROPERTY rosetta_library_list)
set_property(GLOBAL PROPERTY rosetta_library_list ${libs} ${lib_name})
file(GLOB sources *.c *.h)
file(GLOB_RECURSE headers include/*.h)
foreach (dir ${arg_SOURCE_DIRS})
file(GLOB dir_sources ${dir}/*.c ${dir}/*.h)
set(sources ${sources} ${dir_sources})
endforeach (dir)
message(STATUS "Building library ${lib_name}")
if (arg_SHARED)
add_library(${lib_name} SHARED
${sources}
${headers}
${arg_EXTRA_SOURCES})
else ()
add_library(${lib_name} STATIC
${sources}
${headers}
${arg_EXTRA_SOURCES})
endif ()
target_include_directories(${lib_name} PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/include)
set_target_properties(${lib_name} PROPERTIES
POSITION_INDEPENDENT_CODE ON
src_header_dir ${CMAKE_CURRENT_SOURCE_DIR}/include
sys_header_dir ${arg_SYSROOT_PATH}/include
sys_bin_dir ${arg_SYSROOT_PATH}/lib
PREFIX "")
endfunction(rosetta_add_library)