diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..aaf8548 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,37 @@ +cmake_minimum_required(VERSION 3.10) +project(toplevel LANGUAGES C) + +add_subdirectory(libraries) + +set(ALL_MY_PROJECT_TARGETS "" CACHE INTERNAL "Global list") + +# Function to recursively collect all targets +function(get_all_project_targets _target_list_var _current_dir) + # Get targets defined directly in the current directory + get_property(_targets_in_dir DIRECTORY "${_current_dir}" PROPERTY BUILDSYSTEM_TARGETS) + message("_targets_in_dir: ${_targets_in_dir}") + list(APPEND _ALL_MY_PROJECT_TARGETS ${ALL_MY_PROJECT_TARGETS} ${_targets_in_dir}) + set(ALL_MY_PROJECT_TARGETS ${_ALL_MY_PROJECT_TARGETS} "" CACHE INTERNAL "") + message("ALL_MY_PROJECT_TARGETS: ${ALL_MY_PROJECT_TARGETS}") + + # Get subdirectories of the current directory + get_property(_subdirs DIRECTORY "${_current_dir}" PROPERTY SUBDIRECTORIES) + foreach(_subdir IN LISTS _subdirs) + # Recursively call for each subdirectory + message("_subdir: ${_subdir}") + get_all_project_targets(${_target_list_var} "${_subdir}") + endforeach() +endfunction() + +# Call the function from the top-level CMakeLists.txt +get_all_project_targets(ALL_MY_PROJECT_TARGETS "${CMAKE_CURRENT_SOURCE_DIR}") + +# Print the list of all targets +message("All CMake Targets in this project:") +foreach(target_name IN LISTS ALL_MY_PROJECT_TARGETS) + message("- ${target_name}") +endforeach() + +# Do stuff +add_executable(${PROJECT_NAME}-exe main.c) +target_link_libraries(${PROJECT_NAME}-exe library_a-lib library_b-lib) diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..1d83ff4 --- /dev/null +++ b/Makefile @@ -0,0 +1,6 @@ +run: build + cmake --build build +build: + cmake -S . -B $@ +clean: + rm -Rf build diff --git a/libraries/CMakeLists.txt b/libraries/CMakeLists.txt new file mode 100644 index 0000000..4b2ea4c --- /dev/null +++ b/libraries/CMakeLists.txt @@ -0,0 +1,4 @@ +cmake_minimum_required(VERSION 3.10) + +add_subdirectory(library_a) +add_subdirectory(library_b) diff --git a/libraries/library_a/CMakeLists.txt b/libraries/library_a/CMakeLists.txt new file mode 100644 index 0000000..a4d4f8c --- /dev/null +++ b/libraries/library_a/CMakeLists.txt @@ -0,0 +1,4 @@ +cmake_minimum_required(VERSION 3.10) +project(library_a LANGUAGES C) + +add_library(${PROJECT_NAME}-lib OBJECT library_a.c) diff --git a/libraries/library_a/library_a.c b/libraries/library_a/library_a.c new file mode 100644 index 0000000..dca809f --- /dev/null +++ b/libraries/library_a/library_a.c @@ -0,0 +1,6 @@ +#include +int library_a(void) +{ + printf("%s\n", __func__); + return 0; +} diff --git a/libraries/library_b/CMakeLists.txt b/libraries/library_b/CMakeLists.txt new file mode 100644 index 0000000..1b38896 --- /dev/null +++ b/libraries/library_b/CMakeLists.txt @@ -0,0 +1,4 @@ +cmake_minimum_required(VERSION 3.10) +project(library_b LANGUAGES C) + +add_library(${PROJECT_NAME}-lib OBJECT library_b.c) diff --git a/libraries/library_b/library_b.c b/libraries/library_b/library_b.c new file mode 100644 index 0000000..ab421f3 --- /dev/null +++ b/libraries/library_b/library_b.c @@ -0,0 +1,7 @@ +#include + +int library_b(void) +{ + printf("%s\n", __func__); + return 0; +} diff --git a/main.c b/main.c new file mode 100644 index 0000000..64dd5a3 --- /dev/null +++ b/main.c @@ -0,0 +1,12 @@ +#include + +int library_a(void); +int library_b(void); + +int main(void) +{ + printf("%s\n", __func__); + library_a(); + library_b(); + return 0; +}