Skip to content

Commit 35e05e0

Browse files
committed
Move outside the scripts for package managers in metacallcli, trying to make more portable the cli.
1 parent c334a73 commit 35e05e0

File tree

6 files changed

+73
-226
lines changed

6 files changed

+73
-226
lines changed

source/examples/metacallcli/CMakeLists.txt

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,23 @@ add_executable(${target}
5454
# Create namespaced alias
5555
add_executable(${META_PROJECT_NAME}::${target} ALIAS ${target})
5656

57+
# Configure package manager path
58+
if(MSVC)
59+
set(PROJECT_METACALL_PACK_MAN_DIR "${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}")
60+
else()
61+
set(PROJECT_METACALL_PACK_MAN_DIR "${CMAKE_BINARY_DIR}")
62+
endif()
63+
64+
# Copy package manager scripts
65+
add_custom_target(${target}-scripts ALL
66+
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
67+
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/package_manager/pip.py ${PROJECT_METACALL_PACK_MAN_DIR}
68+
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/package_manager/npm.js ${PROJECT_METACALL_PACK_MAN_DIR}
69+
)
70+
71+
# Set dependency to metacallcli
72+
add_dependencies(${target} ${target}-scripts)
73+
5774
#
5875
# Project options
5976
#
@@ -121,15 +138,22 @@ install(TARGETS ${target}
121138
BUNDLE DESTINATION ${INSTALL_BIN} COMPONENT examples
122139
)
123140

141+
# Scripts (Package Managers)
142+
install(FILES
143+
${CMAKE_CURRENT_SOURCE_DIR}/package_manager/pip.py
144+
${CMAKE_CURRENT_SOURCE_DIR}/package_manager/npm.js
145+
DESTINATION ${INSTALL_LIB}
146+
COMPONENT runtime
147+
)
148+
124149
#
125150
# Define test
126151
#
127152

128-
set(TEST_COMMAND_LINE_ARGS "help") # TODO: Forward all commands, create an adaptor to existing system
153+
#set(TEST_COMMAND_LINE_ARGS "help") # TODO: Forward all commands, create an adaptor to existing system
129154
set(TEST_COMMAND_LINE_ARGS "load mock test.mock")
130-
131-
# TODO: NODE_PATH=`npm root --quiet -g`
132-
#set(TEST_COMMAND_LINE_ARGS "install node rambda")
155+
#set(TEST_COMMAND_LINE_ARGS "install py numpy")
156+
#set(TEST_COMMAND_LINE_ARGS "install node rambda") # TODO: This segfaults during ctest but not when running it normally
133157

134158
if(WIN32)
135159
set(TEST_COMMAND cmd /c)
@@ -152,7 +176,19 @@ set_property(TEST ${target}
152176

153177
include(TestEnvironmentVariables)
154178

179+
if(NOT OPTION_BUILD_GUIX)
180+
# Get node path for npm
181+
execute_process(
182+
COMMAND npm root --quiet -g
183+
OUTPUT_VARIABLE NODE_PATH
184+
)
185+
set(NODE_PATH "NODE_PATH=${NODE_PATH}")
186+
else()
187+
set(NODE_PATH "NODE_PATH=$ENV{NODE_PATH}")
188+
endif()
189+
155190
test_environment_variables(${target}
156191
${TEST_COMMAND_LINE_ARGS}
157192
${TESTS_ENVIRONMENT_VARIABLES}
193+
${NODE_PATH}
158194
)

source/examples/metacallcli/application.cpp

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,6 @@
2828

2929
#include <clocale>
3030

31-
/* Package Managers */
32-
#include "package_manager/pip.hpp"
33-
#include "package_manager/npm.hpp"
34-
3531
/* -- Namespace Declarations -- */
3632

3733
using namespace metacallcli;
@@ -342,8 +338,31 @@ void application::parameter_iterator::evaluate()
342338
/* List of scripts that run pip/npm/gem */
343339
static std::unordered_map<std::string, std::string> install_scripts =
344340
{
345-
{ "py", package_manager::pip },
346-
{ "node", package_manager::npm }
341+
{
342+
"py",
343+
344+
"#!/usr/bin/env python3\n"
345+
"\n"
346+
"try:\n"
347+
" from pip import main as pipmain\n"
348+
"except ImportError:\n"
349+
" from pip._internal import main as pipmain\n"
350+
"\n"
351+
"def package_manager(args):\n"
352+
" return pipmain(args);\n"
353+
},
354+
{
355+
"node",
356+
357+
"const path = require('path');\n"
358+
"let npm = { package_manager: function (args) { console.log('NPM could not be found, please set up LOADER_LIBRARY_PATH enviroment variable,'); } };\n"
359+
"try {\n"
360+
" npm = require(path.join(process.env['LOADER_LIBRARY_PATH'], 'npm.js'));\n"
361+
"} catch (e) {\n"
362+
" console.log(e);\n"
363+
"}\n"
364+
"module.exports = npm;\n"
365+
}
347366
};
348367

349368
/* List of available commands when installing */

source/examples/metacallcli/package_manager/npm.hpp

Lines changed: 0 additions & 179 deletions
This file was deleted.

source/examples/metacallcli/package_manager/npm.js

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
/* #!/usr/bin/env node */ // Shebang fails when inlining the source in a C++ header and installing with Guix (the shebang cannot be patched properly)
1+
#!/usr/bin/env node
22

33
/* This has been ripped off from NPM and adapted to be callable instead of invoked by exec */
44

55
function package_manager(args) {
66
// windows: running "npm blah" in this folder will invoke WSH, not node.
7-
/* global WScript */
7+
// global WScript
88
if (typeof WScript !== 'undefined') {
99
WScript.echo(
1010
'npm does not work when run\n' +
@@ -37,7 +37,11 @@ function package_manager(args) {
3737
var nopt = require('npm/node_modules/nopt')
3838

3939
// Overwrite process args
40-
process.argv = [ 'node', 'npm', ...args ];
40+
process.argv = [
41+
process.env['NODE_EXE_PATH'] || 'node',
42+
process.env['NODE_PATH'] ? path.join(process.env['NODE_PATH'], 'npm', 'bin', 'npm-cli.js') : 'npm',
43+
...args,
44+
];
4145

4246
log.verbose('cli', process.argv)
4347

source/examples/metacallcli/package_manager/pip.hpp

Lines changed: 0 additions & 33 deletions
This file was deleted.

source/ports/node_port/package-lock.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)