Switch to using target_sources instead of passing sources directly to add_xxx

vcpkg-wip archive_9622334b
Duncan Ogilvie 4 years ago
parent 6ad29ef624
commit 9622334bf1

13
CMakeLists.txt generated

@ -53,8 +53,10 @@ add_subdirectory(tests)
set(CMAKE_FOLDER ${CMKR_CMAKE_FOLDER}) set(CMAKE_FOLDER ${CMKR_CMAKE_FOLDER})
# Target cmkr # Target cmkr
unset(cmkr_SOURCES) set(CMKR_TARGET cmkr)
set(cmkr_SOURCES "")
list(APPEND cmkr_SOURCES list(APPEND cmkr_SOURCES
"src/args.cpp" "src/args.cpp"
@ -79,7 +81,12 @@ list(APPEND cmkr_SOURCES
cmake.toml cmake.toml
) )
add_executable(cmkr ${cmkr_SOURCES}) set(CMKR_SOURCES ${cmkr_SOURCES})
add_executable(cmkr)
if(cmkr_SOURCES)
target_sources(cmkr PRIVATE ${cmkr_SOURCES})
endif()
get_directory_property(CMKR_VS_STARTUP_PROJECT DIRECTORY ${PROJECT_SOURCE_DIR} DEFINITION VS_STARTUP_PROJECT) get_directory_property(CMKR_VS_STARTUP_PROJECT DIRECTORY ${PROJECT_SOURCE_DIR} DEFINITION VS_STARTUP_PROJECT)
if(NOT CMKR_VS_STARTUP_PROJECT) if(NOT CMKR_VS_STARTUP_PROJECT)
@ -103,6 +110,8 @@ target_link_libraries(cmkr PRIVATE
ordered_map ordered_map
) )
unset(CMKR_TARGET)
unset(CMKR_SOURCES)
install( install(
TARGETS TARGETS
cmkr cmkr

@ -597,6 +597,8 @@ int generate_cmake(const char *path, bool root) {
if (!cmake.targets.empty()) { if (!cmake.targets.empty()) {
for (const auto &target : cmake.targets) { for (const auto &target : cmake.targets) {
comment("Target " + target.name); comment("Target " + target.name);
cmd("set")("CMKR_TARGET", target.name);
gen.handle_condition(target.include_before, gen.handle_condition(target.include_before,
[&](const std::string &, const std::vector<std::string> &includes) { inject_includes(includes); }); [&](const std::string &, const std::vector<std::string> &includes) { inject_includes(includes); });
gen.handle_condition(target.cmake_before, [&](const std::string &, const std::string &cmake) { inject_cmake(cmake); }); gen.handle_condition(target.cmake_before, [&](const std::string &, const std::string &cmake) { inject_cmake(cmake); });
@ -604,7 +606,7 @@ int generate_cmake(const char *path, bool root) {
auto sources_var = target.name + "_SOURCES"; auto sources_var = target.name + "_SOURCES";
bool added_toml = false; bool added_toml = false;
cmd("unset")(sources_var).endl(); cmd("set")(sources_var, RawArg("\"\"")).endl();
gen.handle_condition(target.sources, [&](const std::string &condition, const std::vector<std::string> &condition_sources) { gen.handle_condition(target.sources, [&](const std::string &condition, const std::vector<std::string> &condition_sources) {
auto sources = expand_cmake_paths(condition_sources, path); auto sources = expand_cmake_paths(condition_sources, path);
if (sources.empty()) { if (sources.empty()) {
@ -621,6 +623,7 @@ int generate_cmake(const char *path, bool root) {
if (!added_toml && target.type != cmake::target_interface) { if (!added_toml && target.type != cmake::target_interface) {
cmd("list")("APPEND", sources_var, std::vector<std::string>{"cmake.toml"}).endl(); cmd("list")("APPEND", sources_var, std::vector<std::string>{"cmake.toml"}).endl();
} }
cmd("set")("CMKR_SOURCES", "${" + sources_var + "}");
std::string add_command; std::string add_command;
std::string target_type; std::string target_type;
@ -661,7 +664,13 @@ int generate_cmake(const char *path, bool root) {
assert("Unimplemented enum value" && false); assert("Unimplemented enum value" && false);
} }
cmd(add_command)(target.name, target_type, "${" + target.name + "_SOURCES}").endl(); cmd(add_command)(target.name, target_type).endl();
// clang-format off
cmd("if")(sources_var);
cmd("target_sources")(target.name, target.type == cmake::target_interface ? "INTERFACE" : "PRIVATE", "${" + sources_var + "}");
cmd("endif")().endl();
// clang-format on
// The first executable target will become the Visual Studio startup project // The first executable target will become the Visual Studio startup project
if (target.type == cmake::target_executable) { if (target.type == cmake::target_executable) {
@ -701,6 +710,9 @@ int generate_cmake(const char *path, bool root) {
gen.handle_condition(target.include_after, gen.handle_condition(target.include_after,
[&](const std::string &, const std::vector<std::string> &includes) { inject_includes(includes); }); [&](const std::string &, const std::vector<std::string> &includes) { inject_includes(includes); });
gen.handle_condition(target.cmake_after, [&](const std::string &, const std::string &cmake) { inject_cmake(cmake); }); gen.handle_condition(target.cmake_after, [&](const std::string &, const std::string &cmake) { inject_cmake(cmake); });
cmd("unset")("CMKR_TARGET");
cmd("unset")("CMKR_SOURCES");
} }
} }

10
tests/CMakeLists.txt generated

@ -28,3 +28,13 @@ add_test(
build build
) )
add_test(
NAME
interface
WORKING_DIRECTORY
"${CMAKE_CURRENT_LIST_DIR}/interface"
COMMAND
$<TARGET_FILE:cmkr>
build
)

@ -9,3 +9,9 @@ name = "conditions"
command = "$<TARGET_FILE:cmkr>" command = "$<TARGET_FILE:cmkr>"
working-directory = "${CMAKE_CURRENT_LIST_DIR}/conditions" working-directory = "${CMAKE_CURRENT_LIST_DIR}/conditions"
arguments = ["build"] arguments = ["build"]
[[test]]
name = "interface"
command = "$<TARGET_FILE:cmkr>"
working-directory = "${CMAKE_CURRENT_LIST_DIR}/interface"
arguments = ["build"]

@ -0,0 +1,11 @@
[project]
name = "interface"
[target.mylib]
type = "interface"
include-directories = ["include"]
[target.example]
type = "executable"
sources = ["src/main.cpp"]
link-libraries = ["mylib"]

@ -0,0 +1,4 @@
namespace mylib
{
static const char* version() { return "v1.0"; }
} // namespace mylib

@ -0,0 +1,8 @@
#include <cstdio>
#include "mylib/mylib.hpp"
int main()
{
printf("mylib version: %s\n", mylib::version())
}
Loading…
Cancel
Save