三种使用CMake构建工程添加子目录的方法
文件目录结构
.
├── CMakeLists.txt
├── inc
│ ├── ansi_def.h
│ ├── ansi.h
│ ├── ansi_port.h
│ ├── nr_micro_shell_config.h
│ └── nr_micro_shell.h
├── main.c
├── nr_micro_shell_commands.c
└── src
├── ansi.c
├── ansi_port.c
├── CMakeLists.txt
└── nr_micro_shell.c
2 directories, 12 files
1. src不需要添加CMakeLists.txt,直接使用aux_source_directory讲src目录添加进工程,根目录CMakeLists.txt内容:
cmake_minimum_required( VERSION 3.0 )
project (nr_micro VERSION 1.0 LANGUAGES C)
##############设置目标文件生成位置#####################
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib")
# define RUNTIME_INSTALL_DIR LIBRARY_INSTALL_DIR INCLUDE_INSTALL_DIR CONFIG_INSTALL_DIR
set (RUNTIME_INSTALL_DIR bin)
set (LIBRARY_INSTALL_DIR lib)
set (INCLUDE_INSTALL_DIR include)
#添加头文件包含路径
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/inc)
message(STATUS "${CMAKE_CURRENT_SOURCE_DIR}/inc")
#添加src子目录
add_subdirectory(src)
#添加根目录的源文件
aux_source_directory(. _SOURCES)
#添加src子目录所有源文件
aux_source_directory(src _SUB_SOURCES)
#指定生成的目标,依赖于根目录和sub下所有的源文件
add_executable(nr_micro ${_SOURCES} ${_SUB_SOURCES})
2.子目录src的CMakeLists.txt传包含子目录所有文件变量给根目录CMakeLists.txt,来构建工程
根目录CMakeLists.txt:
cmake_minimum_required( VERSION 3.0 )
project (nr_micro VERSION 1.0 LANGUAGES C)
##############设置目标文件生成位置#####################
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib")
# define RUNTIME_INSTALL_DIR LIBRARY_INSTALL_DIR INCLUDE_INSTALL_DIR CONFIG_INSTALL_DIR
set (RUNTIME_INSTALL_DIR bin)
set (LIBRARY_INSTALL_DIR lib)
set (INCLUDE_INSTALL_DIR include)
#添加头文件包含路径
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/inc)
message(STATUS "${CMAKE_CURRENT_SOURCE_DIR}/inc")
#添加src子目录
add_subdirectory(src)
#添加根目录的源文件
aux_source_directory(. _SOURCES)
#指定生成的目标,依赖于根目录_SOURCES内容和包含子目录内容的变量_SUB_SOURCES
add_executable(nr_micro ${_SOURCES} ${_SUB_SOURCES})
#add_executable(nr_micro ${_SOURCES})
子目录CMakeLists.txt:
#子目录所有文件赋值给 _SUB_SOURCES变量
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR} _SUB_SOURCES)
message(STATUS _SUB_SOURCES=${_SUB_SOURCES})
#设置_SUB_SOURCES变量,让它能被根目录访问
set(_SUB_SOURCES ${_SUB_SOURCES} PARENT_SCOPE)
3.根目录CMakeLists.txt下包含根目录所有文件的变量,在子目录CMakeLists.txt中使用list APPEND追加内容,构建工程:
根目录CMakeLists.txt:
cmake_minimum_required( VERSION 3.0 )
project (nr_micro VERSION 1.0 LANGUAGES C)
##############设置目标文件生成位置#####################
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib")
# define RUNTIME_INSTALL_DIR LIBRARY_INSTALL_DIR INCLUDE_INSTALL_DIR CONFIG_INSTALL_DIR
set (RUNTIME_INSTALL_DIR bin)
set (LIBRARY_INSTALL_DIR lib)
set (INCLUDE_INSTALL_DIR include)
#添加头文件包含路径
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/inc)
message(STATUS "${CMAKE_CURRENT_SOURCE_DIR}/inc")
#添加根目录的源文件
aux_source_directory(. _SOURCES)
#添加子文件目录
add_subdirectory(src)
#指定生成的目标,依赖于_SOURCES,此变量包含根目录和子目录所有文件
add_executable(nr_micro ${_SOURCES})
子目录CMakeLists.txt:
#添加子目录的源文件给_SUB_SOURCES
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR} _SUB_SOURCES)
#将子目录源文件,追加给根目录_SOURCES变量
list(APPEND _SOURCES ${_SUB_SOURCES})
#设置根目录_SOURCES变量在子目录有效
set(_SOURCES ${_SOURCES} PARENT_SCOPE)