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

时间:2015-07-11 10:29:01

标签: makefile cmake project-management

在我的项目中,我有一个如下所示的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 个答案:

答案 0 :(得分:6)

除了使用clang ++之外,我想如果您将以下内容放在CMakeLists.txt文件中,然后在构建目录(即mkdir build; cd build; cmake ..)中运行cmake configure步骤,那么您应该拥有所要求的内容

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})

答案 1 :(得分:2)

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

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

因此,test_executable将建立在make tests上,但不是简单make