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}/assemblies/${assembly_name}.c) foreach (dir ${arg_NAMESPACES}) add_subdirectory(${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) 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_libs ${internal_libs} PARENT_SCOPE) set(internal_include_dirs ${internal_include_dirs} PARENT_SCOPE) set(internal_defines ${internal_defines} PARENT_SCOPE) endmacro(export_fx_namespace_details)