diff --git a/cmake/Templates.cmake b/cmake/Templates.cmake index f450796..8c66d54 100644 --- a/cmake/Templates.cmake +++ b/cmake/Templates.cmake @@ -105,3 +105,118 @@ function(add_bluelib_module) install(FILES ${root_header} DESTINATION include/blue) install(FILES ${headers} DESTINATION include/blue/${module_name}) endfunction(add_bluelib_module) + +function(add_bluelib_mm_module) + 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(short_module_name ${arg_NAME}) + set(module_name ${arg_NAME}-mm) + + file(GLOB sources + *.c *.h + *.cpp *.hpp) + + foreach (dir ${arg_SUBDIRS}) + file(GLOB dir_sources + ${dir}/*.c ${dir}/*.h + ${dir}/*.cpp ${dir}/*.hpp) + set(sources ${sources} ${dir_sources}) + endforeach (dir) + + file(GLOB sys_sources + sys/${b_system_name}/*.c sys/${b_system_name}/*.h + sys/${b_system_name}/*.cpp sys/${b_system_name}/*.hpp) + set(root_header include/blue/${short_module_name}.hpp) + file(GLOB headers include/blue/${short_module_name}/*.hpp) + + string(REPLACE "-" "_" module_preproc_token ${short_module_name}) + string(TOUPPER ${module_preproc_token} module_preproc_token) + set(module_preproc_token BLUELIB_${module_preproc_token}) + + message(STATUS "Building mm module ${short_module_name} (shared)") + add_library(blue-${module_name} SHARED + ${sources} + ${sys_sources} + ${root_header} + ${headers} + ${arg_EXTRA_SOURCES}) + message(STATUS "Building mm module ${short_module_name} (static)") + add_library(blue-${module_name}-s STATIC + ${sources} + ${sys_sources} + ${root_header} + ${headers} + ${arg_EXTRA_SOURCES}) + + target_include_directories(blue-${module_name} PUBLIC include/) + target_include_directories(blue-${module_name}-s PUBLIC include/) + + target_compile_definitions(blue-${module_name} PUBLIC + ${module_preproc_token} + BLUELIB_EXPORT=1) + target_compile_definitions(blue-${module_name}-s PUBLIC + ${module_preproc_token} + BLUELIB_EXPORT=1 + BLUELIB_STATIC=1) + + set_target_properties(blue-${module_name} + PROPERTIES POSITION_INDEPENDENT_CODE ON) + + foreach (dep ${arg_DEPENDENCIES}) + target_link_libraries(blue-${module_name} blue-${dep}) + target_link_libraries(blue-${module_name}-s blue-${dep}-s) + endforeach (dep) + + foreach (lib ${arg_LIBS}) + target_link_libraries(blue-${module_name} ${lib}) + target_link_libraries(blue-${module_name}-s ${lib}) + endforeach (lib) + + foreach (dir ${arg_INCLUDE_DIRS}) + target_include_directories(blue-${module_name} PRIVATE + ${dir}) + target_include_directories(blue-${module_name}-s PRIVATE + ${dir}) + endforeach (dir) + + foreach (def ${arg_DEFINES}) + target_compile_definitions(blue-${module_name} PRIVATE + ${def}) + target_compile_definitions(blue-${module_name}-s PRIVATE + ${def}) + endforeach (def) + + set_target_properties(blue-${module_name} PROPERTIES + FOLDER "mm/Shared/${short_module_name}") + set_target_properties(blue-${module_name}-s PROPERTIES + FOLDER "mm/Static/${short_module_name}") + + TEST_BIG_ENDIAN(IS_BIG_ENDIAN) + if(IS_BIG_ENDIAN) + target_compile_definitions(blue-${module_name} PRIVATE + BIG_ENDIAN) + target_compile_definitions(blue-${module_name}-s PRIVATE + BIG_ENDIAN) + else() + target_compile_definitions(blue-${module_name} PRIVATE + LITTLE_ENDIAN) + target_compile_definitions(blue-${module_name}-s PRIVATE + LITTLE_ENDIAN) + endif() + + install(TARGETS blue-${module_name} blue-${module_name}-s) + install(FILES ${root_header} DESTINATION include/blue) + install(FILES ${headers} DESTINATION include/blue/${short_module_name}) +endfunction(add_bluelib_mm_module)