104 lines
3.4 KiB
CMake
104 lines
3.4 KiB
CMake
function(add_fx_assembly)
|
|
set(options)
|
|
set(one_value_args NAME)
|
|
set(multi_value_args
|
|
NAMESPACES
|
|
DEPENDENCIES
|
|
LIBS)
|
|
cmake_parse_arguments(PARSE_ARGV 0 arg
|
|
"${options}"
|
|
"${one_value_args}"
|
|
"${multi_value_args}")
|
|
|
|
set(assembly_name ${arg_NAME})
|
|
string(REPLACE "." "/" assembly_path ${assembly_name})
|
|
set(assembly_target_name ${assembly_name})
|
|
string(REPLACE "." "_" assembly_token ${assembly_name})
|
|
string(TOUPPER ${assembly_token} assembly_token)
|
|
|
|
set(assembly_include_paths "")
|
|
set(assembly_sources ${CMAKE_CURRENT_SOURCE_DIR}/assembly.c)
|
|
|
|
foreach (dir ${arg_NAMESPACES})
|
|
add_subdirectory(${fx_source_root}/${dir} ${fx_build_root}/namespaces/${dir})
|
|
set(assembly_sources ${assembly_sources} ${namespace_sources})
|
|
set(assembly_include_paths ${assembly_include_paths} ${namespace_include_paths})
|
|
endforeach (dir)
|
|
|
|
message(STATUS "Building assembly ${assembly_name}")
|
|
add_library(${assembly_target_name} SHARED
|
|
${assembly_sources})
|
|
|
|
target_include_directories(${assembly_target_name} PUBLIC ${assembly_include_paths})
|
|
|
|
target_compile_definitions(${assembly_target_name} PUBLIC
|
|
FX_EXPORT=1
|
|
FX_ENABLE_FLOATING_POINT=${fx_enable_floating_point})
|
|
|
|
set_target_properties(${assembly_target_name}
|
|
PROPERTIES POSITION_INDEPENDENT_CODE ON)
|
|
|
|
target_link_libraries(${assembly_target_name} ${internal_libs} ${arg_DEPENDENCIES})
|
|
target_include_directories(${assembly_target_name} PRIVATE ${internal_include_dirs})
|
|
|
|
foreach (def ${arg_DEFINES})
|
|
target_compile_definitions(${assembly_target_name} PRIVATE ${def})
|
|
endforeach (def)
|
|
|
|
set_target_properties(${assembly_target_name} PROPERTIES
|
|
FOLDER "${assembly_name}")
|
|
|
|
TEST_BIG_ENDIAN(IS_BIG_ENDIAN)
|
|
if(IS_BIG_ENDIAN)
|
|
target_compile_definitions(${assembly_target_name} PRIVATE
|
|
BIG_ENDIAN)
|
|
else()
|
|
target_compile_definitions(${assembly_target_name} PRIVATE
|
|
LITTLE_ENDIAN)
|
|
endif()
|
|
|
|
install(TARGETS ${assembly_target_name})
|
|
install(FILES ${headers} DESTINATION include/${assembly_path})
|
|
endfunction(add_fx_assembly)
|
|
|
|
macro(export_fx_namespace_details ns_name)
|
|
set(namespace_name ${ns_name})
|
|
|
|
string(REPLACE "." "/" namespace_path ${namespace_name})
|
|
set(namespace_target_name ${namespace_name})
|
|
|
|
set(namespace_include_paths ${CMAKE_CURRENT_SOURCE_DIR}/include PARENT_SCOPE)
|
|
|
|
file(GLOB base_namespace_sources
|
|
*.c *.h
|
|
${CMAKE_CURRENT_SOURCE_DIR}/include/${namespace_path}/*.h)
|
|
|
|
foreach (dir ${source_dirs})
|
|
file(GLOB dir_sources ${dir}/*.c ${dir}/*.h)
|
|
set(dir_namespace_sources ${dir_namespace_sources} ${dir_sources})
|
|
endforeach (dir)
|
|
|
|
file(GLOB sys_sources
|
|
${CMAKE_CURRENT_SOURCE_DIR}/sys/${fx_system_name}/*.c
|
|
${CMAKE_CURRENT_SOURCE_DIR}/sys/${fx_system_name}/*.h
|
|
${CMAKE_CURRENT_SOURCE_DIR}/sys/${fx_system_name}/${fx_system_arch}/*.c
|
|
${CMAKE_CURRENT_SOURCE_DIR}/sys/${fx_system_name}/${fx_system_arch}/*.h
|
|
${CMAKE_CURRENT_SOURCE_DIR}/sys/${fx_system_name}/${fx_system_arch}/*.S)
|
|
file(GLOB headers include/${namespace_path}/*.h)
|
|
set(namespace_sources
|
|
${namespace_sources}
|
|
${base_namespace_sources}
|
|
${dir_namespace_sources}
|
|
${sys_sources}
|
|
${headers}
|
|
PARENT_SCOPE)
|
|
set(internal_include_dirs
|
|
${internal_include_dirs}
|
|
${CMAKE_CURRENT_SOURCE_DIR}/sys/${fx_system_name}/include
|
|
${CMAKE_CURRENT_SOURCE_DIR}/sys/${fx_system_name}/${fx_system_arch}/include
|
|
PARENT_SCOPE)
|
|
set(internal_libs ${internal_libs} PARENT_SCOPE)
|
|
set(internal_defines ${internal_defines} PARENT_SCOPE)
|
|
endmacro(export_fx_namespace_details)
|
|
|