c++ - CMake 编译时定义

标签 c++ c cmake

我是 CMake 的新手,正在尝试将以前的 Makefile 转移到 CMakeLists 中。我有一个文件 *dsplink_defines.txt*,它具有以下编译时定义。

*-DOS_LINUX -DMAX_DSPS=1 -DMAX_PROCESSORS=2 -DID_GPP=1 -DOMAPL1XX -DPROC_COMPONENT -DPOOL_COMPONENT -DNOTIFY_COMPONENT -DMPCS_COMPONENT -DRINGIO_COMPONENT -DMPLIST_COMPONENT -DMSGQ_COMPONENT -DMSGQ_ZCPY_LINK -DCHNL_COMPONENT -DCHNL_ ZCPY_LINK -DZCPY_LINK -DKFILE_DEFAULT -DDA8XXGEM - DDA8XXGEM_PHYINTERFACE=SHMEM_INTERFACE -DGPP_SWI_MODE -D_REENTRANT -DVERIFY_DATA -DDDSP_DEBUG*

我们之前的 Makefile 通过以下方式处理了这个问题,并通过从第 8 行开始使用 shell cat 来处理这个问题:

BIN = ../../build/bin
TMP = build

BUILD_DEF = -DBUILD=$(BUILD_VERSION) -DBUILD_DATE=$(BUILD_DATE)

# these files are captured from the DSPLink Sample build directory (and the named      changed)
# they contain the appropriate includes and flags to build a dsplink application.
DSPLINK_INCLUDES = $(shell cat ../dsplink_config/dsplink_includes.txt)
DSPLINK_FLAGS = $(shell cat ../dsplink_config/dsplink_flags.txt)
DSPLINK_DEFINES = $(shell cat ../dsplink_config/dsplink_defines.txt)
DSPLINK_LIBS =          $(DSPLINK_PACKAGE_DIR)/dsplink/gpp/export/BIN/Linux/OMAPL1XX/RELEASE/dsplink.lib


#Our project variables
INCLUDE = -I../framework -I../io_master -I../logging -I../../dsp/include -      I../flagDictionary


#TOOLCHAIN = ${FACTORY_DIR}/build_armv5l-timesys-linux-uclibcgnueabi/toolchain/bin
TOOLCHAIN = /OMAP-L137/timesys/SDK/omapl137_evm/toolchain/bin
PLATFORM=armv5l-timesys-linux-uclibcgnueabi

#Compile Options
CC=$(TOOLCHAIN)/$(PLATFORM)-g++
LINKER=$(TOOLCHAIN)/$(PLATFORM)-g++
CFLAGS+= $(BUILD_DEF) $(INCLUDE) $(DSPLINK_DEFINES) $(DSPLINK_FLAGS)     $(DSPLINK_INCLUDES)
DEBUG = -O

#list of things to compile.
FW_BUILD_DIR=../framework/build
LOG_BUILD_DIR=../logging/build
FLAG_DICT_BUILD_DIR=../flagDictionary/build

FRAMEWORK_OBJECTS= $(FW_BUILD_DIR)/com.o \
       $(FW_BUILD_DIR)/application.o \
       $(FW_BUILD_DIR)/memoryManagerBase.o \
       $(FW_BUILD_DIR)/memoryManager.o \
       $(FW_BUILD_DIR)/arguments.o \
       $(FW_BUILD_DIR)/lockManager.o \
       $(FW_BUILD_DIR)/controlCom.o \
       $(FW_BUILD_DIR)/paths.o \
       $(LOG_BUILD_DIR)/subsystemLogMasks.o \
       $(LOG_BUILD_DIR)/logger.o

FLAG_DICT_OBJECTS= $(FLAG_DICT_BUILD_DIR)/flagEntry.o \
               $(FLAG_DICT_BUILD_DIR)/flagDictionary.o

OBJECTS = spidev_test.o sysMon.o 
EXES = sysMon

all: $(OBJECTS) $(EXES)

.c.o:
mkdir -p build
$(CC) -c $(CFLAGS) $(DEBUG) -o $(TMP)/$@ $< 

.cpp.o:
mkdir -p build
$(CC) -c $(CFLAGS) $(DEBUG) -o $(TMP)/$@ $< 

spidev_test: $(FRAMEWORK_OBJECTS) spidev_test.o
$(LINKER) -lpthread -lc -o $(BIN)/$@ $(DSPLINK_LIBS) build/spidev_test.o       $(FRAMEWORK_OBJECTS)


sysMon: $(FRAMEWORK_OBJECTS) sysMon.o
$(LINKER) -lpthread -lc -o $(BIN)/$@ $(DSPLINK_LIBS) build/sysMon.o    $(FLAG_DICT_OBJECTS) $(FRAMEWORK_OBJECTS)

deploy:
../../build/deploy

如何使用 CMakeList 传递这些

最佳答案

这应该有效:

file(READ path/to/dsplink_defines.txt defines) #read file into variable 'defines'
string(REPLACE " " ";" defines "${defines}") #turn space separation into CMake list
add_definitions(${defines})

当然,如果您可以完全控制文件并且可以更改其格式以使用分号而不是空格进行分隔,那么您可以这样做并跳过 string() 行(可能会加快速度)你的 CMake 处理通过这个)。

关于c++ - CMake 编译时定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20911103/

相关文章:

c++ - 尝试使用 SDL_WINDOWID 在 QT4 中制作 SDL 小部件,但无法显示小部件

c++ - 将 C 字符串转换为单个整数

android - 为什么 Android Studio 3 默认使用 cmake 3.6.0?

c++ - 如何测量 CMake 中每个对象的编译时间?

c++ - boost::locale icu sortKey

c++ - 如何计算n个整数的lcm的所有质因数?

c - 3n+1算法

c - 查找二维数组的最大大小

c - 将 char 数组的第一个字符分配给另一个变量

c - 在 Windows 10 上的 CLion 中链接 SDL 库