Skip to content

Commit 0d10c86

Browse files
committed
Implement cmake-based invocation of cppan.
1 parent 8f303c8 commit 0d10c86

9 files changed

Lines changed: 192 additions & 64 deletions

File tree

cmake/FindCPPAN.cmake

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
################################################################################
2+
3+
find_program(CPPAN_EXECUTABLE cppan)
4+
5+
# download cppan locally if not found?
6+
if ("${CPPAN_EXECUTABLE}" STREQUAL "CPPAN_EXECUTABLE-NOTFOUND")
7+
if (WIN32)
8+
elseif (APPLE)
9+
else()
10+
endif()
11+
endif()
12+
13+
include(FindPackageHandleStandardArgs)
14+
find_package_handle_standard_args(CPPAN DEFAULT_MSG CPPAN_EXECUTABLE)
15+
mark_as_advanced(CPPAN_EXECUTABLE)
16+
17+
########################################
18+
19+
set(CPPAN_DEPS_DIR ${CMAKE_BINARY_DIR}/.cppan CACHE STRING "Cppan local deps file.")
20+
set(CPPAN_DEPS_FILE ${CPPAN_DEPS_DIR}/cmake_deps.txt CACHE STRING "Cppan local deps file.")
21+
22+
file(WRITE ${CPPAN_DEPS_FILE} "")
23+
24+
########################################
25+
# FUNCTION cppan_add_dependency
26+
########################################
27+
28+
function(cppan_add_dependency d)
29+
if (${ARGC} EQUAL 1)
30+
file(APPEND ${CPPAN_DEPS_FILE} "${d}\n")
31+
else()
32+
file(APPEND ${CPPAN_DEPS_FILE} "${d}-${ARGN}\n")
33+
endif()
34+
endfunction()
35+
36+
########################################
37+
# FUNCTION cppan_execute
38+
########################################
39+
40+
function(cppan_execute)
41+
message(STATUS "cppan: processing dependencies")
42+
43+
file(SHA1 "${CPPAN_DEPS_FILE}" h)
44+
string(SUBSTRING "${h}" 0 8 h)
45+
execute_process(
46+
COMMAND ${CPPAN_EXECUTABLE} internal-process-cmake-dependencies "${CPPAN_DEPS_FILE}" ${h}
47+
RESULT_VARIABLE ret
48+
)
49+
if (NOT ${ret} EQUAL 0)
50+
message(FATAL_ERROR "cppan: non-zero exit code - ${ret}")
51+
endif()
52+
53+
file(WRITE ${CPPAN_DEPS_FILE} "")
54+
add_subdirectory(${CPPAN_DEPS_DIR}/${h})
55+
endfunction()
56+
57+
################################################################################

src/client/build.cpp

Lines changed: 1 addition & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -223,34 +223,7 @@ int build_package(const String &target_name, const path &settings_fn, const Stri
223223
{
224224
Settings::get_local_settings().copy_all_libraries_to_output = true;
225225

226-
String target = target_name;
227-
bool added_suffix = false;
228-
if (target.rfind('-') == target.npos)
229-
{
230-
target += "-*"; // add the latest version
231-
added_suffix = true;
232-
}
233-
auto p = extractFromString(target);
234-
try
235-
{
236-
p = resolve_dependencies({ { p.ppath.toString(), p } })[p];
237-
}
238-
catch (const std::exception &)
239-
{
240-
if (!added_suffix)
241-
throw;
242-
243-
target = target_name + "-master"; // add the master version
244-
p = extractFromString(target);
245-
p = resolve_dependencies({ { p.ppath.toString(), p } })[p];
246-
247-
// TODO: if no master version, try to get first branch from local db
248-
// (another try ... catch)
249-
//target = target_name + "-master"; // add the master version
250-
//p = extractFromString(target);
251-
//resolved_deps = resolve_dependencies({ { p.ppath.toString(), p } });
252-
253-
}
226+
auto p = resolve_dependency(target_name);
254227
if (p.flags[pfHeaderOnly])
255228
throw std::runtime_error("You are trying to build header only project. This is not supported");
256229
return build_packages(p.ppath.back(), { p }, settings_fn, config);

src/client/main.cpp

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include <http.h>
2929
#include <printers/cmake.h>
3030
#include <program.h>
31+
#include <resolver.h>
3132
#include <settings.h>
3233
#include <shell_link.h>
3334
#include <verifier.h>
@@ -124,6 +125,7 @@ try
124125
return 0;
125126
}
126127

128+
// handle internal args
127129
if (auto r = internal(args))
128130
return r.get();
129131

@@ -521,7 +523,7 @@ optional<int> internal(const Strings &args)
521523
if (args.size() != 6)
522524
{
523525
std::cout << "invalid number of arguments\n";
524-
std::cout << "usage: cppan --internal-fix-imports target aliases.file old.file new.file\n";
526+
std::cout << "usage: cppan internal-fix-imports target aliases.file old.file new.file\n";
525527
return 1;
526528
}
527529
fix_imports(args[2], args[3], args[4], args[5]);
@@ -536,7 +538,7 @@ optional<int> internal(const Strings &args)
536538
if (args.size() != 4)
537539
{
538540
std::cout << "invalid number of arguments: " << args.size() << "\n";
539-
std::cout << "usage: cppan --internal-create-link-to-solution solution.sln link.lnk\n";
541+
std::cout << "usage: cppan internal-create-link-to-solution solution.sln link.lnk\n";
540542
return 1;
541543
}
542544
if (!create_link(args[2], args[3], "Link to CPPAN Solution"))
@@ -549,7 +551,7 @@ optional<int> internal(const Strings &args)
549551
if (args.size() < 6)
550552
{
551553
std::cout << "invalid number of arguments: " << args.size() << "\n";
552-
std::cout << "usage: cppan --internal-parallel-vars-check vars_dir vars_file checks_file generator toolset toolchain\n";
554+
std::cout << "usage: cppan internal-parallel-vars-check vars_dir vars_file checks_file generator toolset toolchain\n";
553555
return 1;
554556
}
555557

@@ -576,6 +578,33 @@ optional<int> internal(const Strings &args)
576578
return 0;
577579
}
578580

