function(add_fx_assembly) set(options) set(one_value_args NAME) set(multi_value_args DEPENDENCIES SUBDIRS EXTRA_SOURCES LIBS INCLUDE_DIRS DEFINES) 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}) string(REPLACE "." "-" assembly_target_name ${assembly_name}) string(REPLACE "." "_" assembly_token ${assembly_name}) string(TOUPPER ${assembly_token} assembly_token) file(GLOB sources *.c *.h) foreach (dir ${arg_SUBDIRS}) file(GLOB dir_sources ${dir}/*.c ${dir}/*.h) set(sources ${sources} ${dir_sources}) endforeach (dir) file(GLOB sys_sources sys/${fx_system_name}/*.c sys/${fx_system_name}/*.h) file(GLOB headers include/${assembly_path}/*.h) message(STATUS "Building assembly ${assembly_name}") add_library(${assembly_target_name} SHARED ${sources} ${sys_sources} ${root_header} ${headers} ${arg_EXTRA_SOURCES}) target_include_directories(${assembly_target_name} PUBLIC include/) target_compile_definitions(${assembly_target_name} PUBLIC ${assembly_token} FX_EXPORT=1 FX_ENABLE_FLOATING_POINT=${fx_enable_floating_point}) set_target_properties(${assembly_target_name} PROPERTIES POSITION_INDEPENDENT_CODE ON) foreach (dep ${arg_DEPENDENCIES}) string(REPLACE "." "-" dep_target_name ${dep}) target_link_libraries(${assembly_target_name} ${dep_target_name}) endforeach (dep) foreach (lib ${arg_LIBS}) target_link_libraries(${assembly_target_name} ${lib}) endforeach (lib) foreach (dir ${arg_INCLUDE_DIRS}) target_include_directories(${assembly_target_name} PRIVATE ${dir}) endforeach (dir) 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)