About Maple Libraries, Paths, etc
Solomon R.C. Douglas and David M. Harrison,
Dept. of Physics, Univ. of Toronto, harrison@physics.utoronto.ca
January, 2004
Information about creating and maintaining libraries, and the ways in which Maple finds the libraries and their contents is scattered around many places in the documentation. This little document attempts to put the information all in one place: hopefully it will save others the ridiculously long time it took us to figure all this out.
A Sample File
We create a file in the currentdir named source-code . Here are its contents.
MyModule := module() export proc1, proc2; option package; proc1 := proc() print("we're in proc1"); NULL end proc; proc2 := proc(a, b) a+b end proc; end module: |
We read the file into the Maple session.
> | read "source-code"; |
We can then execute the procedures.
> | MyModule:-proc1(); |
> | MyModule:-proc2(3,4); |
The Standard Library
The standard library for Maple consists of 2 files:
The directory where these files exist depends on the details of the installation. For a default installation the directory is given by the libname command.
> | libname; |
We can list the contents of the directory.
FileTools[ListDirectory](libname);
["include","classic","maple.hdb","units.lib","units.ind","scandsea.lib","scandsea.ind", "maplets.lib","maplets.ind","maple.lib","maple.ind","Student.lib","Student.ind", "CodeGeneration.lib","CodeGeneration.ind","CodeGeneration.hdb","standard.hdb"]
You can see from the above that there are other libraries and directories, in addition to the standard Maple library.
Depending on the details of your installation, you may be able to add your own modules to the standard library, or create new libraries in the directory specified by libname. Both of these are bad ideas. Adding a broken module to the standard library can make Maple non-functioning. Adding a new library to the system area means that updating your version of Maple can cause you to lose your new library.
Creating a New Library Named maple.lib
As discussed, in general it is a bad idea to install your libraries in the system areas of Maple. We shall create a new library in the empty directory "/home/harrison/tmp/mylibs."
> | new_lib_dir := "/home/harrison/tmp/mylibs": |
> | FileTools[ListDirectory](new_lib_dir); |
We create an empty library with slots for 10 archive members using the Maple archive program march .
> | march('create', new_lib_dir, 10); |
This has created 2 files, maple.ind and maple.lib, in the directory.
> | FileTools[ListDirectory](new_lib_dir); |
The library has no contents yet.
> | march('list', "/home/harrison/tmp/mylibs/maple.lib"); |
Then we modify the libname variable to include the new directory.
> | libname := new_lib_dir, libname; |
Maple will search the directories listed in libname in the order in which they are listed. Thus, new_lib_dir will be searched before the system directory.
Recall that in the first section we loaded the procedures in the MyModule module into Maple. We add the module to the library.
> | savelib('MyModule'); |
Now the module is in the library. In fact, it has been saved to the first library found in the first directory listed in libname .
> | march('list', "/home/harrison/tmp/mylibs/maple.lib"); |
[["MyModule.m", [2004, 1, 29, 11, 14, 3], 1024, 116], [":-1.m", [2004, 1, 29, 11, 14, 3], 1140, 105], [":-2.m", [2004, 1, 29, 11, 14, 3], 1245, 85]]
We can load the library into a fresh session and use its procedures, provided we tell Maple where to find it.
> | restart; |
> | new_lib_dir := "/home/harrison/tmp/mylibs": |
> | libname := new_lib_dir, libname; |
> | with(MyModule); |
> | proc1(); |
> | proc2(3,4); |
We can also use the procedures in the new library without using the with command.
> | restart; |
> | new_lib_dir := "/home/harrison/tmp/mylibs": |
> | libname := new_lib_dir, libname; |
> | MyModule:-proc1(); |
> | MyModule:-proc2(3,4); |
Creating a Library With an Arbitrary Name
In the previous section we created a library with the same name as the system library: maple.lib . Here we shall create a library named ThisLibrary.lib in the directory /home/harrison/tmp/otherlibs . Initially this directory is empty. We begin with a fresh Maple session and load the file containing the definition of the module that we want to place in the library. Our current directory contains only that source file.
> | restart; |
> | currentdir(); |
> | FileTools[ListDirectory]( currentdir() ); |
> | read "source-code"; |
Now we set libname to include the directory where we wish to create the library and use march to create it.
> | new_lib_name := "/home/harrison/tmp/otherlibs": |
> | libname := new_lib_name, libname; |
> | FileTools[ListDirectory]( new_lib_name ); |
> | march('create', cat( new_lib_name, "/ThisLibrary.lib"), 10); |
> | FileTools[ListDirectory]( new_lib_name ); |
The savelib command
by default saves into the first library file that it finds in going through
the directories specified in libname.
Thus, we can save MyModule directly.
> | savelib('MyModule'); |
> | march('list', cat( new_lib_name, "/ThisLibrary.lib")); |
[["MyModule.m", [2004, 1, 29, 13, 17, 29], 1024, 116], [":-1.m", [2004, 1, 29, 13, 17, 29], 1140, 105], [":-2.m", [2004, 1, 29, 13, 17, 29], 1245, 85]]
You may specify a specific library by setting the savelibname variable.
About the save Command
The save command saves names or symbols, by default into a file in Maple's internal format. For example, if our current directory contains only the file source-code , then we can create a file try.m containing a name definition.
> | restart; |
> | currentdir(); |
> | FileTools[ListDirectory]( currentdir() ); |
> | foo := "hi sailor"; |
> | save foo, "try.m"; |
> | FileTools[ListDirectory]( currentdir() ); |
The definition can then later be read into a new Maple session.
> | restart; |
> | foo; |
> | read "try.m"; |
> | foo; |
However, if the save command is issued from a directory where there is a library, then the "file name" will be added to the library instead. We will illustrate with the ThisLibrary.lib that we created in the previous section.
> | restart; |
> | currentdir("/home/harrison/tmp/otherlibs"); |
> | FileTools[ListDirectory]( currentdir() ); |
> | march('list', "ThisLibrary.lib" ); |
[["MyModule.m", [2004, 1, 29, 13, 17, 29], 1024, 116], [":-1.m", [2004, 1, 29, 13, 17, 29], 1140, 105], [":-2.m", [2004, 1, 29, 13, 17, 29], 1245, 85]]
> | foo := "hi sailor"; |
> | save( foo, "try.m" ); |
> | FileTools[ListDirectory]( currentdir() ); |
> | march('list', "ThisLibrary.lib" ); |
[["MyModule.m", [2004, 1, 29, 13, 17, 29], 1024, 116], [":-1.m", [2004, 1, 29, 13, 17, 29], 1140, 105], ["try.m", [2004, 1, 29, 13, 38, 32], 1356, 26], [":-2.m", [ 2004, 1, 29, 13, 17, 29], 1245, 85]]
Then, we can read the definition of foo contained in try.m in a fresh Maple session. This time, the read command has dug the definition out of the library.
> | restart; |
> | currentdir("/home/harrison/tmp/otherlibs"); |
> | foo; |
> | read "try.m"; |
> | foo; |
Initialization
When you have libraries in non-system areas, it can be a pain to have to begin every Maple session by manipulating libname.
You can change the value of libname once and for all via an initialization file. The details of the name and location of this file depends on the operating system of the computer and on how Maple was installed by the administrator. Details may be found in the on-line Help Browser in Getting Started ... => Configure Maple ... => initialization files .
Regardless of the name and placement of the initialization file, putting the following line in it will set the value of libname:
libname := "/some/directory", libname: |
Note the trailing colon in the above command. This keeps the new value of libname from being printed to your screen when Maple is invoked.