581+
if (args[1] == "internal-process-cmake-dependencies")
582+
{
583+
if (args.size() < 3)
584+
{
585+
std::cout << "invalid number of arguments: " << args.size() << "\n";
586+
std::cout << "usage: cppan internal-process-cmake-dependencies deps.txt [out_dir]\n";
587+
return 1;
588+
}
589+
590+
if (args.size() == 4)
591+
{
592+
Settings::get_local_settings().cppan_dir = args[3];
593+
Settings::get_local_settings().meta_target_suffix = args[3];
594+
}
595+
596+
auto deps_file = path(args[2]);
597+
auto deps = read_lines(deps_file);
598+
Config c;
599+
for (auto &d : deps)
600+
c.getDefaultProject().addDependency(resolve_dependency(d));
601+
c.process(deps_file.parent_path());
602+
return 0;
603+
}
604+
605+
if (args[1].find("internal-") == 0)
606+
throw std::runtime_error("Unknown internal command: " + args[1]);
607+
579608
return optional<int>();
580609
}
581610

src/common/resolver.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -646,3 +646,35 @@ Resolver::Dependencies prepareIdDependencies(const IdDependencies &id_deps, cons
646646
}
647647
return dependencies;
648648
}
649+
650+
Package resolve_dependency(const String &target_name)
651+
{
652+
String target = target_name;
653+
bool added_suffix = false;
654+
if (target.rfind('-') == target.npos)
655+
{
656+
target += "-*"; // add the latest version
657+
added_suffix = true;
658+
}
659+
auto p = extractFromString(target);
660+
try
661+
{
662+
p = resolve_dependencies({ { p.ppath.toString(), p } })[p];
663+
}
664+
catch (const std::exception &)
665+
{
666+
if (!added_suffix)
667+
throw;
668+
669+
target = target_name + "-master"; // add the master version
670+
p = extractFromString(target);
671+
p = resolve_dependencies({ { p.ppath.toString(), p } })[p];
672+
673+
// TODO: if no master version, try to get first branch from local db
674+
// (another try ... catch)
675+
//target = target_name + "-master"; // add the master version
676+
//p = extractFromString(target);
677+
//resolved_deps = resolve_dependencies({ { p.ppath.toString(), p } });
678+
}
679+
return p;
680+
}

src/common/resolver.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,5 @@ class Resolver
4747
};
4848

4949
void resolve_and_download(const Package &p, const path &fn);
50+
Package resolve_dependency(const String &d);
5051
std::map<Package, Package> resolve_dependencies(const Packages &deps);

src/common/settings.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@ void Settings::load_main(const yaml &root, const SettingsType type)
188188
YAML_EXTRACT_AUTO(var_check_jobs);
189189
YAML_EXTRACT_AUTO(install_prefix);
190190
YAML_EXTRACT_AUTO(build_warning_level);
191+
YAML_EXTRACT_AUTO(meta_target_suffix);
191192

192193
// read build settings
193194
if (type == SettingsType::Local)
@@ -257,6 +258,7 @@ void Settings::load_build(const yaml &root)
257258
YAML_EXTRACT_AUTO(var_check_jobs);
258259
YAML_EXTRACT_AUTO(install_prefix);
259260
YAML_EXTRACT_AUTO(build_warning_level);
261+
YAML_EXTRACT_AUTO(meta_target_suffix);
260262

261263
for (int i = 0; i < CMakeConfigurationType::Max; i++)
262264
{

src/common/settings.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,9 @@ struct Settings
123123
// for build command
124124
Strings additional_build_args;
125125

126+
// to differentiate different cmake invocations
127+
String meta_target_suffix;
128+
126129
// some project-like variables
127130
// later this could be replaced with local_settings' Config c;
128131
Packages dependencies;

src/inserts/functions.cmake

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -869,4 +869,12 @@ function(create_directory d)
869869
execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${d})
870870
endfunction()
871871

872+
########################################
873+
# FUNCTION set_cache_var
874+
########################################
875+
876+
function(set_cache_var variable value)
877+
set(${variable} ${value} CACHE STRING "" FORCE)
878+
endfunction()
879+
872880
################################################################################

0 commit comments

Comments
 (0)