On 08.08.2019 16:10, Frederick Gotham wrote:
>
> I'm working on a firmware project at the moment, it's running on embedded Linux for a 64-Bit ARM processor (aarch64).
>
> There's the main Makefile, which uses "make -C" to invoke further Makefiles in nested subdirectories. Altogether there's four thousand Makefiles.
If you don't produce one exe from those makefiles then you can make your
life simply and use one CMake file. Then you can use CMakeLists.txt:
[!!! NOT COMPLETE EXAMPLE NOR TESTED !!!]
cmake_minimum_required(VERSION 3.9.0)
project(MyProject)
set(CMAKE_CXX_STANDARD 14)
option(WARNINGS_NOT_ALLOWED "Warnings not allowed when compile." OFF)
option(BUILD_TESTS "Build tests." OFF)
list(APPEND HEADER_SUBDIRS Include Src)
list(APPEND SOURCE_SUBDIRS Src)
# List headers
foreach(DIR IN LISTS HEADER_SUBDIRS)
list(APPEND HEADER_EXPANDED_DIRS
${CMAKE_CURRENT_SOURCE_DIR}/${DIR}/*.h)
list(APPEND HEADER_EXPANDED_DIRS
${CMAKE_CURRENT_SOURCE_DIR}/${DIR}/*.hpp)
list(APPEND HEADER_EXPANDED_DIRS
${CMAKE_CURRENT_SOURCE_DIR}/${DIR}/*.hxx)
list(APPEND HEADER_EXPANDED_DIRS
${CMAKE_CURRENT_SOURCE_DIR}/${DIR}/*.h++)
endforeach()
file(GLOB_RECURSE HEADER_FILES FOLLOW_SYMLINKS ${HEADER_EXPANDED_DIRS})
# List sources
foreach(DIR IN LISTS SOURCE_SUBDIRS)
list(APPEND SOURCE_EXPANDED_DIRS
${CMAKE_CURRENT_SOURCE_DIR}/${DIR}/*.c)
list(APPEND SOURCE_EXPANDED_DIRS
${CMAKE_CURRENT_SOURCE_DIR}/${DIR}/*.cpp)
list(APPEND SOURCE_EXPANDED_DIRS
${CMAKE_CURRENT_SOURCE_DIR}/${DIR}/*.cxx)
list(APPEND SOURCE_EXPANDED_DIRS
${CMAKE_CURRENT_SOURCE_DIR}/${DIR}/*.c++)
endforeach()
file(GLOB_RECURSE SOURCE_FILES FOLLOW_SYMLINKS ${SOURCE_EXPANDED_DIRS})
add_executable(${PROJECT_NAME} ${SOURCE_FILES} ${HEADER_FILES})
# Add include dir
foreach(INCLUDE_DIR IN LISTS INCLUDE_DIRS)
message("INCLUDE_DIR: ${INCLUDE_DIR}")
target_include_directories(${PROJECT_NAME} PRIVATE ${INCLUDE_DIR})
endforeach()
# g++ compiler flags
if (CMAKE_COMPILER_IS_GNUCXX)
if(WARNINGS_NOT_ALLOWED)
message("Warnings not allowed.")
target_compile_options(${PROJECT_NAME} PRIVATE -Wall -Werror
-Wformat=2
-Wuninitialized -Winit-self -Wswitch-enum -Wundef
-Wpointer-arith -Wdisabled-optimization -Wcast-align
-Wcast-qual)
else()
message("Warnings allowed.")
target_compile_options(${PROJECT_NAME} PRIVATE -Wformat=2 -Wall
-Wuninitialized -Winit-self -Wswitch-enum -Wundef
-Wpointer-arith -Wdisabled-optimization -Wcast-align
-Wcast-qual)
endif()
endif()