Populate new global premake.path with search path; use in script loader
I've only implemented searching on the --scripts path with this commit; more paths coming in next commits.
This commit is contained in:
parent
cca1ea6643
commit
1bd13569b9
@ -1,7 +1,7 @@
|
||||
/**
|
||||
* \file os_locate.c
|
||||
* \brief Locates files along the standard built-in search paths.
|
||||
* \author Copyright (c) 2014 Jason Perkins and the Premake project
|
||||
* \author Copyright (c) 2014-2015 Jason Perkins and the Premake project
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
@ -10,18 +10,15 @@
|
||||
|
||||
int os_locate(lua_State* L)
|
||||
{
|
||||
int i, nArgs, vars;
|
||||
const char* premake_path = getenv("PREMAKE_PATH");
|
||||
int i;
|
||||
int nArgs = lua_gettop(L);
|
||||
|
||||
nArgs = lua_gettop(L);
|
||||
|
||||
/* see if the global environment variables have been set yet */
|
||||
lua_getglobal(L, "_USER_HOME_DIR");
|
||||
vars = !lua_isnil(L, -1);
|
||||
lua_pop(L, 1);
|
||||
/* Fetch premake.path */
|
||||
lua_getglobal(L, "premake");
|
||||
lua_getfield(L, -1, "path");
|
||||
|
||||
for (i = 1; i <= nArgs; ++i) {
|
||||
/* Direct path to file? Return fully qualified version */
|
||||
/* Direct path to file? Return as absolute path */
|
||||
if (do_isfile(lua_tostring(L, i))) {
|
||||
lua_pushcfunction(L, path_getabsolute);
|
||||
lua_pushvalue(L, i);
|
||||
@ -29,57 +26,18 @@ int os_locate(lua_State* L)
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Search for it... */
|
||||
/* Call os.pathsearch(arg[i], premake.path) */
|
||||
lua_pushcfunction(L, os_pathsearch);
|
||||
lua_pushvalue(L, i);
|
||||
lua_pushvalue(L, -3);
|
||||
lua_call(L, 2, 1);
|
||||
|
||||
/* ...relative to the main project script */
|
||||
if (vars) {
|
||||
lua_getglobal(L, "_MAIN_SCRIPT_DIR");
|
||||
}
|
||||
|
||||
/* ...relative to the CWD */
|
||||
lua_pushstring(L, ".");
|
||||
|
||||
/* ...on the paths specified by --scripts, if set */
|
||||
if (scripts_path) {
|
||||
lua_pushstring(L, scripts_path);
|
||||
}
|
||||
|
||||
/* ... relative to ~/.premake */
|
||||
if (vars) {
|
||||
lua_getglobal(L, "_USER_HOME_DIR");
|
||||
lua_pushstring(L, "/.premake");
|
||||
lua_concat(L, 2);
|
||||
}
|
||||
|
||||
/* ...on the PREMAKE_PATH environment variable, if set */
|
||||
if (premake_path) {
|
||||
lua_pushstring(L, premake_path);
|
||||
}
|
||||
|
||||
/* ...relative to the Premake executable */
|
||||
if (vars) {
|
||||
lua_getglobal(L, "_PREMAKE_DIR");
|
||||
}
|
||||
|
||||
/* ...in ~/Library/Application Support/Premake (for OS X) */
|
||||
if (vars) {
|
||||
lua_getglobal(L, "_USER_HOME_DIR");
|
||||
lua_pushstring(L, "/Library/Application Support/Premake");
|
||||
lua_concat(L, 2);
|
||||
}
|
||||
|
||||
/* ...in the expected Unix-y places */
|
||||
lua_pushstring(L, "/usr/local/share/premake");
|
||||
lua_pushstring(L, "/usr/share/premake");
|
||||
|
||||
lua_call(L, lua_gettop(L) - nArgs - 1, 1);
|
||||
/* os.pathsearch() returns the directory containing the file;
|
||||
* append the filename to complete the path */
|
||||
if (!lua_isnil(L, -1)) {
|
||||
lua_pushcfunction(L, path_join);
|
||||
lua_pushvalue(L, -2);
|
||||
lua_pushvalue(L, i);
|
||||
lua_call(L, 2, 1);
|
||||
lua_pushstring(L, "/");
|
||||
lua_pushvalue(L, 1);
|
||||
lua_concat(L, 3);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
/**
|
||||
* \file os_pathsearch.c
|
||||
* \brief Locates a file, given a set of search paths.
|
||||
* \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
|
||||
* \author Copyright (c) 2002-2015 Jason Perkins and the Premake project
|
||||
*
|
||||
* \note This function is required by the bootstrapping code; it must be
|
||||
* implemented here in the host and not scripted.
|
||||
@ -66,10 +66,13 @@ int os_pathsearch(lua_State* L)
|
||||
lua_pushvalue(L, 1);
|
||||
lua_concat(L, 3);
|
||||
|
||||
/* test it - if it exists return the path */
|
||||
/* test it - if it exists, return the absolute path */
|
||||
if (do_isfile(lua_tostring(L, -1)))
|
||||
{
|
||||
lua_pop(L, 1);
|
||||
lua_pushcfunction(L, path_getabsolute);
|
||||
lua_pushvalue(L, -2);
|
||||
lua_call(L, 1, 1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -20,6 +20,7 @@
|
||||
#define ERROR_MESSAGE "Error: %s\n"
|
||||
|
||||
|
||||
static void build_premake_path(lua_State* L);
|
||||
static int process_arguments(lua_State* L, int argc, const char** argv);
|
||||
|
||||
|
||||
@ -138,6 +139,9 @@ int premake_execute(lua_State* L, int argc, const char** argv, const char* scrip
|
||||
return !OKAY;
|
||||
}
|
||||
|
||||
/* Use --scripts and PREMAKE_PATH to populate premake.path */
|
||||
build_premake_path(L);
|
||||
|
||||
/* load the main script */
|
||||
if (luaL_dofile(L, script) != OKAY) {
|
||||
printf(ERROR_MESSAGE, lua_tostring(L, -1));
|
||||
@ -250,7 +254,7 @@ int premake_locate(lua_State* L, const char* argv0)
|
||||
|
||||
|
||||
|
||||
const char* set_scripts_path(const char* relativePath)
|
||||
static const char* set_scripts_path(const char* relativePath)
|
||||
{
|
||||
char* path = (char*)malloc(PATH_MAX);
|
||||
do_getabsolute(path, relativePath, NULL);
|
||||
@ -260,13 +264,43 @@ const char* set_scripts_path(const char* relativePath)
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Set the premake.path variable, pulling from the --scripts argument
|
||||
* and PREMAKE_PATH environment variable if present.
|
||||
*/
|
||||
static void build_premake_path(lua_State* L)
|
||||
{
|
||||
int top;
|
||||
|
||||
lua_getglobal(L, "premake");
|
||||
top = lua_gettop(L);
|
||||
|
||||
/* Start by searching the current working directory */
|
||||
lua_pushstring(L, ".");
|
||||
|
||||
/* The --scripts argument goes next, if present */
|
||||
if (scripts_path) {
|
||||
lua_pushstring(L, ";");
|
||||
lua_pushstring(L, scripts_path);
|
||||
}
|
||||
|
||||
/* Put it all together and set the path variable */
|
||||
lua_concat(L, lua_gettop(L) - top);
|
||||
lua_setfield(L, -2, "path");
|
||||
|
||||
/* Remove the premake namespace table */
|
||||
lua_pop(L, 1);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Copy all command line arguments into the script-side _ARGV global, and
|
||||
* check for the presence of a /scripts=<path> argument to help locate
|
||||
* the manifest if needed.
|
||||
* \returns OKAY if successful.
|
||||
*/
|
||||
int process_arguments(lua_State* L, int argc, const char** argv)
|
||||
static int process_arguments(lua_State* L, int argc, const char** argv)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
Reference in New Issue
Block a user