Selaa lähdekoodia

Modify cmake. Find toolchain automatically.Fix undefined reference to __dso_handle bug

zhaozhongxiang 7 vuotta sitten
vanhempi
sitoutus
fbbcb342f7

+ 2 - 3
CMakeLists.txt

@@ -6,6 +6,8 @@ set(BUILDING_SDK "yes" CACHE INTERNAL "")
 # basic config
 if (NOT PROJ)
     message(FATAL_ERROR "PROJ must be set. e.g. -DPROJ=hello_world")
+else()
+    message("PROJ = ${PROJ}")
 endif ()
 cmake_minimum_required(VERSION 3.0)
 include(./cmake/common.cmake)
@@ -17,9 +19,6 @@ header_directories(${SDK_ROOT}/lib)
 # build library first
 add_subdirectory(lib)
 
-# TODO
-#add_subdirectory(third_party)
-
 # compile project
 add_source_files(src/${PROJ}/*.c src/${PROJ}/*.s src/${PROJ}/*.S src/${PROJ}/*.cpp)
 include(./cmake/executable.cmake)

+ 1 - 1
cmake/common.cmake

@@ -20,7 +20,7 @@ IF (CMAKE_BUILD_TYPE STREQUAL Debug)
 ENDIF ()
 
 # definitions in macros
-add_definitions(-DCONFIG_LOG_LEVEL=LOG_VERBOSE -DCONFIG_LOG_ENABLE -DCONFIG_LOG_COLORS -DLOG_KERNEL -D__riscv64 -DFPGA_PLL)
+add_definitions(-DCONFIG_LOG_LEVEL=LOG_VERBOSE -DCONFIG_LOG_ENABLE -DCONFIG_LOG_COLORS -DLOG_KERNEL -D__riscv64)
 
 if (NOT SDK_ROOT)
     get_filename_component(_SDK_ROOT ${CMAKE_CURRENT_LIST_DIR} DIRECTORY)

+ 2 - 2
cmake/compile-flags.cmake

@@ -23,7 +23,7 @@ add_compile_flags(BOTH
         -ggdb
         )
 
-add_compile_flags(C -std=gnu11)
+add_compile_flags(C -std=gnu11 -Wno-pointer-to-int-cast)
 add_compile_flags(CXX -std=gnu++17)
 
 if (BUILDING_SDK)
@@ -42,9 +42,9 @@ if (BUILDING_SDK)
 			-Wno-error=return-type
 			-Wno-error=pointer-sign
 			-Wno-missing-braces
-			-Wno-pointer-to-int-cast
 			-Wno-strict-aliasing
 			-Wno-implicit-fallthrough
+			-Wno-missing-field-initializers
             )
 
     add_compile_flags(C -Wno-old-style-declaration)

+ 10 - 1
cmake/dump-config.cmake

@@ -1,13 +1,22 @@
 message("")
 message("Project: ${PROJECT_NAME}")
+message("  LIST_FILE=${CMAKE_PARENT_LIST_FILE}")
 message("  TOOLCHAIN=${TOOLCHAIN}")
-message("  KENDRYTE IDE=${KENDRYTE_IDE}")
+message("  KENDRYTE_IDE=${KENDRYTE_IDE}")
+message("  BUILDING_SDK=${BUILDING_SDK}")
 message("")
 message("  CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}")
 message("  CMAKE_C_COMPILER=${CMAKE_C_COMPILER}")
 message("  CMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}")
 message("  CMAKE_LINKER=${CMAKE_LINKER}")
 message("  CMAKE_OBJCOPY=${CMAKE_OBJCOPY}")
+message("  CMAKE_OBJDUMP=${CMAKE_OBJDUMP}")
+message("  CMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}")
+message("")
+message("  CMAKE_C_FLAGS=${CMAKE_C_FLAGS}")
+message("  CMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}")
+message("  LDFLAGS=${LDFLAGS}")
+message("  CMAKE_BINARY_DIR=${CMAKE_BINARY_DIR}")
 message("Makefile created.")
 message("")
 message("")

+ 6 - 9
cmake/executable.cmake

@@ -1,13 +1,15 @@
 if (NOT BUILDING_SDK)
     add_library(kendryte STATIC IMPORTED)
-    set_property(TARGET kendryte PROPERTY IMPORTED_LOCATION ${SDK_ROOT}/libmaix.a)
+    set_property(TARGET kendryte PROPERTY IMPORTED_LOCATION ${SDK_ROOT}/libkendryte.a)
     include_directories(${SDK_ROOT}/include/)
 endif ()
 
+removeDuplicateSubstring(${CMAKE_C_FLAGS} CMAKE_C_FLAGS)
+removeDuplicateSubstring(${CMAKE_CXX_FLAGS} CMAKE_CXX_FLAGS)
+
+message("SOURCE_FILES=${SOURCE_FILES}")
 add_executable(${PROJECT_NAME} ${SOURCE_FILES})
-# add_dependencies(${PROJECT_NAME} kendryte) # TODO: third_party
-# target_link_libraries(${PROJECT_NAME} kendryte) # TODO: third_party
-# link_directories(${CMAKE_BINARY_DIR})
+
 
 set_target_properties(${PROJECT_NAME} PROPERTIES LINKER_LANGUAGE C)
 
@@ -21,16 +23,11 @@ IF(SUFFIX)
     SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES SUFFIX ${SUFFIX})
 ENDIF()
 
-#message("CMAKE_OBJCOPY=${CMAKE_OBJCOPY}")
-
 # Build target
 add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
         COMMAND ${CMAKE_OBJCOPY} --output-format=binary ${CMAKE_BINARY_DIR}/${PROJECT_NAME}${SUFFIX} ${CMAKE_BINARY_DIR}/${PROJECT_NAME}.bin
         DEPENDS ${PROJECT_NAME}
         COMMENT "Generating .bin file ...")
 
-
-add_custom_target(firmware DEPENDS ${PROJECT_NAME}.firmware.bin)
-
 # show information
 include(${CMAKE_CURRENT_LIST_DIR}/dump-config.cmake)

+ 7 - 0
cmake/macros.cmake

@@ -36,6 +36,13 @@ global_set(CMAKE_EXE_LINKER_FLAGS "")
 global_set(CMAKE_SHARED_LINKER_FLAGS "")
 global_set(CMAKE_MODULE_LINKER_FLAGS "")
 
+function(removeDuplicateSubstring stringIn stringOut)
+    separate_arguments(stringIn)
+    list(REMOVE_DUPLICATES stringIn)
+    string(REPLACE ";" " " stringIn "${stringIn}")
+    set(${stringOut} "${stringIn}" PARENT_SCOPE)
+endfunction()
+
 macro(add_compile_flags WHERE)
     JOIN("${ARGN}" " " STRING_ARGS)
     if (${WHERE} STREQUAL C)

+ 33 - 11
cmake/toolchain.cmake

@@ -1,20 +1,42 @@
-if (NOT TOOLCHAIN)
-    message(FATAL_ERROR "TOOLCHAIN must be set, to absolute path of kendryte-toolchain dist/bin folder.")
-endif ()
-
 if (WIN32)
     set(EXT ".exe")
 else ()
     set(EXT "")
 endif ()
 
-condition_set(CMAKE_C_COMPILER "${TOOLCHAIN}/riscv64-unknown-elf-gcc${EXT}" CACHE INTERNAL "")
-condition_set(CMAKE_CXX_COMPILER "${TOOLCHAIN}/riscv64-unknown-elf-g++${EXT}" CACHE INTERNAL "")
-condition_set(CMAKE_LINKER "${TOOLCHAIN}/riscv64-unknown-elf-ld${EXT}" CACHE INTERNAL "")
-condition_set(CMAKE_AR "${TOOLCHAIN}/riscv64-unknown-elf-ar${EXT}" CACHE INTERNAL "")
-condition_set(CMAKE_CXX_COMPILER_AR "${CMAKE_AR}${EXT}" CACHE INTERNAL "")
-condition_set(CMAKE_C_COMPILER_AR "${CMAKE_AR}${EXT}" CACHE INTERNAL "")
-condition_set(CMAKE_OBJCOPY "${TOOLCHAIN}/riscv64-unknown-elf-objcopy${EXT}" CACHE INTERNAL "")
+message(STATUS "Check for RISCV toolchain ...")
+if(NOT TOOLCHAIN)
+    find_path(_TOOLCHAIN riscv64-unknown-elf-gcc${EXT})
+    global_set(TOOLCHAIN "${_TOOLCHAIN}")
+elseif(NOT "${TOOLCHAIN}" MATCHES "/$")
+    global_set(TOOLCHAIN "${TOOLCHAIN}")
+endif()
+
+if (NOT TOOLCHAIN)
+    message(FATAL_ERROR "TOOLCHAIN must be set, to absolute path of kendryte-toolchain dist/bin folder.")
+endif ()
+
+message(STATUS "Using ${TOOLCHAIN} RISCV toolchain")
+
+global_set(CMAKE_C_COMPILER "${TOOLCHAIN}/riscv64-unknown-elf-gcc${EXT}")
+global_set(CMAKE_CXX_COMPILER "${TOOLCHAIN}/riscv64-unknown-elf-g++${EXT}")
+global_set(CMAKE_LINKER "${TOOLCHAIN}/riscv64-unknown-elf-ld${EXT}")
+global_set(CMAKE_AR "${TOOLCHAIN}/riscv64-unknown-elf-ar${EXT}")
+global_set(CMAKE_OBJCOPY "${TOOLCHAIN}/riscv64-unknown-elf-objcopy${EXT}")
+global_set(CMAKE_SIZE "${TOOLCHAIN}/riscv64-unknown-elf-size${EXT}")
+global_set(CMAKE_OBJDUMP "${TOOLCHAIN}/riscv64-unknown-elf-objdump${EXT}")
+
+execute_process(COMMAND ${CMAKE_C_COMPILER} -print-file-name=crt0.o OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE CRT0_OBJ)
+execute_process(COMMAND ${CMAKE_C_COMPILER} -print-file-name=crtbegin.o OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE CRTBEGIN_OBJ)
+execute_process(COMMAND ${CMAKE_C_COMPILER} -print-file-name=crtend.o OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE CRTEND_OBJ)
+execute_process(COMMAND ${CMAKE_C_COMPILER} -print-file-name=crti.o OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE CRTI_OBJ)
+execute_process(COMMAND ${CMAKE_C_COMPILER} -print-file-name=crtn.o OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE CRTN_OBJ)
+
+global_set(CMAKE_C_LINK_EXECUTABLE
+        "<CMAKE_C_COMPILER>  <FLAGS> <CMAKE_C_LINK_FLAGS> <LINK_FLAGS> \"${CRTI_OBJ}\" \"${CRTBEGIN_OBJ}\" <OBJECTS> \"${CRTEND_OBJ}\" \"${CRTN_OBJ}\" -o <TARGET> <LINK_LIBRARIES>")
+
+global_set(CMAKE_CXX_LINK_EXECUTABLE
+        "<CMAKE_CXX_COMPILER>  <FLAGS> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> \"${CRTI_OBJ}\" \"${CRTBEGIN_OBJ}\" <OBJECTS> \"${CRTEND_OBJ}\" \"${CRTN_OBJ}\" -o <TARGET> <LINK_LIBRARIES>")
 
 get_filename_component(_BIN_DIR "${CMAKE_C_COMPILER}" DIRECTORY)
 if (NOT "${TOOLCHAIN}" STREQUAL "${_BIN_DIR}")

+ 1 - 7
lib/CMakeLists.txt

@@ -16,17 +16,11 @@ FILE(GLOB_RECURSE ASSEMBLY_FILES
         "${CMAKE_CURRENT_LIST_DIR}/*.S"
         )
 
-include_directories(${CMAKE_CURRENT_LIST_DIR}/drivers/include ${CMAKE_CURRENT_LIST_DIR}/bsp/include ${CMAKE_CURRENT_LIST_DIR}/firmware/include)
-#
-#HEADER_DIRECTORIES(LIB_HEADERS)
-#
-#INCLUDE_DIRECTORIES(${LIB_HEADERS})
+include_directories(${CMAKE_CURRENT_LIST_DIR}/drivers/include ${CMAKE_CURRENT_LIST_DIR}/bsp/include)
 
 SET_PROPERTY(SOURCE ${ASSEMBLY_FILES} PROPERTY LANGUAGE C)
 SET_SOURCE_FILES_PROPERTIES(${ASSEMBLY_FILES} PROPERTIES COMPILE_FLAGS "-x assembler-with-cpp -D __riscv64")
 
-#MESSAGE("CMAKE_C_FLAGS: ${CMAKE_C_FLAGS}")
-
 ADD_LIBRARY(kendryte
         ${LIB_SRC}
         )