gpt4 book ai didi

cmake - 如何以更少的样板形式编写我的 CMakeLists.txt?

转载 作者:行者123 更新时间:2023-12-02 03:47:58 25 4
gpt4 key购买 nike

在下面的示例中,我发现模式 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} xxx") 非常样板。 include_directories("${CMAKE_CURRENT_SOURCE_DIR}/...") 的情况相同。

能否简化一下书写?

cmake_minimum_required(VERSION 3.6)

set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR arm)

set(CROSS_COMPILE arm-none-eabi- )

set(CMAKE_C_COMPILER ${CROSS_COMPILE}gcc.exe)
set(CMAKE_CXX_COMPILER ${CROSS_COMPILE}g++.exe)
set(CMAKE_ASM_COMPILER ${CROSS_COMPILE}as.exe)

set(CMAKR_C_FLAGS "${CMAKR_C_FLAGS} -mlittle-endian")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mcpu=cortex-m4")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mthumb")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfpu=vfpv4")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g3")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mabi=aapcs")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsigned-char")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ffunction-sections")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fdata-sections")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fmessage-length=0")

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --specs=nosys.specs")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -mthumb")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -mcpu=cortex-m4")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -g" CACHE INTERNAL "")

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

project("project" C)

add_definitions(-DBLE_STACK_SUPPORT_REQD)
add_definitions(-DS132)
add_definitions(-DNRF_LOG_USES_RTT=1)
add_definitions(-DSWI_DISABLE0)
add_definitions(-DSOFTDEVICE_PRESENT)
add_definitions(-DNRF52)
add_definitions(-DAC_ACC_RAW_SAMPLING_FREQUENCY_25Hz)
add_definitions(-DDEBUG)
add_definitions(-DENABLE_DEBUG_LOG_SUPPORT)
add_definitions(-DNRF_LOG_USES_COLORS=0)

include_directories("${CMAKE_CURRENT_SOURCE_DIR}/foo")
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/bar")
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/baz")

list(
APPEND src
${CMAKE_CURRENT_SOURCE_DIR}/foo/foo.c
${CMAKE_CURRENT_SOURCE_DIR}/bar/bar.c
${CMAKE_CURRENT_SOURCE_DIR}/baz/baz.c
)

add_executable(
project
${src}
)

最佳答案

首先,您的大部分 CMakeLists.txt 更适合工具链文件

关于您的问题:

编译标志

可以通过 add_compile_options() 添加编译标志:

add_compile_options(
-mlittle-endian
-mcpu=cortex-m4
-mthumb
...
)

或者,您可以执行 Akira suggested 操作:

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} \
-mlittle-endian \
-mcpu=cortex-m4 \
-mthumb \
... \
")

不幸的是,你不能这样做list(APPEND...) ,因为 CMAKE_C_FLAGS 是一个字符串而不是一个列表。

如果您需要传递复合选项,例如--section .text=FOO,请使用后一种方法。详情请引用这个问题:Pass compound compiler options using cmake .

包含目录

include_directories()可以有多个参数,例如:

include_directories(
foo
bar
baz
)

请注意,您不需要显式指定${CMAKE_CURRENT_SOURCE_DIR},因为:

Relative paths are interpreted as relative to the current source directory.

对于更复杂的项目,请考虑 target_include_directories()作为替代方案。

其他

  1. 您不需要将所有内容都放在引号中。
  2. 您无需显式指定${CMAKE_CURRENT_SOURCE_DIR}。大多数命令将相对路径解释为相对于当前源目录的路径。
  3. add_definitions()还接受多个参数。

关于cmake - 如何以更少的样板形式编写我的 CMakeLists.txt?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46193285/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com