Initial commit. Compilation works.
This commit is contained in:
commit
846d926516
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
*LTemplate*
|
||||||
|
*LibraryResources/MacOSX-x86-64-libc++/*
|
||||||
|
*Testing/*nb
|
||||||
|
*DS_Store*
|
36
BuildSettings.m
Normal file
36
BuildSettings.m
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
|
||||||
|
(* Specify build settings such as compiler and linker flags, libraries to be linked, etc. here *)
|
||||||
|
|
||||||
|
Switch[$OperatingSystem,
|
||||||
|
"MacOSX", (* Compilation settings for OS X *)
|
||||||
|
$buildSettings = {
|
||||||
|
"CompileOptions" -> {(* "-std=c++14", "-mmacosx-version-min=10.9" *)},
|
||||||
|
|
||||||
|
(* Statically link the tree library *)
|
||||||
|
"ExtraObjectFiles" -> {"/Users/chilkuri/Documents/postdoc/sandbox/python/guga_ice/lib/libgugaice.dylib"},
|
||||||
|
|
||||||
|
(* Tree path *)
|
||||||
|
"IncludeDirectories" -> {"/Users/chilkuri/Documents/postdoc/sandbox/python/guga_ice/lib/Tree","/Users/chilkuri/Documents/postdoc/sandbox/python/guga_ice/lib/Tools"},
|
||||||
|
"LibraryDirectories" -> {"/Users/chilkuri/Documents/postdoc/sandbox/python/guga_ice/lib/"}
|
||||||
|
},
|
||||||
|
|
||||||
|
"Unix", (* Compilation settings for Linux *)
|
||||||
|
$buildSettings = {
|
||||||
|
"CompileOptions" -> {(* "-std=c++14" *)}
|
||||||
|
|
||||||
|
(*
|
||||||
|
, "IncludeDirectories" -> {}
|
||||||
|
, "LibraryDirectories" -> {}
|
||||||
|
*)
|
||||||
|
},
|
||||||
|
|
||||||
|
"Windows", (* Compilation settings for Windows *)
|
||||||
|
$buildSettings = {
|
||||||
|
"CompileOptions" -> {"/EHsc", "/wd4244", "/DNOMINMAX"}
|
||||||
|
|
||||||
|
(*
|
||||||
|
, "IncludeDirectories" -> {}
|
||||||
|
, "LibraryDirectories" -> {}
|
||||||
|
*)
|
||||||
|
}
|
||||||
|
]
|
5
Kernel/init.m
Normal file
5
Kernel/init.m
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
Get["TestPackage`TestPackage`"]
|
||||||
|
|
||||||
|
Column@{
|
||||||
|
"TestPackage [" <> TestPackage`TestPackage`PackagePrivate`$packageVersion <> "]"
|
||||||
|
}
|
7
LibraryResources/Source/TestPackage.h
Normal file
7
LibraryResources/Source/TestPackage.h
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
#include <LTemplate.h>
|
||||||
|
|
||||||
|
class TestPackage {
|
||||||
|
public:
|
||||||
|
double version() const {return 0.2;}
|
||||||
|
|
||||||
|
};
|
111
TestPackage.m
Normal file
111
TestPackage.m
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
Package["TestPackage`"]
|
||||||
|
|
||||||
|
PackageImport["TestPackage`LTemplate`"]
|
||||||
|
|
||||||
|
PackageExport["TestPackage"]
|
||||||
|
TestPackage::usage = "TestPackage is used to test MMAs new package system."
|
||||||
|
TestPackage[] :=Module[{},Return["Hello world: " <> TestPackage`TestPackageVersion[] ]];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
(***** Package variables *****)
|
||||||
|
|
||||||
|
PackageScope["$packageDirectory"]
|
||||||
|
$packageDirectory::usage = "$packageDirectory is the directory where TestPackage is installed.";
|
||||||
|
|
||||||
|
$packageVersion = "0.0.1";
|
||||||
|
$packageDirectory = DirectoryName[$InputFileName];
|
||||||
|
|
||||||
|
$systemID = $SystemID;
|
||||||
|
|
||||||
|
(* On OS X libraries use libc++ ABI since M10.4 and libstdc++ ABI up to M10.3.
|
||||||
|
We need separate binaries to support M10.3 and earlier.
|
||||||
|
http://community.wolfram.com/groups/-/m/t/816033 *)
|
||||||
|
If[$OperatingSystem === "MacOSX", $systemID = $systemID <> If[$VersionNumber <= 10.3, "-libstdc++", "-libc++"]];
|
||||||
|
|
||||||
|
$libraryDirectory = FileNameJoin[{$packageDirectory, "LibraryResources", $systemID}];
|
||||||
|
$sourceDirectory = FileNameJoin[{$packageDirectory, "LibraryResources", "Source"}];
|
||||||
|
$buildSettingsFile = FileNameJoin[{$packageDirectory, "BuildSettings.m"}];
|
||||||
|
|
||||||
|
(* Add $libraryDirectory to $LibraryPath in case package is not installed in $UserBaseDirectory/Applications. *)
|
||||||
|
If[Not@MemberQ[$LibraryPath, $libraryDirectory],
|
||||||
|
PrependTo[$LibraryPath, $libraryDirectory]
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
(***** The library template *****)
|
||||||
|
|
||||||
|
template =LTemplate["TestPackage",
|
||||||
|
{
|
||||||
|
LClass["TestPackage",
|
||||||
|
{
|
||||||
|
LFun["version", {}, Real]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
|
||||||
|
(***** Load build settings, if present *****)
|
||||||
|
|
||||||
|
(* $buildSettings is normally defined in the build settings files.
|
||||||
|
When no build settings file is loaded, it must be set to None. *)
|
||||||
|
$buildSettings = None;
|
||||||
|
If[FileExistsQ[$buildSettingsFile], Get[$buildSettingsFile] ]
|
||||||
|
|
||||||
|
|
||||||
|
TestPackage`Developer`Recompile::build = "No build settings found. Please check BuildSettings.m."
|
||||||
|
|
||||||
|
TestPackage`Developer`Recompile[] :=
|
||||||
|
Module[{},
|
||||||
|
(* abort compilation if no build settings are present *)
|
||||||
|
If[$buildSettings === None,
|
||||||
|
Message[TestPackage`Developer`Recompile::build];
|
||||||
|
Return[$Failed]
|
||||||
|
];
|
||||||
|
(* create directory for binary if it doesn't exist yet *)
|
||||||
|
If[Not@DirectoryQ[$libraryDirectory],
|
||||||
|
CreateDirectory[$libraryDirectory]
|
||||||
|
];
|
||||||
|
(* compile code *)
|
||||||
|
SetDirectory[$sourceDirectory];
|
||||||
|
CompileTemplate[template, { },
|
||||||
|
"ShellCommandFunction" -> Print, "ShellOutputFunction" -> Print,
|
||||||
|
"TargetDirectory" -> $libraryDirectory,
|
||||||
|
Sequence @@ $buildSettings
|
||||||
|
];
|
||||||
|
Print["Compiling2"];
|
||||||
|
ResetDirectory[];
|
||||||
|
(* load library *)
|
||||||
|
loadTestPackage[] (* defined below *)
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
loadTestPackage[] :=
|
||||||
|
Module[{deps},
|
||||||
|
(* mechanism for loading shared library dependencies, if necessary *)
|
||||||
|
deps = FileNameJoin[{$libraryDirectory, "dependencies.m"}];
|
||||||
|
Check[
|
||||||
|
If[FileExistsQ[deps], Get[deps]],
|
||||||
|
Return[$Failed]
|
||||||
|
];
|
||||||
|
(* load the library *)
|
||||||
|
If[LoadTemplate[template] === $Failed,
|
||||||
|
Return[$Failed]
|
||||||
|
];
|
||||||
|
(* TODO add any other post-loading initialization if necessary *)
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
(* Load library, compile if necessary. *)
|
||||||
|
If[LoadTemplate[template] === $Failed,
|
||||||
|
Print[Style["Loading failed, trying to recompile ...", Red]];
|
||||||
|
If[TestPackage`Developer`Recompile[] === $Failed
|
||||||
|
,
|
||||||
|
Print[Style["Cannot load or compile library. \[SadSmiley] Aborting.", Red]];
|
||||||
|
Abort[] (* verified that it is safe to abort while loading a new-style package *)
|
||||||
|
,
|
||||||
|
Print[Style["Successfully compiled and loaded the library. \[HappySmiley]", Red]];
|
||||||
|
]
|
||||||
|
]
|
||||||
|
|
16
Utilities.m
Normal file
16
Utilities.m
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
Package["TestPackage`"]
|
||||||
|
|
||||||
|
PackageImport["TestPackage`LTemplate`"]
|
||||||
|
|
||||||
|
PackageExport["TestPackageVersion"]
|
||||||
|
TestPackageVersion::usage = "TestPackageVersion returns the current version of the package."
|
||||||
|
|
||||||
|
(***** Definitions of package functions *****)
|
||||||
|
|
||||||
|
obj = ""
|
||||||
|
|
||||||
|
PackageExport[TestPackageVersion]
|
||||||
|
SyntaxInformation[TestPackageVersion] = {"ArgumentsPattern" -> {}};
|
||||||
|
TestPackageVersion[] := Block[{obj = Make["TestPackage"]}, obj@"version"[]] (* TODO example function, remove if not used *)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user