Better unix filesystem integration as documented here
authorCampbell Barton <ideasman42@gmail.com>
Mon, 21 Sep 2009 03:16:26 +0000 (03:16 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Mon, 21 Sep 2009 03:16:26 +0000 (03:16 +0000)
http://wiki.blender.org/index.php/BlenderDev/Blender2.5/Unix_FHS

for scons WITH_BF_FHS enabled an alternative layout eg.
´╗┐scons WITH_BF_FHS=1 BF_INSTALLDIR="/usr/local"

for CMake just run "make install" after make (´╗┐CMAKE_INSTALL_PREFIX is used for the base path)

Currently only scripts use both the system and user path correctly, other areas of blender have their own path code inline with lots of ifdefs, needs to be carefully updated.

20 files changed:
CMakeLists.txt
SConstruct
config/darwin-config.py
config/irix6-config.py
config/linux2-config.py
config/linuxcross-config.py
config/openbsd3-config.py
config/sunos5-config.py
config/win32-mingw-config.py
config/win32-vc-config.py
config/win64-vc-config.py
source/blender/blenlib/BLI_util.h
source/blender/blenlib/intern/util.c
source/blender/python/intern/bpy_interface.c
source/creator/CMakeLists.txt
source/creator/SConscript
source/creator/creator.c
source/gameengine/PyDoc/SConscript
tools/Blender.py
tools/btools.py

index c881dec03dbb7dcaf5f1245443a16a9513a1d453..504ef5d8dd81cb1378a9fc09b472ce7dc9ea5c46 100644 (file)
@@ -51,6 +51,10 @@ PROJECT(Blender)
 SET(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin)
 SET(LIBRARY_OUTPUT_PATH  ${CMAKE_BINARY_DIR}/lib)
 
+# Note! - Could create this from the blender version string
+# ...but thats quite involved, make sure this matches the blender version.
+SET(BLENDER_VERSION  2.5)
+
 #-----------------------------------------------------------------------------
 # Set default config options
 OPTION(WITH_PLAYER        "Build Player" OFF)
index 83ec6c1b7189dbdcfa53bfbd3e925c884f3b05f6..402bf18faf5fa89e3db62d237416f1d48a102dd9 100644 (file)
@@ -186,6 +186,15 @@ if not env['BF_FANCY']:
 SetOption('num_jobs', int(env['BF_NUMJOBS']))
 print "Build with %d parallel jobs" % (GetOption('num_jobs'))
 
+# BLENDERPATH is a unix only option to enable typical style paths this is
+# spesifically a data-dir, which is used a lot but cant replace BF_INSTALLDIR
+# because the blender binary is installed in $BF_INSTALLDIR/bin/blender
+
+if env['WITH_BF_FHS']:
+       BLENDERPATH = os.path.join(env['BF_INSTALLDIR'], 'share', 'blender', env['BF_VERSION'])
+else:
+       BLENDERPATH = env['BF_INSTALLDIR']
+
 # disable elbeem (fluidsim) compilation?
 if env['BF_NO_ELBEEM'] == 1:
        env['CPPFLAGS'].append('-DDISABLE_ELBEEM')
@@ -198,7 +207,7 @@ if env['WITH_BF_OPENMP'] == 1:
                                env['CPPFLAGS'].append('/openmp')
                                env['CXXFLAGS'].append('/openmp')
                else:
-                       if env['CC'][-3:] == 'icc': # to be able to handle CC=/opt/bla/icc case
+                       if env['CC'].endswith('icc'): # to be able to handle CC=/opt/bla/icc case
                                env.Append(LINKFLAGS=['-openmp', '-static-intel'])
                                env['CCFLAGS'].append('-openmp')
                                env['CPPFLAGS'].append('-openmp')
@@ -301,7 +310,7 @@ if env['WITH_BF_SDL'] == False and env['OURPLATFORM'] in ('win32-vc', 'win32-min
 
 # lastly we check for root_build_dir ( we should not do before, otherwise we might do wrong builddir
 B.root_build_dir = env['BF_BUILDDIR']
-B.doc_build_dir = env['BF_DOCDIR']
+B.doc_build_dir = os.path.join(BLENDERPATH, 'doc')
 if not B.root_build_dir[-1]==os.sep:
        B.root_build_dir += os.sep
 if not B.doc_build_dir[-1]==os.sep:
@@ -426,7 +435,10 @@ if  env['OURPLATFORM']=='darwin':
                        source=[dp+os.sep+f for f in df]
                        blenderinstall.append(env.Install(dir=dir,source=source))
 else:
-       blenderinstall = env.Install(dir=env['BF_INSTALLDIR'], source=B.program_list)
+       if env['WITH_BF_FHS']:  dir= os.path.join(env['BF_INSTALLDIR'], 'bin')
+       else:                                   dir= env['BF_INSTALLDIR']
+       
+       blenderinstall = env.Install(dir=dir, source=B.program_list)
 
 #-- .blender
 #- dont do .blender and scripts for darwin, it is already in the bundle
@@ -450,7 +462,13 @@ if  env['OURPLATFORM']!='darwin':
                                                continue
                                
                                dotblendlist.append(os.path.join(dp, f))
-                               dottargetlist.append(env['BF_INSTALLDIR']+dp[3:]+os.sep+f)
+                               if env['WITH_BF_FHS']:  dir= os.path.join(*([BLENDERPATH] + dp.split(os.sep)[2:]))      # skip bin/.blender
+                               else:                                   dir= os.path.join(*([BLENDERPATH] + dp.split(os.sep)[1:]))      # skip bin
+                               
+                               # print dir+ os.sep + f
+                               print dir
+                               dottargetlist.append(dir + os.sep + f)
+                                       
 
                dotblenderinstall = []
                for targetdir,srcfile in zip(dottargetlist, dotblendlist):
@@ -464,8 +482,12 @@ if  env['OURPLATFORM']!='darwin':
                                for dp, dn, df in os.walk(scriptpath):
                                        if '.svn' in dn:
                                                dn.remove('.svn')
-                                       dir=env['BF_INSTALLDIR']+'/.blender/'+os.path.basename(scriptpath)+dp[len(scriptpath):]
-                                       source=[dp+os.sep+f for f in df]
+                                       
+                                       if env['WITH_BF_FHS']:          dir = BLENDERPATH
+                                       else:                                           dir = os.path.join(env['BF_INSTALLDIR'], '.blender')                            
+                                       dir += os.sep + os.path.basename(scriptpath) + dp[len(scriptpath):]
+                                       
+                                       source=[os.path.join(dp, f) for f in df]
                                        scriptinstall.append(env.Install(dir=dir,source=source))
 
 #-- icons
@@ -477,8 +499,8 @@ if env['OURPLATFORM']=='linux2':
                if '.svn' in tn:
                        tn.remove('.svn')
                for f in tf:
-                       iconlist.append(tp+os.sep+f)
-                       icontargetlist.append(env['BF_INSTALLDIR']+tp[19:]+os.sep+f)
+                       iconlist.append(os.path.join(tp, f))
+                       icontargetlist.append( os.path.join(*([BLENDERPATH] + tp.split(os.sep)[2:] + [f])) )
 
        iconinstall = []
        for targetdir,srcfile in zip(icontargetlist, iconlist):
@@ -499,24 +521,25 @@ for tp, tn, tf in os.walk('release/plugins'):
        if '.svn' in tn:
                tn.remove('.svn')
        for f in tf:
-               pluglist.append(tp+os.sep+f)
-               plugtargetlist.append(env['BF_INSTALLDIR']+tp[7:]+os.sep+f)
+               pluglist.append(os.path.join(tp, f))
+               plugtargetlist.append( os.path.join(*([BLENDERPATH] + tp.split(os.sep)[1:] + [f])) )
+
 
 # header files for plugins
 pluglist.append('source/blender/blenpluginapi/documentation.h')
-plugtargetlist.append(env['BF_INSTALLDIR'] + os.sep + 'plugins' + os.sep + 'include' + os.sep +'documentation.h')
+plugtargetlist.append(os.path.join(BLENDERPATH, 'plugins', 'include', 'documentation.h'))
 pluglist.append('source/blender/blenpluginapi/externdef.h')
-plugtargetlist.append(env['BF_INSTALLDIR'] + os.sep + 'plugins' + os.sep + 'include' + os.sep +'externdef.h')
+plugtargetlist.append(os.path.join(BLENDERPATH, 'plugins', 'include', 'externdef.h'))
 pluglist.append('source/blender/blenpluginapi/floatpatch.h')
-plugtargetlist.append(env['BF_INSTALLDIR'] + os.sep + 'plugins' + os.sep + 'include' + os.sep +'floatpatch.h')
+plugtargetlist.append(os.path.join(BLENDERPATH, 'plugins', 'include', 'floatpatch.h'))
 pluglist.append('source/blender/blenpluginapi/iff.h')
-plugtargetlist.append(env['BF_INSTALLDIR'] + os.sep + 'plugins' + os.sep + 'include' + os.sep +'iff.h')
+plugtargetlist.append(os.path.join(BLENDERPATH, 'plugins', 'include', 'iff.h'))
 pluglist.append('source/blender/blenpluginapi/plugin.h')
-plugtargetlist.append(env['BF_INSTALLDIR'] + os.sep + 'plugins' + os.sep + 'include' + os.sep +'plugin.h')
+plugtargetlist.append(os.path.join(BLENDERPATH, 'plugins', 'include', 'plugin.h'))
 pluglist.append('source/blender/blenpluginapi/util.h')
-plugtargetlist.append(env['BF_INSTALLDIR'] + os.sep + 'plugins' + os.sep + 'include' + os.sep +'util.h')
+plugtargetlist.append(os.path.join(BLENDERPATH, 'plugins', 'include', 'util.h'))
 pluglist.append('source/blender/blenpluginapi/plugin.DEF')
-plugtargetlist.append(env['BF_INSTALLDIR'] + os.sep + 'plugins' + os.sep + 'include' + os.sep + 'plugin.def')
+plugtargetlist.append(os.path.join(BLENDERPATH, 'plugins', 'include', 'plugin.def'))
 
 plugininstall = []
 for targetdir,srcfile in zip(plugtargetlist, pluglist):
@@ -531,7 +554,7 @@ for tp, tn, tf in os.walk('release/text'):
        for f in tf:
                textlist.append(tp+os.sep+f)
 
-textinstall = env.Install(dir=env['BF_INSTALLDIR'], source=textlist)
+textinstall = env.Install(dir=BLENDERPATH, source=textlist)
 
 if  env['OURPLATFORM']=='darwin':
                allinstall = [blenderinstall, plugininstall, textinstall]
index 92f70d716fc62f88aa0ada3f88ade90e37f15eb7..981f321e5bc3d2326dae864dd269b5090db5ad9b 100644 (file)
@@ -274,4 +274,3 @@ BF_DEBUG_CCFLAGS = ['-g']
 
 BF_BUILDDIR='../build/darwin'
 BF_INSTALLDIR='../install/darwin'
-BF_DOCDIR='../install/doc'
index d38665f282abd9a410166aee023c09e5decf0d36..085d1dd1e62c05046b990c4d912f2bc6ddc2fe82 100644 (file)
@@ -189,7 +189,6 @@ BF_DEBUG_FLAGS = '-g'
 
 BF_BUILDDIR = '../build/irix6'
 BF_INSTALLDIR='../install/irix6'
-BF_DOCDIR='../install/doc'
 
 #Link against pthread
 LDIRS = []
index 757b8210e49e655d1964f789e8004b1002ee5308..026d0a200a5eb32ea8fab6daa0dd75a05af46b1f 100644 (file)
@@ -189,8 +189,6 @@ BF_DEBUG_CCFLAGS = ['-g']
 
 BF_BUILDDIR = '../build/linux2'
 BF_INSTALLDIR='../install/linux2'
-BF_DOCDIR='../install/doc'
-
 
 #Link against pthread
 PLATFORM_LINKFLAGS = ['-pthread']
index a7ce2dc290834f1847f82f85e777c857419cb1d0..a5c83dc35039f9fe1c45d97a4923903a57f5d4a8 100644 (file)
@@ -139,4 +139,3 @@ BF_PROFILE_LINKFLAGS = ['-pg']
 
 BF_BUILDDIR = '../build/linuxcross'
 BF_INSTALLDIR='../install/linuxcross'
-BF_DOCDIR='../install/doc'
index 95649321c07a8acc2d035b5dd9cf6957f3e7f7e8..353d30f50b3e90d41310ce33b1f8f4a53b604ad4 100644 (file)
@@ -151,4 +151,3 @@ BF_DEBUG_CCFLAGS = ['-g']
 
 BF_BUILDDIR='../build/openbsd3'
 BF_INSTALLDIR='../install/openbsd3'
-BF_DOCDIR='../install/doc'
index 8af30e4f4f3f5b34e4f7232bf08e6303ebcfbc7b..8e4c53b5bc402941edb1194c34ceb2179dfaaa70 100644 (file)
@@ -165,7 +165,6 @@ BF_DEBUG_CCFLAGS = []
 
 BF_BUILDDIR = '../build/sunos5'
 BF_INSTALLDIR='../install/sunos5'
-BF_DOCDIR='../install/doc'
 
 
 PLATFORM_LINKFLAGS = []
index e3834c41a810a4894369b0f85e8bcad385275ce5..04e9f5eb4d18223e9041c0ac5a7e26067d0cf727 100644 (file)
@@ -152,4 +152,3 @@ BF_PROFILE = False
 
 BF_BUILDDIR = '..\\build\\win32-mingw'
 BF_INSTALLDIR='..\\install\\win32-mingw'
-BF_DOCDIR = '..\\install\\doc'
index 1e993565e98b88e5c6585fe7e374db93d7102112..4f2af93d0e33d29f5ce33c4415a3ecf8a1607b98 100644 (file)
@@ -173,4 +173,3 @@ PLATFORM_LINKFLAGS = ['/SUBSYSTEM:CONSOLE','/MACHINE:IX86','/INCREMENTAL:NO','/N
 
 BF_BUILDDIR = '..\\build\\win32-vc'
 BF_INSTALLDIR='..\\install\\win32-vc'
-BF_DOCDIR='..\\install\\doc'
index ce2fd8cd40523b9fd6824cc5c8fdeb4410797516..b48e3875dd5b9d5ba1f8954c50b12dc9cdf6b152 100644 (file)
@@ -192,7 +192,6 @@ PLATFORM_LINKFLAGS = ['/SUBSYSTEM:CONSOLE','/MACHINE:X64','/INCREMENTAL:NO','/NO
 
 BF_BUILDDIR = '..\\build\\blender25-win64-vc'
 BF_INSTALLDIR='..\\install\\blender25-win64-vc'
-BF_DOCDIR='..\\install\\blender25-win64-vc\\doc'
 
 
 
index f9a84e071e7ecced06330bdafe4c719f037999fc..1ce7a8cdb772c0818bad7fce6f4aefb3093a6008 100644 (file)
@@ -42,7 +42,14 @@ struct ListBase;
 struct direntry;
 
 char *BLI_gethome(void);
-char *BLI_gethome_folder(char *folder_name);
+char *BLI_gethome_folder(char *folder_name, int flag);
+
+/* BLI_gethome_folder flag */
+#define BLI_GETHOME_LOCAL              1<<1 /* relative location for portable binaries */
+#define BLI_GETHOME_SYSTEM             1<<2 /* system location, or set from the BLENDERPATH env variable (UNIX only) */
+#define BLI_GETHOME_USER               1<<3 /* home folder ~/.blender */
+#define BLI_GETHOME_ALL                        (BLI_GETHOME_SYSTEM|BLI_GETHOME_LOCAL|BLI_GETHOME_USER)
+
 void BLI_setenv(const char *env, const char *val);
 
 void BLI_make_file_string(const char *relabase, char *string,  const char *dir, const char *file);
index c7bb7a54457b7a0dd0fe5f95675b4312bbed1a99..b1539d22909a7328e56505008aa77f879597b460 100644 (file)
@@ -856,98 +856,123 @@ char *BLI_gethome(void) {
        #endif
 }
 
-/* this function returns the path to a blender folder, if it exists,
- * trying in this order:
- *
- * path_to_executable/release/folder_name (in svn)
- * ./release/folder_name (in svn)
- * $HOME/.blender/folder_name
- * path_to_executable/.blender/folder_name
- *
- * returns NULL if none is found. */
+/* this function returns the path to a blender folder, if it exists
+ * utility functions for BLI_gethome_folder */
+
+/* #define PATH_DEBUG */ /* for testing paths that are checked */
+
+static int test_data_path(char *targetpath, char *path_base, char *path_sep, char *folder_name)
+{
+       char tmppath[FILE_MAXDIR];
+       
+       if(path_sep)    BLI_join_dirfile(tmppath, path_base, path_sep);
+       else                    BLI_strncpy(tmppath, path_base, sizeof(tmppath));
+       
+       BLI_make_file_string("/", targetpath, tmppath, folder_name);
+       
+       if (BLI_exists(targetpath)) {
+#ifdef PATH_DEBUG
+               printf("\tpath found: %s\n", targetpath);
+#endif
+               return 1;
+       }
+       else {
+#ifdef PATH_DEBUG
+               printf("\tpath missing: %s\n", targetpath);
+#endif
+               targetpath[0] = '\0';
+               return 0;
+       }
+}
 
-char *BLI_gethome_folder(char *folder_name)
+static int gethome_path_local(char *targetpath, char *folder_name)
 {
        extern char bprogname[]; /* argv[0] from creator.c */
-       static char homedir[FILE_MAXDIR] = "";
-       static char fulldir[FILE_MAXDIR] = "";
-       char tmpdir[FILE_MAXDIR];
        char bprogdir[FILE_MAXDIR];
+       char cwd[FILE_MAXDIR];
        char *s;
        int i;
-
+       
+#ifdef PATH_DEBUG
+       printf("gethome_path_local...\n");
+#endif
+       
+       /* try release/folder_name (binary relative) */
        /* use argv[0] (bprogname) to get the path to the executable */
        s = BLI_last_slash(bprogname);
-
        i = s - bprogname + 1;
        BLI_strncpy(bprogdir, bprogname, i);
+       
+       /* try ./.blender/folder_name */
+       if(test_data_path(targetpath, bprogdir, ".blender", folder_name))
+               return 1;
+       
+       if(test_data_path(targetpath, bprogdir, "release", folder_name))
+               return 1;
+       
+       /* try release/folder_name (CWD relative) */
+       if(test_data_path(targetpath, BLI_getwdN(cwd), "release", folder_name))
+               return 1;
+       
+       return 0;
+}
 
-       /* try path_to_executable/release/folder_name (in svn) */
-       if (folder_name) {
-               BLI_snprintf(tmpdir, sizeof(tmpdir), "release/%s", folder_name);
-               BLI_make_file_string("/", fulldir, bprogdir, tmpdir);
-               if (BLI_exists(fulldir)) return fulldir;
-               else fulldir[0] = '\0';
-       }
+static int gethome_path_user(char *targetpath, char *folder_name)
+{
+       char *home_path= BLI_gethome();
 
-       /* try ./release/folder_name (in svn) */
-       if(folder_name) {
-               BLI_snprintf(fulldir, sizeof(fulldir), "./release/%s", folder_name);
-               if (BLI_exists(fulldir)) return fulldir;
-               else fulldir[0] = '\0';
-       }
+#ifdef PATH_DEBUG
+       printf("gethome_path_user...\n");
+#endif
+       
+       /* try $HOME/folder_name */
+       return test_data_path(targetpath, home_path, ".blender", folder_name);
+}
 
-       /* BLI_gethome() can return NULL if env vars are not set */
-       s = BLI_gethome();
+static int gethome_path_system(char *targetpath, char *folder_name)
+{
+       extern char blender_path[]; /* unix prefix eg. /usr/share/blender/2.5 creator.c */
+       
+       if(!blender_path[0])
+               return 0;
+       
+#ifdef PATH_DEBUG
+       printf("gethome_path_system...\n");
+#endif
+       
+       /* try $BLENDERPATH/folder_name */
+       return test_data_path(targetpath, blender_path, NULL, folder_name);
+}
 
-       if(!s) { /* bail if no $HOME */
-               printf("$HOME is NOT set\n");
-               return NULL;
+char *BLI_gethome_folder(char *folder_name, int flag)
+{
+       static char fulldir[FILE_MAXDIR] = "";
+       
+       /* first check if this is a redistributable bundle */
+       if(flag & BLI_GETHOME_LOCAL) {
+               if (gethome_path_local(fulldir, folder_name))
+                       return fulldir;
        }
 
-       if(strstr(s, ".blender"))
-               BLI_strncpy(homedir, s, FILE_MAXDIR);
-       else
-               BLI_make_file_string("/", homedir, s, ".blender");
-
-       /* if $HOME/.blender/folder_name exists, return it */
-       if(BLI_exists(homedir)) {
-               if (folder_name) {
-                       BLI_make_file_string("/", fulldir, homedir, folder_name);
-                       if(BLI_exists(fulldir))
-                               return fulldir;
-               }
-               else
-                       return homedir;
-       }
-       else
-               homedir[0] = '\0';
-
-       /* using tmpdir to preserve homedir (if) found above:
-        * the ideal is to have a home dir with folder_name dir inside
-        * it, but if that isn't available, it's possible to
-        * have a 'broken' home dir somewhere and a folder_name dir in the
-        * svn sources */
-       BLI_make_file_string("/", tmpdir, bprogdir, ".blender");
-
-       if(BLI_exists(tmpdir)) {
-               if(folder_name) {
-                       BLI_make_file_string("/", fulldir, tmpdir, folder_name);
-                       if(BLI_exists(fulldir)) {
-                               BLI_strncpy(homedir, tmpdir, FILE_MAXDIR);
-                               return fulldir;
-                       }
-                       else {
-                               homedir[0] = '\0';
-                               fulldir[0] = '\0';
-                       }
-               }
-               else return homedir;
+       /* then check if the OS has blender data files installed in a global location */
+       if(flag & BLI_GETHOME_SYSTEM) {
+               if (gethome_path_system(fulldir, folder_name))
+                       return fulldir;
        }
-
+       
+       /* now check the users home dir for data files */
+       if(flag & BLI_GETHOME_USER) {
+               if (gethome_path_user(fulldir, folder_name))
+                       return fulldir;
+       }
+       
        return NULL;
 }
 
+#ifdef PATH_DEBUG
+#undef PATH_DEBUG
+#endif
+
 void BLI_setenv(const char *env, const char*val)
 {
        /* SGI or free windows */
index a850809b4a524d4456c4b8add68db0f4c451cd6a..fd8cfc47f5568d5751dc82129097b5460ff8f156 100644 (file)
@@ -232,26 +232,10 @@ static PyObject *CreateGlobalDictionary( bContext *C )
        return dict;
 }
 
-/* Use this so we can include our own python bundle */
-#if 0
-wchar_t* Py_GetPath(void)
-{
-       int i;
-       static wchar_t py_path[FILE_MAXDIR] = L"";
-       char *dirname= BLI_gethome_folder("python");
-       if(dirname) {
-               i= mbstowcs(py_path, dirname, FILE_MAXDIR);
-               printf("py path %s, %d\n", dirname, i);
-       }
-       return py_path;
-}
-#endif
-
-
 /* must be called before Py_Initialize */
 void BPY_start_python_path(void)
 {
-       char *py_path_bundle= BLI_gethome_folder("python");
+       char *py_path_bundle= BLI_gethome_folder("python", BLI_GETHOME_ALL);
 
        if(py_path_bundle==NULL)
                return;
@@ -589,7 +573,8 @@ void BPY_run_ui_scripts(bContext *C, int reload)
        char *dirname;
        char path[FILE_MAX];
        char *dirs[] = {"ui", "io", NULL};
-       int a, err;
+       int path_flags[] = {BLI_GETHOME_LOCAL|BLI_GETHOME_SYSTEM, BLI_GETHOME_USER}; /* SYSTEM / NON-SYSTEM */
+       int a, err, flag_iter;
        
        PyGILState_STATE gilstate;
        PyObject *sys_path;
@@ -599,56 +584,60 @@ void BPY_run_ui_scripts(bContext *C, int reload)
        sys_path= PySys_GetObject("path"); /* borrow */
        PyList_Insert(sys_path, 0, Py_None); /* place holder, resizes the list */
 
-       for(a=0; dirs[a]; a++) {
-               dirname= BLI_gethome_folder(dirs[a]);
+       /* Scan system scripts first, then local/user */
+       for(flag_iter=0; flag_iter < sizeof(path_flags)/sizeof(int); flag_iter++) {
+               
+               for(a=0; dirs[a]; a++) {
+                       dirname= BLI_gethome_folder(dirs[a], path_flags[flag_iter]);
 
-               if(!dirname)
-                       continue;
+                       if(!dirname)
+                               continue;
 
-               dir = opendir(dirname);
+                       dir = opendir(dirname);
 
-               if(!dir)
-                       continue;
-               
-               /* set the first dir in the sys.path for fast importing of modules */
-               PyList_SetItem(sys_path, 0, PyUnicode_FromString(dirname)); /* steals the ref */
+                       if(!dir)
+                               continue;
                        
-               while((de = readdir(dir)) != NULL) {
-                       /* We could stat the file but easier just to let python
-                        * import it and complain if theres a problem */
-                       err = 0;
-
-                       if (de->d_name[0] == '.') {
-                               /* do nothing, probably .svn */
-                       }
-                       else if ((file_extension = strstr(de->d_name, ".py"))) {
-                               /* normal py files? */
-                               if(file_extension && file_extension[3] == '\0') {
-                                       de->d_name[(file_extension - de->d_name)] = '\0';
-                                       err= bpy_import_module(de->d_name, reload);
+                       /* set the first dir in the sys.path for fast importing of modules */
+                       PyList_SetItem(sys_path, 0, PyUnicode_FromString(dirname)); /* steals the ref */
+                               
+                       while((de = readdir(dir)) != NULL) {
+                               /* We could stat the file but easier just to let python
+                                * import it and complain if theres a problem */
+                               err = 0;
+
+                               if (de->d_name[0] == '.') {
+                                       /* do nothing, probably .svn */
+                               }
+                               else if ((file_extension = strstr(de->d_name, ".py"))) {
+                                       /* normal py files? */
+                                       if(file_extension && file_extension[3] == '\0') {
+                                               de->d_name[(file_extension - de->d_name)] = '\0';
+                                               err= bpy_import_module(de->d_name, reload);
+                                       }
                                }
-                       }
 #ifndef __linux__
-                       else if( BLI_join_dirfile(path, dirname, de->d_name), S_ISDIR(BLI_exist(path))) {
+                               else if( BLI_join_dirfile(path, dirname, de->d_name), S_ISDIR(BLI_exist(path))) {
 #else
-                       else if(de->d_type==DT_DIR) {
-                               BLI_join_dirfile(path, dirname, de->d_name);
+                               else if(de->d_type==DT_DIR) {
+                                       BLI_join_dirfile(path, dirname, de->d_name);
 #endif
-                               /* support packages */
-                               BLI_join_dirfile(path, path, "__init__.py");
+                                       /* support packages */
+                                       BLI_join_dirfile(path, path, "__init__.py");
 
-                               if(BLI_exists(path)) {
-                                       err= bpy_import_module(de->d_name, reload);
+                                       if(BLI_exists(path)) {
+                                               err= bpy_import_module(de->d_name, reload);
+                                       }
                                }
-                       }
 
-                       if(err==-1) {
-                               BPy_errors_to_report(NULL);
-                               fprintf(stderr, "unable to import %s/%s\n", dirname, de->d_name);
+                               if(err==-1) {
+                                       BPy_errors_to_report(NULL);
+                                       fprintf(stderr, "unable to import %s/%s\n", dirname, de->d_name);
+                               }
                        }
-               }
 
-               closedir(dir);
+                       closedir(dir);
+               }
        }
        
        PyList_SetSlice(sys_path, 0, 1, NULL); /* remove the first item */
index 1256881182b60082294f95c0f6af87baef82225f..410e0808580fe6b57787aea49d0201f4ad92c414 100644 (file)
@@ -66,6 +66,13 @@ IF(NOT WITH_SDL)
        ADD_DEFINITIONS(-DDISABLE_SDL)
 ENDIF(NOT WITH_SDL)
 
+IF(UNIX AND NOT APPLE)
+       SET(BLENDERPATH ${CMAKE_INSTALL_PREFIX}/share/blender/${BLENDER_VERSION})
+       CMAKE_POLICY(SET CMP0005 NEW)
+       # blender_path in creator.c
+       ADD_DEFINITIONS(-DBLENDERPATH="${BLENDERPATH}")
+ENDIF(UNIX AND NOT APPLE)
+
 IF(CMAKE_SYSTEM_NAME MATCHES "Linux")
        ADD_DEFINITIONS(-DWITH_BINRELOC)
        INCLUDE_DIRECTORIES(${BINRELOC_INC})
@@ -96,6 +103,9 @@ IF(WITH_INSTALL)
        ENDIF(UNIX)
 
        IF(UNIX AND NOT APPLE)
+               
+               # Local installation, "make install" can be done after this optionally
+               
                ADD_CUSTOM_COMMAND(
                        TARGET blender POST_BUILD MAIN_DEPENDENCY blender
                        COMMAND rm -Rf ${TARGETDIR}/.blender
@@ -152,6 +162,27 @@ IF(WITH_INSTALL)
                        COMMAND find ${TARGETDIR} -name .svn -prune -exec rm -rf {} "\;"
                )
     
+    
+               # Above we bundle a portable distrobution in ./bin
+               # This is an optional "make install" which installs blender on the system.
+               INSTALL(
+                       PROGRAMS ${TARGETDIR}/blender
+                       DESTINATION ${CMAKE_INSTALL_PREFIX}/bin
+               )
+
+               IF(WITH_GAMEENGINE AND WITH_PLAYER)
+                       INSTALL(
+                               PROGRAMS ${TARGETDIR}/blenderplayer
+                               DESTINATION ${CMAKE_INSTALL_PREFIX}/bin
+                       )
+               ENDIF(WITH_GAMEENGINE AND WITH_PLAYER)
+
+               INSTALL(
+                       DIRECTORY ${TARGETDIR}/.blender/
+                       DESTINATION ${BLENDERPATH}
+               )
+               # end "make install"
+    
        ENDIF(UNIX AND NOT APPLE)
 
        IF(APPLE)
index 75e7494ebb5c5eb90f552de606ad1c44526a4b22..7b3d1493ed2adecca1d77b9e9bb7e40f17ef164b 100644 (file)
@@ -1,5 +1,6 @@
 #!/usr/bin/python
 Import ('env')
+import os
 
 sources = 'creator.c'
 
@@ -32,4 +33,8 @@ if env['WITH_BF_PYTHON']:
 else:
        defs.append('DISABLE_PYTHON')
 
+if env['WITH_BF_FHS']: # /usr -> /usr/share/blender/2.5
+       defs.append('BLENDERPATH=\\"' + os.path.join(env['BF_INSTALLDIR'], 'share', 'blender', env['BF_VERSION']) + '\\"')
+       
+
 env.BlenderLib ( libname = 'bf_creator', sources = Split(sources), includes = Split(incs), defines = defs, libtype='core', priority = 0 )
index 41b27b1c9159609ffe7d8a19cb7ccfb0dfe0dee7..523273de9bf24b80d6066f057f399960b116b7ca 100644 (file)
@@ -116,6 +116,18 @@ extern int pluginapi_force_ref(void);  /* from blenpluginapi:pluginapi.c */
 char bprogname[FILE_MAXDIR+FILE_MAXFILE]; /* from blenpluginapi:pluginapi.c */
 char btempdir[FILE_MAXDIR+FILE_MAXFILE];
 
+/* unix path support.
+ * defined by the compiler. eg "/usr/share/blender/2.5" "/opt/blender/2.5" */
+#ifndef BLENDERPATH
+#define BLENDERPATH ""
+#endif
+#if !(defined(__APPLE__) && defined(WIN32))
+char blender_path[FILE_MAXDIR+FILE_MAXFILE] = BLENDERPATH;
+#else
+char blender_path[FILE_MAXDIR+FILE_MAXFILE] = "";
+#endif
+
 /* Initialise callbacks for the modules that need them */
 static void setCallbacks(void); 
 
@@ -221,6 +233,12 @@ static void print_help(void)
        printf ("    \t\t   passed unchanged.  Access via Python's sys.argv\n");
        printf ("\nEnvironment Variables:\n");
        printf ("  $HOME\t\t\tStore files such as .blender/ .B.blend .Bfs .Blog here.\n");
+#if !(defined(__APPLE__) && defined(WIN32))
+       printf ("  $BLENDERPATH\tSystem directory to use for data files and scripts.\n");
+       printf ("              \tFor this build of blender the default BLENDERPATH is...\n");
+       printf ("              \t\"%s\"\n", blender_path);
+       printf ("              \tseting the $BLENDERPATH will override this\n");
+#endif
 #ifdef WIN32
        printf ("  $TEMP\t\tStore temporary files here.\n");
 #else
@@ -305,6 +323,12 @@ int main(int argc, char **argv)
 
        BLI_where_am_i(bprogname, argv[0]);
        
+       {       /* override the hard coded blender path */
+               char *blender_path_env = getenv("BLENDERPATH");
+               if(blender_path_env)
+                       BLI_strncpy(blender_path, blender_path_env, sizeof(blender_path));
+       }
+       
        RNA_init();
        RE_engines_init();
 
index ed9712ba2736962e2ef112cdbe79e073437579ed..dabe004ae6ad1437439b9077e80d8512bd21a759 100644 (file)
@@ -1,6 +1,11 @@
 #!/usr/bin/python
 Import ('env')
+import os
 
+if env['WITH_BF_FHS']:
+       BLENDERPATH = os.path.join(env['BF_INSTALLDIR'], 'share', 'blender', env['BF_VERSION'])
+else:
+       BLENDERPATH = env['BF_INSTALLDIR']
 
 from optparse import OptionParser
 import epydoc
@@ -14,7 +19,7 @@ optvalues["quiet"] = 0
 optvalues["include_source_code"] = 0
 optvalues["inheritance"] = "included"
 optvalues["show_private"] = 0
-optvalues["target"] = env["BF_DOCDIR"]+"/BGE_API/"
+optvalues["target"] = os.path.join(BLENDERPATH, 'doc')
 optvalues["url"] = "http://www.blender.org"
 optvalues["top"] = "Game Engine API"
 optvalues["name"] = "Blender"
index d7cbe1076e77a2eabbc80f3d274041688b660c3c..fd6272c7c32d153bdfbe20c66d89f03704cb58cf 100644 (file)
@@ -405,8 +405,11 @@ def PyInstall(target=None, source=None, env=None):
                print 'Install command:', cmd
                commands.getoutput(cmd)
        
+       if env['WITH_BF_FHS']:  dir = os.path.join(env['BF_INSTALLDIR'], 'share', 'blender', env['BF_VERSION']) # BLENDERPATH
+       else:                                   dir = os.path.join(env['BF_INSTALLDIR'], '.blender')
+       
        py_src =        env.subst( env['BF_PYTHON_LIBPATH'] + '/python'+env['BF_PYTHON_VERSION'] )
-       py_target =     env.subst( env['BF_INSTALLDIR'] + '/.blender/python/lib/python'+env['BF_PYTHON_VERSION'] )
+       py_target =     env.subst( dir + '/python/lib/python'+env['BF_PYTHON_VERSION'] )
        
        # Copied from source/creator/CMakeLists.txt, keep in sync.
        print 'Install python from:'
index 7cadab992b860e01ca6fdda5df5965fef9405e40..771c67aee1f0567f655a6340ea6d936222a5c2ef 100755 (executable)
@@ -69,6 +69,8 @@ def validate_arguments(args, bc):
                        'WITH_BF_DOCS',
                        'BF_NUMJOBS',
                        'BF_MSVS',
+                       'WITH_BF_FHS',
+                       'BF_VERSION',
                        ]
        
        # Have options here that scons expects to be lists
@@ -91,7 +93,7 @@ def validate_arguments(args, bc):
                        'BF_BSC', 'BF_CONFIG',
                        'BF_PRIORITYLIST', 'BF_BUILDINFO','CC', 'CXX', 'BF_QUICKDEBUG',
                        'BF_LISTDEBUG', 'LCGDIR', 'BF_X264_CONFIG', 'BF_XVIDCORE_CONFIG',
-                       'BF_DOCDIR', 'BF_UNIT_TEST']
+                       'BF_UNIT_TEST']
 
        okdict = {}
 
@@ -362,7 +364,6 @@ def read_opts(cfg, args):
 
                ('BF_BUILDDIR', 'Build dir', ''),
                ('BF_INSTALLDIR', 'Installation dir', ''),
-               ('BF_DOCDIR', 'Dir where BPy documentation will be created', ''),
 
                ('CC', 'C compiler to use', ''),
                ('CXX', 'C++ compiler to use', ''),
@@ -387,6 +388,9 @@ def read_opts(cfg, args):
                ('BF_CONFIG', 'SCons python config file used to set default options', 'user_config.py'),
                ('BF_NUMJOBS', 'Number of build processes to spawn', '1'),
                ('BF_MSVS', 'Generate MSVS project files and solution', False),
+               
+               (BoolVariable('WITH_BF_FHS', 'Use the Unix "Filesystem Hierarchy Standard" rather then a redistributable directory layout', False)),
+               ('BF_VERSION', 'The root path for Unix (non-apple)', '2.5'),
 
                (BoolVariable('BF_UNIT_TEST', 'Build with unit test support.', False))