diff --git a/cmake/boardcore.cmake b/cmake/boardcore.cmake index 4f3bbd20ffbd90bb706f15c2e0ae8cc89c0dfee8..e0ee49b617aabc6b157eff7769f7f0dff8918796 100644 --- a/cmake/boardcore.cmake +++ b/cmake/boardcore.cmake @@ -26,6 +26,7 @@ cmake_path(GET CMAKE_CURRENT_LIST_DIR PARENT_PATH BOARDCORE_PATH) include(${BOARDCORE_PATH}/cmake/dependencies.cmake) include(${BOARDCORE_PATH}/cmake/boardcore-host.cmake) include(${BOARDCORE_PATH}/cmake/boards.cmake) +# include(${SBS_BASE}/libs/miosix-kernel/miosix/cmake/cmake-utils/cmake/LLVMIRUtil.cmake) set(ASPIS_BASE_PATH ~/ASPIS) set(ASPIS_PASSES_PATH ${ASPIS_BASE_PATH}/build/passes) @@ -148,6 +149,33 @@ set(DUPLICATE_SRC # set(CMAKE_LINKER "${BASE_MIOSIX_TOOLCHAIN}/bin/arm-miosix-eabi-ld") # using patched miosix linker # add_link_options("-fuse-ld=${CMAKE_LINKER}") +function(add_options_boardcore_library LIB) + # Only one include directory for Boardcore! + target_include_directories(${LIB} PUBLIC ${BOARDCORE_PATH}/src/shared) + + # Define DEBUG when in Debug mode + target_compile_definitions(${LIB} PUBLIC $<$<CONFIG:Debug>:DEBUG>) + target_compile_options(${LIB} PUBLIC -gdwarf-4) + + # Link libraries + target_link_libraries(${LIB} PUBLIC + $<TARGET_OBJECTS:Miosix::Boot::${BOARD_NAME}> + $<LINK_GROUP:RESCAN,Miosix::Kernel::${BOARD_NAME},stdc++,c,m,gcc,atomic> + TSCPP::TSCPP + Eigen3::Eigen + fmt::fmt-header-only + Catch2::Catch2 + Mavlink::Mavlink + ) + + # Link MxGui if supported by the target + if(DEFINED MXGUI_BASE_BOARD_NAME) + target_link_libraries(${LIB} PUBLIC MxGui::${MXGUI_BASE_BOARD_NAME}) + elseif(TARGET MxGui::${BOARD_NAME}) + target_link_libraries(${LIB} PUBLIC MxGui::${BOARD_NAME}) + endif() +endfunction() + # Creates the Skyward::Boardcore::${BOARD_NAME} library function(add_boardcore_library BOARD_OPTIONS_FILE) # Get board options @@ -156,118 +184,84 @@ function(add_boardcore_library BOARD_OPTIONS_FILE) # Create a library for the duplications set(DUPLICATION_LIB duplication-${BOARD_NAME}) add_library(${DUPLICATION_LIB} STATIC EXCLUDE_FROM_ALL ${DUPLICATE_SRC}) - target_compile_options(${DUPLICATION_LIB} PUBLIC ${CMAKE_CXX_FLAGS} -flto) + target_compile_options(${DUPLICATION_LIB} PRIVATE -S -emit-llvm) + target_link_libraries(${DUPLICATION_LIB} PUBLIC Miosix::Interface::${BOARD_NAME}) # Create a library for the board set(BOARDCORE_LIB boardcore-${BOARD_NAME}) add_library(${BOARDCORE_LIB} STATIC EXCLUDE_FROM_ALL ${BOARDCORE_SRC}) - target_compile_options(${BOARDCORE_LIB} PUBLIC ${CMAKE_CXX_FLAGS} -flto) + target_compile_options(${BOARDCORE_LIB} PRIVATE -S -emit-llvm) + target_link_libraries(${BOARDCORE_LIB} PUBLIC Miosix::Interface::${BOARD_NAME}) # Create list of compiled duplicated sources for each board set(DUPLICATE_COMPILED_SOURCES DUPLICATE_COMP-${BOARD_NAME}) list(TRANSFORM DUPLICATE_SRC APPEND ".o" OUTPUT_VARIABLE DUPLICATE_COMPILED_SOURCES) list(TRANSFORM DUPLICATE_COMPILED_SOURCES REPLACE ${BOARDCORE_PATH} "") - list(TRANSFORM DUPLICATE_COMPILED_SOURCES PREPEND ${BOARDCORE_PATH}/build/CMakeFiles/${DUPLICATION_LIB}.dir) + list(TRANSFORM DUPLICATE_COMPILED_SOURCES PREPEND ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${DUPLICATION_LIB}.dir) # Create list of compiled boardcore sources for each board set(BOARDCORE_COMPILED_SOURCES ${BOARDCORE_COMP-${BOARD_NAME}}) list(TRANSFORM BOARDCORE_SRC APPEND ".o" OUTPUT_VARIABLE BOARDCORE_COMPILED_SOURCES) list(TRANSFORM BOARDCORE_COMPILED_SOURCES REPLACE ${BOARDCORE_PATH} "") - list(TRANSFORM BOARDCORE_COMPILED_SOURCES PREPEND ${BOARDCORE_PATH}/build/CMakeFiles/${BOARDCORE_LIB}.dir) + list(TRANSFORM BOARDCORE_COMPILED_SOURCES PREPEND ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${BOARDCORE_LIB}.dir) - add_custom_command( OUTPUT duplicated-${BOARD_NAME}.ll.bak - COMMAND echo ${DUPLICATE_COMPILED_SOURCES} - COMMAND echo "STARTING DUPLICATED *.cpp.o" - COMMAND pwd COMMAND llvm-link ${DUPLICATE_COMPILED_SOURCES} -o duplication-${BOARD_NAME}.ll # COMMAND llvm-link -v CMakeFiles/duplication-stm32f767zi_compute_unit.dir/src/tests/aspis/ -o linked-${BOARD_NAME}.ll COMMAND opt --bugpoint-enable-legacy-pm -load ${ASPIS_PASSES_PATH}/libEDDI.so -func_ret_to_ref duplication-${BOARD_NAME}.ll -o funcToRef.ll COMMAND opt --bugpoint-enable-legacy-pm -load ${ASPIS_PASSES_PATH}/libEDDI.so -eddi_verify funcToRef.ll -o dataProtection.ll COMMAND opt --bugpoint-enable-legacy-pm -simplifycfg dataProtection.ll -o simplifycfg.ll COMMAND opt --bugpoint-enable-legacy-pm -load ${ASPIS_PASSES_PATH}/libRASM.so -rasm_verify simplifycfg.ll -o duplicated-${BOARD_NAME}.ll.bak - COMMAND echo "REMOVING ALL *.ll" - COMMAND rm *.ll DEPENDS $<TARGET_FILE:${DUPLICATION_LIB}> COMMENT "Applying ASPIS passes: duplicated-${BOARD_NAME}.ll.bak" ) - # add_custom_command( - # TARGET ${DUPLICATION_LIB} POST_BUILD - # COMMAND echo "STARTING DUPLICATED *.ll" - # COMMAND llvm-link ${DUPLICATION_LIB} -o linked-${BOARD_NAME}.ll - # COMMAND opt --bugpoint-enable-legacy-pm -load ${ASPIS_PASSES_PATH}/libEDDI.so -func_ret_to_ref duplication-${BOARD_NAME}.ll -o funcToRef.ll - # COMMAND opt --bugpoint-enable-legacy-pm -load ${ASPIS_PASSES_PATH}/libEDDI.so -eddi_verify funcToRef.ll -o dataProtection.ll - # COMMAND opt --bugpoint-enable-legacy-pm -simplifycfg dataProtection.ll -o simplifycfg.ll - # COMMAND opt --bugpoint-enable-legacy-pm -load ${ASPIS_PASSES_PATH}/libRASM.so -rasm_verify simplifycfg.ll -o duplicated-${BOARD_NAME}.ll.bak - # COMMAND echo "REMOVING ALL *.ll" - # COMMAND rm *.ll - # BYPRODUCTS duplicated-${BOARD_NAME}.ll.bak - # DEPENDS $<TARGET_FILE:${DUPLICATION_LIB}> - # COMMENT "Applying ASPIS passes: duplicated-${BOARD_NAME}.ll.bak" - # VERBATIM - # ) - - # add_custom_command( - # TARGET ${TARGET} POST_BUILD - # COMMAND ${CMAKE_OBJCOPY} -O ihex ${TARGET} ${TARGET}.hex - # COMMAND ${CMAKE_OBJCOPY} -O binary ${TARGET} ${TARGET}.bin - # BYPRODUCTS ${TARGET}.hex ${TARGET}.bin - # VERBATIM - # ) - - - # Only one include directory for Boardcore! - target_include_directories(${BOARDCORE_LIB} PUBLIC ${BOARDCORE_PATH}/src/shared) - - # Define DEBUG when in Debug mode - target_compile_definitions(${BOARDCORE_LIB} PUBLIC $<$<CONFIG:Debug>:DEBUG>) - - # Link libraries - target_link_libraries(${BOARDCORE_LIB} PUBLIC - $<TARGET_OBJECTS:Miosix::Boot::${BOARD_NAME}> - $<LINK_GROUP:RESCAN,Miosix::Kernel::${BOARD_NAME},stdc++,c,m,gcc,atomic> - TSCPP::TSCPP - Eigen3::Eigen - fmt::fmt-header-only - Catch2::Catch2 - Mavlink::Mavlink - ${DUPLICATION_LIB} - ) - - # Link MxGui if supported by the target - if(DEFINED MXGUI_BASE_BOARD_NAME) - target_link_libraries(${BOARDCORE_LIB} PUBLIC MxGui::${MXGUI_BASE_BOARD_NAME}) - elseif(TARGET MxGui::${BOARD_NAME}) - target_link_libraries(${BOARDCORE_LIB} PUBLIC MxGui::${BOARD_NAME}) - endif() - + add_options_boardcore_library(${BOARDCORE_LIB}) + add_options_boardcore_library(${DUPLICATION_LIB}) + target_link_libraries(${BOARDCORE_LIB} PUBLIC ${DUPLICATION_LIB}) + add_custom_command( - OUTPUT out-${BOARD_NAME}.ll + OUTPUT out-${BOARD_NAME}.bc # TARGET ${BOARDCORE_LIB} POST_BUILD - COMMAND echo ${BOARDCORE_COMPILED_SOURCES} - COMMAND echo "STARTING BOARDCORE *.cpp.o" - COMMAND pwd COMMAND llvm-link ${BOARDCORE_COMPILED_SOURCES} duplicated-${BOARD_NAME}.ll.bak -o linked-${BOARD_NAME}.ll - COMMAND opt --bugpoint-enable-legacy-pm -load ${ASPIS_PASSES_PATH}/libEDDI.so -duplicate_globals linked-${BOARD_NAME}.ll -o out-${BOARD_NAME}.ll.bak + COMMAND opt --bugpoint-enable-legacy-pm -load ${ASPIS_PASSES_PATH}/libEDDI.so -duplicate_globals linked-${BOARD_NAME}.ll -o out-${BOARD_NAME}.bc.bak COMMAND rm *.ll - COMMAND mv out-${BOARD_NAME}.ll.bak out-${BOARD_NAME}.ll + COMMAND mv out-${BOARD_NAME}.bc.bak out-${BOARD_NAME}.bc + # COMMAND clang ${COMPILE_FLAGS} ${COMPILE_DEFINITIONS} ${INCLUDE_DIRECTORIES} -c -o compiled-${BOARD_NAME}.o out-${BOARD_NAME}.bc + # COMMAND llvm-ar r libboardcore-lib-${BOARD_NAME}.a compiled-${BOARD_NAME}.o + # COMMAND llc -filetype=obj -o compiled-${BOARD_NAME} out-${BOARD_NAME}.bc DEPENDS duplicated-${BOARD_NAME}.ll.bak $<TARGET_FILE:${BOARDCORE_LIB}> - COMMENT "Applying ASPIS passes: out-${BOARD_NAME}.ll" + COMMENT "Applying ASPIS passes: out-${BOARD_NAME}.bc" ) - # add_dependencies(out-${BOARD_NAME}.ll ${BOARDCORE_LIB}) - # add_dependencies(out-${BOARD_NAME}.ll duplicated-${BOARD_NAME}.ll.bak) - - set(BOARDCORE_FINAL boardcore-lib-${BOARD_NAME}) - add_library(${BOARDCORE_FINAL} STATIC EXCLUDE_FROM_ALL out-${BOARD_NAME}.ll) - target_link_libraries(${BOARDCORE_FINAL} PUBLIC ${BOARDCORE_LIB}) - # add_custom_target(boardcore-target-${BOARD_NAME} ALL DEPENDS out-${BOARD_NAME}.ll) - # add_dependencies(boardcore-target-${BOARD_NAME} ${BOARDCORE_LIB}) + add_custom_target( + libboardcore-target-${BOARD_NAME} + DEPENDS out-${BOARD_NAME}.bc + ) + # IMPORTANT! $<TARGET_PROPERTY:${BOARDCORE_LIB},COMPILE_OPTIONS> - # add_custom_target(duplicated-target-${BOARD_NAME} DEPENDS duplicated-${BOARD_NAME}.ll.bak) - # add_dependencies(duplicated-target-${BOARD_NAME} ${BOARDCORE_LIB}) + set(BOARDCORE_FINAL boardcore-lib-${BOARD_NAME}) + add_library(${BOARDCORE_FINAL} STATIC EXCLUDE_FROM_ALL ${CMAKE_CURRENT_BINARY_DIR}/out-${BOARD_NAME}.bc) + target_link_libraries(${BOARDCORE_FINAL} PUBLIC Miosix::Interface::${BOARD_NAME}) + add_options_boardcore_library(${BOARDCORE_FINAL}) + add_dependencies(libboardcore-target-${BOARD_NAME} ${BOARDCORE_LIB}) + add_dependencies(${BOARDCORE_FINAL} libboardcore-target-${BOARD_NAME}) + add_dependencies(${BOARDCORE_FINAL} ${BOARDCORE_LIB}) + + ### Trying imported library + # add_library(${BOARDCORE_FINAL} STATIC IMPORTED) + # add_dependencies(${BOARDCORE_FINAL} libboardcore-target-${BOARD_NAME}) + # set_target_properties(${BOARDCORE_FINAL} PROPERTIES IMPORTED_LOCATION libboardcore-lib-${BOARD_NAME}.a) + # target_link_libraries(${BOARDCORE_FINAL} INTERFACE Miosix::Interface::${BOARD_NAME}) + + ### Trying using the utility + # llvmir_attach_library(${BOARDCORE_FINAL} out-${BOARD_NAME}.bc STATIC EXCLUDE_FROM_ALL) + + # add_library(${BOARDCORE_FINAL} STATIC EXCLUDE_FROM_ALL compiled-${BOARD_NAME}) + # add_dependencies(${BOARDCORE_FINAL} ${BOARDCORE_LIB}) + # target_link_libraries(${BOARDCORE_FINAL} PUBLIC ${BOARDCORE_LIB} ${CMAKE_CURRENT_BINARY_DIR}/out-${BOARD_NAME}.bc) + # set_target_properties(${BOARDCORE_FINAL} PROPERTIES LINKER_LANGUAGE CXX) # Create a nice alias for the library add_library(Skyward::Boardcore::${BOARD_NAME} ALIAS ${BOARDCORE_FINAL})