同一CMake项目中有多个make目标

7
在我的项目中,我有一个类似于这样的makefile:
CXX = clang++
CFLAGS = -std=c++11 
COMMON_SOURCES = file1.cpp file2.cpp
TARGET_SOURCES = main.cpp
TEST_SOURCES = run_tests.cpp test_file1.cpp test_file2.cpp
COMMON_OBJECTS = $(COMMON_SOURCES:.c=.o)
TARGET_OBJECTS = $(TARGET_SOURCES:.c=.o)
TEST_OBJECTS = $(TEST_SOURCES:.c=.o)
EXECUTABLE = build/application
TEST_EXECUTABLE = build/tests
.PHONY: all target tests
all: target tests
target: $(EXECUTABLE)
tests: $(TEST_EXECUTABLE)
clean:
    rm build/tests & rm build/application &
$(EXECUTABLE): $(COMMON_OBJECTS) $(TARGET_OBJECTS)
    $(CXX) $(CFLAGS) $(LDFLAGS) $^ -o $@
$(TEST_EXECUTABLE): $(COMMON_OBJECTS) $(TEST_OBJECTS)
    $(CXX) $(CFLAGS) $(LDFLAGS) $^ -o $@
.c.o:
    $(CXX) $(CFLAGS) $< -o $@

这让我能够运行make testsmake target,然后它将构建相应的可执行文件。
如何设置CMakeLists文件以获得相同方便的构建系统?
2个回答

10

除了使用clang++之外,我认为如果你将以下内容放入CMakeLists.txt文件中,然后在build目录下运行cmake configure步骤(即mkdir build; cd build; cmake ..),你应该就有所需的东西了。

project(myproject)

# I am not sure how you get cmake to use clang++ over g++
# CXX = clang++

add_definitions(-std=c++11)
set(COMMON_SOURCES file1.cpp file2.cpp)
set(TARGET_SOURCES main.cpp)
set(TEST_SOURCES  run_tests.cpp test_file1.cpp test_file2.cpp)
add_executable(application ${COMMON_SOURCES} ${TARGET_SOURCES})
add_executable(tests ${COMMON_SOURCES} ${TEST_SOURCES})

我收到了错误信息 add_executable called with incorrect number of arguments可能是我不知道的基本步骤?我对CMake的了解非常有限。 - Anonymous Entity
抱歉,我刚刚将“OBJECTS”替换为“SOURCES”,然后它就可以工作了。 - Anonymous Entity
是的,对不起。我在将您的makefile逻辑转录为cmake时犯了一个粗心的错误。我刚刚编辑了我的答案并进行了更正。 - Phil

7

每个add_custom_target()(以及一些其他命令,如add_executable)实际上都会在makefile中添加目标。

add_custom_target(tests) # Note: without 'ALL'
add_executable(test_executable ...) # Note: without 'ALL'
add_dependencies(tests test_executable)

因此,在执行make tests时,将会构建test_executable,但在简单的make中不会构建。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接