diff --git a/pecl/package.xml.in b/pecl/package.xml.in
new file mode 100644
index 0000000..ca43925
--- /dev/null
+++ b/pecl/package.xml.in
@@ -0,0 +1,47 @@
+
+
+ pdlib
+ pecl.php.net
+ PHP extension for Dlib
+
+ This extension provide some machine learning capability to php via Dlib.
+
+
+ Malvin Lok
+ goodspb
+ goodspb.luo@gmail.com
+ yes
+
+ %RELEASE_DATE%
+
+
+ %RELEASE_VERSION%
+ %RELEASE_VERSION%
+
+
+ %RELEASE_STABILITY%
+ %RELEASE_STABILITY%
+
+ MIT
+
+- Add native vector_lenght() function which calculates the euclidean distance 80% faster
+
+
+%RELEASE_FILES%
+
+
+
+
+ 7.2.0
+
+
+ 1.4.0b1
+
+
+
+ pdlib
+
+
\ No newline at end of file
diff --git a/pecl/prep-release.php b/pecl/prep-release.php
new file mode 100644
index 0000000..248a27b
--- /dev/null
+++ b/pecl/prep-release.php
@@ -0,0 +1,162 @@
+ array(
+ "pdlib.cc",
+ "pdlib.php",
+ "php_pdlib.h",
+ "config.{m4,w32}",
+ "src/*.{cc,h}",
+ "dlib/**/*.{cpp,h}",
+ "dlib/**/**/*.{cpp,h}",
+ "dlib/**/**/**/*.{cpp,h}",
+ ),
+ 'test' => array(
+ "tests/*.{phpt}",
+ ),
+ 'doc' => array(
+ "README*",
+ "LICENSE",
+ "CREDITS",
+ )
+ );
+ $files = array();
+ foreach($dirs as $role => $patterns) {
+ foreach ($patterns as $pattern) {
+ foreach (glob($pattern, GLOB_BRACE) as $file) {
+ $files[$file] = $role;
+ }
+ }
+ }
+ ksort($files);
+ return $files;
+}
+
+function format_open_dir($dir, $tab) {
+ return sprintf('%s
', str_repeat(" ", $tab), $dir);
+}
+function format_close_dir($tab) {
+ return sprintf("%s", str_repeat(" ", $tab));
+}
+function format_file($filename, $tab, $role) {
+ return sprintf('%s', str_repeat(" ", $tab+1), $role, $filename);
+}
+function make_tree($files) {
+ $retval = array();
+ $lastdir = ".";
+ $tab = 2;
+
+ $retval[] = format_open_dir("/", $tab);
+ foreach($files as $file => $role) {
+ $dir = dirname($file);
+ $filename = basename($file);
+ if ($dir != $lastdir) {
+ $currdir = explode("/", $dir);
+ $prevdir = explode("/", $lastdir);
+ foreach($currdir as $n => $d) {
+ if (isset($prevdir[$n]) && $prevdir[$n] == $d) {
+ /* In case we are shorter then previous */
+ $n++;
+ continue;
+ }
+ break;
+ }
+ if ($lastdir != ".") {
+ foreach(array_reverse(array_slice($prevdir, $n)) as $close) {
+ $retval[] = format_close_dir($tab--);
+ }
+ }
+ foreach(array_slice($currdir, $n) as $open) {
+ $retval[] = format_open_dir($open, ++$tab);
+ }
+ }
+ $retval[] = format_file($filename, $tab, $role);
+ $lastdir = $dir;
+ }
+ foreach(array_reverse(explode("/", $lastdir)) as $close) {
+ $retval[] = format_close_dir($tab--);
+ }
+ $retval[] = format_close_dir($tab);
+
+ return $retval;
+}
+
+function usage() {
+ global $argv;
+
+ echo "Usage:\n\t";
+ echo $argv[0], " \n";
+
+ exit(1);
+}
+
+if ($argc != 3) {
+ usage();
+}
+
+$VERSION = $argv[1];
+$STABILITY = $argv[2];
+
+/* 0.x.y. are developmental releases and cannot be stable */
+if ((int)$VERSION < 1) {
+ $STABILITY = "devel";
+}
+
+/* A release candidate is a "beta" stability in terms of PECL */
+if (stristr($VERSION, '-rc') !== false) {
+ $STABILITY = "beta";
+}
+
+verify_stability($STABILITY);
+verify_version($VERSION, $STABILITY);
+
+$currtime = new DateTime('now', new DateTimeZone('UTC'));
+$DATE = $currtime->format('Y-m-d');
+$TIME = $currtime->format('H:i:s');
+
+$TREE = make_tree(get_files());
+
+$contents = file_get_contents(__DIR__ . "/package.xml.in");
+
+$REPLACE = array(
+ "%RELEASE_DATE%" => $DATE,
+ "%RELEASE_TIME%" => $TIME,
+ "%RELEASE_VERSION%" => $VERSION,
+ "%RELEASE_STABILITY%" => $STABILITY,
+ "%RELEASE_FILES%" => join("\n", $TREE),
+);
+
+$contents = str_replace(array_keys($REPLACE), array_values($REPLACE), $contents);
+
+file_put_contents(__DIR__ . "/../package.xml", $contents);
+echo "Wrote package.xml\n";
+