cmake_minimum_required(VERSION 3.25)
project(fx C ASM)

set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
include (TestBigEndian)
include(Templates)
include(Platform)

test_big_endian(is_big_endian)
if (is_big_endian)
	message(STATUS "Target is Big Endian")
	add_compile_definitions(FX_ENDIAN=1)
else ()
	message(STATUS "Target is Little Endian")
	add_compile_definitions(FX_ENDIAN=0)
endif ()


set(CMAKE_C_STANDARD 99)
set(CMAKE_C_EXTENSIONS OFF)

set_property(GLOBAL PROPERTY USE_FOLDERS ON)

set(fx_source_root ${CMAKE_CURRENT_SOURCE_DIR})
set(fx_build_root ${CMAKE_CURRENT_BINARY_DIR})
file(GLOB _all_assemblies assemblies/*
	LIST_DIRECTORIES TRUE)

foreach (assembly_path ${_all_assemblies})
	get_filename_component(assembly_name ${assembly_path} NAME)
	set(fx_all_assemblies ${fx_all_assemblies} ${assembly_name})
endforeach (assembly_path)

if (NOT DEFINED fx_assemblies)
	set(fx_assemblies ${fx_all_assemblies})
endif ()

if (NOT DEFINED fx_enable_floating_point)
	set(fx_enable_floating_point 1)
endif ()

if (NOT DEFINED fx_enable_tests)
	set(fx_enable_tests 1)
endif ()

message(STATUS "Floating point support: ${fx_enable_floating_point}")

get_platform_details(
	SYSTEM fx_system_name
	PROCESSOR fx_system_arch)

message(STATUS "Target system: ${fx_system_name}-${fx_system_arch}")

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bin)

foreach (assembly ${fx_assemblies})
	add_subdirectory(assemblies/${assembly})
endforeach (assembly)

if (fx_enable_tests)
	add_subdirectory(test)
endif ()
