Use CMake to resolve most dependencies

The CEF dependency is not resolved using CMake because it's only
available behind a CAPTCHA, and the Boost dependency is not resolved
using CMake because it is a relatively large dependency that is better
shared between LOOT and its dependencies that use it, instead of each
having to build a separate copy.

This is slower than the existing Travis script, because all targets in
the dependencies are now built, but it is more portable.
This commit is contained in:
Oliver Hamlet
2016-03-22 14:34:48 +00:00
parent 31991899c9
commit b9bf9f2e86
5 changed files with 139 additions and 180 deletions
+2 -17
View File
@@ -25,9 +25,6 @@ addons:
install:
# Use GCC 5.
- if [ "$CXX" = "g++" ]; then export CXX="g++-5" CC="gcc-5"; fi
# Run install step script to download and build dependencies.
- chmod +x scripts/install-step.travis.sh
- ./scripts/install-step.travis.sh
# Install the latest stable Node.js. The default Node.js version is too old
# for some of the JavaScript syntax used.
- npm install -g nvm
@@ -40,22 +37,10 @@ install:
- bower install
before_script:
# Build Google Test
- cd ../..
- wget https://github.com/google/googletest/archive/release-1.7.0.tar.gz -O - | tar -xz
- cd googletest-release-1.7.0
- cmake .
- make
# Move into the cloned LOOT repo build path.
- mkdir $TRAVIS_BUILD_DIR/build && cd $TRAVIS_BUILD_DIR/build
# Fetch plugins to test with.
- wget https://github.com/WrinklyNinja/testing-plugins/archive/1.0.0.tar.gz -O - | tar -xz
- mv testing-plugins-1.0.0/* ./
# Fetch metadata to test with.
- wget https://github.com/loot/testing-metadata/archive/1.0.0.tar.gz -O - | tar -xz
- mv testing-metadata-1.0.0 testing-metadata
- mkdir build && cd build
# Travis machines are 64 bit, and the dependencies use dynamic linking.
- cmake .. -DPROJECT_ARCH=64 -DPROJECT_STATIC_RUNTIME=OFF -DBUILD_SHARED_LIBS=OFF -DGTEST_ROOT=../../googletest-release-1.7.0
- cmake .. -DPROJECT_STATIC_RUNTIME=OFF -DBUILD_SHARED_LIBS=OFF
script:
- '[ "${TRAVIS_PULL_REQUEST}" = "false" ] && npm test || false'
+132 -63
View File
@@ -1,7 +1,14 @@
# Settings passed on the command line:
#
# PROJECT_ARCH = the build architecture
# LIBESPM_ROOT = the path to the root of the libespm source.
cmake_minimum_required (VERSION 2.8)
cmake_policy(SET CMP0015 NEW)
project (LOOT)
include(ExternalProject)
option(BUILD_SHARED_LIBS "Build a shared library" ON)
option(PROJECT_STATIC_RUNTIME "Build with static runtime libs (/MT)" ON)
##############################
# Get Build Revision
@@ -24,16 +31,9 @@ message(STATUS "Git revision: ${GIT_COMMIT_STRING}")
configure_file("${CMAKE_SOURCE_DIR}/src/backend/globals.cpp.in" "${CMAKE_BINARY_DIR}/generated/globals.cpp" @ONLY)
##############################
# General Settings
# External Projects
##############################
cmake_minimum_required (VERSION 2.8)
cmake_policy(SET CMP0015 NEW)
project (LOOT)
option(BUILD_SHARED_LIBS "Build a shared library" ON)
option(PROJECT_STATIC_RUNTIME "Build with static runtime libs (/MT)" ON)
# With MSVC, the 32/64 bit compilers have separate generators, so PROJECT_ARCH
# should always match whichever is being used.
IF (MSVC)
@@ -42,30 +42,12 @@ IF (MSVC)
ELSE ()
set (PROJECT_ARCH "32")
ENDIF ()
set(YAML_CPP_LIBRARY_SUFFIX "mt${CMAKE_STATIC_LIBRARY_SUFFIX}")
ELSE ()
IF (NOT DEFINED PROJECT_ARCH)
set (PROJECT_ARCH "32")
ENDIF ()
ENDIF ()
IF (NOT DEFINED LIBESPM_ROOT)
set (LIBESPM_ROOT "../../libespm")
ENDIF ()
IF (NOT DEFINED LIBGIT2_ROOT)
set (LIBGIT2_ROOT "../../libgit2")
ENDIF ()
IF (NOT DEFINED LIBLOADORDER_ROOT)
set (LIBLOADORDER_ROOT "../../libloadorder")
ENDIF ()
IF (NOT DEFINED CEF_ROOT)
set (CEF_ROOT "../../cef")
ENDIF ()
IF (NOT DEFINED PSEUDOSEM_ROOT)
set (PSEUDOSEM_ROOT "../../pseudosem")
set(YAML_CPP_LIBRARY_SUFFIX ${CMAKE_STATIC_LIBRARY_SUFFIX})
ENDIF ()
set (Boost_USE_STATIC_LIBS ${PROJECT_STATIC_RUNTIME})
@@ -77,8 +59,87 @@ IF (NOT Boost_USE_STATIC_LIBS)
ENDIF ()
find_package(Boost REQUIRED COMPONENTS atomic log log_setup regex locale thread date_time chrono filesystem system iostreams)
find_package(yaml-cpp)
find_package(GTest)
ExternalProject_Add(GTest
PREFIX "external"
URL "https://github.com/google/googletest/archive/release-1.7.0.tar.gz"
INSTALL_COMMAND "")
ExternalProject_Get_Property(GTest SOURCE_DIR BINARY_DIR)
set (GTEST_INCLUDE_DIRS "${SOURCE_DIR}/include")
set (GTEST_LIBRARIES "${BINARY_DIR}/${CMAKE_CFG_INTDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}gtest${CMAKE_STATIC_LIBRARY_SUFFIX}")
ExternalProject_Add(libespm
PREFIX "external"
URL "https://github.com/WrinklyNinja/libespm/archive/2.5.2.tar.gz"
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND "")
ExternalProject_Get_Property(libespm SOURCE_DIR)
set (LIBESPM_INCLUDE_DIRS "${SOURCE_DIR}/include")
ExternalProject_Add(libgit2
PREFIX "external"
URL "https://github.com/libgit2/libgit2/archive/v0.24.0.tar.gz"
CMAKE_ARGS -DBUILD_SHARED_LIBS=OFF -DBUILD_CLAR=OFF
BUILD_COMMAND ${CMAKE_COMMAND} --build . --target git2 --config $(CONFIGURATION)
INSTALL_COMMAND "")
ExternalProject_Get_Property(libgit2 SOURCE_DIR BINARY_DIR)
set(LIBGIT2_INCLUDE_DIRS "${SOURCE_DIR}/include")
set(LIBGIT2_LIBRARIES "${BINARY_DIR}/${CMAKE_CFG_INTDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}git2${CMAKE_STATIC_LIBRARY_SUFFIX}")
ExternalProject_Add(libloadorder
PREFIX "external"
DEPENDS libespm
URL "https://github.com/WrinklyNinja/libloadorder/archive/8.0.0.tar.gz"
CMAKE_ARGS -DBOOST_INCLUDEDIR=${Boost_INCLUDE_DIR} -DPROJECT_STATIC_RUNTIME=${PROJECT_STATIC_RUNTIME}
# BUILD_COMMAND ${CMAKE_COMMAND} --build . --target loadorder --config $(CONFIGURATION)
INSTALL_COMMAND "")
ExternalProject_Get_Property(libloadorder SOURCE_DIR BINARY_DIR)
set(LIBLOADORDER_INCLUDE_DIRS "${SOURCE_DIR}/include")
set(LIBLOADORDER_LIBRARIES "${BINARY_DIR}/${CMAKE_CFG_INTDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}loadorder${CMAKE_STATIC_LIBRARY_SUFFIX}")
ExternalProject_Add(pseudosem
PREFIX "external"
URL "https://github.com/WrinklyNinja/pseudosem/archive/1.0.1.tar.gz"
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND "")
ExternalProject_Get_Property(pseudosem SOURCE_DIR)
set(PSEUDOSEM_INCLUDE_DIRS "${SOURCE_DIR}/include")
ExternalProject_Add(testing-metadata
PREFIX "external"
URL "https://github.com/loot/testing-metadata/archive/1.0.0.tar.gz"
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND "")
ExternalProject_Add(testing-plugins
PREFIX "external"
URL "https://github.com/WrinklyNinja/testing-plugins/archive/1.0.0.tar.gz"
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND "")
ExternalProject_Add(yaml-cpp
PREFIX "external"
URL "https://github.com/WrinklyNinja/yaml-cpp/archive/patched-for-loot.tar.gz"
CMAKE_ARGS -DMSVC_SHARED_RT=OFF
BUILD_COMMAND ${CMAKE_COMMAND} --build . --target yaml-cpp --config $(CONFIGURATION)
INSTALL_COMMAND "")
ExternalProject_Get_Property(yaml-cpp SOURCE_DIR BINARY_DIR)
set(YAML_CPP_INCLUDE_DIRS "${SOURCE_DIR}/include")
set(YAML_CPP_LIBRARIES "${BINARY_DIR}/${CMAKE_CFG_INTDIR}/libyaml-cpp${YAML_CPP_LIBRARY_SUFFIX}")
##############################
# General Settings
##############################
IF (NOT DEFINED CEF_ROOT)
set (CEF_ROOT "../../cef")
ENDIF ()
set (LOOT_SRC "${CMAKE_SOURCE_DIR}/src/backend/metadata/conditional_metadata.cpp"
"${CMAKE_SOURCE_DIR}/src/backend/metadata/file.cpp"
@@ -163,10 +224,10 @@ set (LOOT_VALIDATOR_SRC ${LOOT_SRC}
set (LOOT_VALIDATOR_HEADERS ${LOOT_HEADERS})
set (LOOT_TESTS_SRC ${LOOT_SRC}
"${CMAKE_SOURCE_DIR}/src/api/loot_db.cpp"
"${CMAKE_SOURCE_DIR}/src/gui/loot_settings.cpp"
"${CMAKE_SOURCE_DIR}/src/gui/loot_state.cpp"
"${CMAKE_SOURCE_DIR}/src/tests/main.cpp")
"${CMAKE_SOURCE_DIR}/src/api/loot_db.cpp"
"${CMAKE_SOURCE_DIR}/src/gui/loot_settings.cpp"
"${CMAKE_SOURCE_DIR}/src/gui/loot_state.cpp"
"${CMAKE_SOURCE_DIR}/src/tests/main.cpp")
set (LOOT_TESTS_HEADERS "${CMAKE_SOURCE_DIR}/src/tests/fixtures.h"
"${CMAKE_SOURCE_DIR}/src/tests/printers.h"
@@ -194,8 +255,8 @@ set (LOOT_TESTS_HEADERS "${CMAKE_SOURCE_DIR}/src/tests/fixtures.h"
"${CMAKE_SOURCE_DIR}/src/tests/backend/test_metadata_list.h"
"${CMAKE_SOURCE_DIR}/src/tests/backend/test_masterlist.h"
"${CMAKE_SOURCE_DIR}/src/tests/backend/test_plugin_sorter.h"
"${CMAKE_SOURCE_DIR}/src/tests/gui/test_loot_settings.h"
"${CMAKE_SOURCE_DIR}/src/tests/gui/test_loot_state.h")
"${CMAKE_SOURCE_DIR}/src/tests/gui/test_loot_settings.h"
"${CMAKE_SOURCE_DIR}/src/tests/gui/test_loot_state.h")
source_group("Header Files\\backend" FILES ${LOOT_HEADERS})
source_group("Header Files\\gui" FILES ${LOOT_GUI_HEADERS})
@@ -211,21 +272,17 @@ source_group("Source Files\\validator" FILES ${LOOT_VALIDATOR_SRC})
# Include source and library directories.
include_directories ("${CMAKE_SOURCE_DIR}/src"
"${CMAKE_SOURCE_DIR}/include"
"${LIBLOADORDER_ROOT}/include"
"${LIBGIT2_ROOT}/include"
${LIBLOADORDER_INCLUDE_DIRS}
${LIBGIT2_INCLUDE_DIRS}
${CEF_ROOT}
"${LIBESPM_ROOT}/include"
${LIBESPM_INCLUDE_DIRS}
${Boost_INCLUDE_DIRS}
${YAML_CPP_INCLUDE_DIR}
${YAML_CPP_INCLUDE_DIRS}
${GTEST_INCLUDE_DIRS}
"${PSEUDOSEM_ROOT}/include")
${PSEUDOSEM_INCLUDE_DIRS})
# Look in build and build/<arch> folders to support single and multiarch builds.
link_directories ("${LIBLOADORDER_ROOT}/build"
"${LIBLOADORDER_ROOT}/build/${PROJECT_ARCH}"
"${LIBGIT2_ROOT}/build"
"${LIBGIT2_ROOT}/build/${PROJECT_ARCH}"
"${CEF_ROOT}"
link_directories ("${CEF_ROOT}"
"${CEF_ROOT}/build/libcef_dll")
@@ -238,7 +295,7 @@ IF ($ENV{TRAVIS})
add_definitions (-DTRAVIS)
ENDIF ()
# Settings when compiling for Windows. Since it's a Windows-only app this is always true, but useful to check for copy/paste into other projects.
# Settings when compiling for Windows.
IF (CMAKE_SYSTEM_NAME MATCHES "Windows")
add_definitions (-DUNICODE -D_UNICODE -DLIBLO_STATIC)
set (LOOT_API_SRC ${LOOT_API_SRC} "${CMAKE_SOURCE_DIR}/src/resource.rc")
@@ -254,12 +311,10 @@ IF (CMAKE_COMPILER_IS_GNUCXX)
set (CMAKE_MODULE_LINKER_FLAGS "-static-libstdc++ -static-libgcc")
ENDIF ()
set (LOOT_LIBS git2
ssl
set (LOOT_LIBS ssl
curl
z
crypto
loadorder${PROJECT_ARCH})
crypto)
set (LOOT_GUI_LIBS ${LOOT_LIBS}
cef
cef_dll_wrapper
@@ -298,9 +353,7 @@ ELSEIF (MSVC)
ENDFOREACH()
ENDIF ()
set (LOOT_LIBS git2
version
loadorder${PROJECT_ARCH}
set (LOOT_LIBS version
ws2_32
shlwapi
winhttp
@@ -321,21 +374,23 @@ ENDIF ()
# Build API.
add_library (loot${PROJECT_ARCH} ${LOOT_API_SRC} ${LOOT_API_HEADERS})
target_link_libraries (loot${PROJECT_ARCH} ${Boost_LIBRARIES} ${YAML_CPP_LIBRARIES} ${LOOT_LIBS})
add_dependencies (loot${PROJECT_ARCH} libespm libgit2 libloadorder pseudosem yaml-cpp)
target_link_libraries (loot${PROJECT_ARCH} ${Boost_LIBRARIES} ${YAML_CPP_LIBRARIES} ${LIBGIT2_LIBRARIES} ${LOOT_LIBS} ${LIBLOADORDER_LIBRARIES})
IF (${GTEST_FOUND})
# Build tests.
add_executable(tests ${LOOT_TESTS_SRC} ${LOOT_TESTS_HEADERS})
target_link_libraries(tests loot${PROJECT_ARCH} ${Boost_LIBRARIES} ${YAML_CPP_LIBRARIES} ${LOOT_LIBS} ${GTEST_BOTH_LIBRARIES})
ENDIF ()
# Build tests.
add_executable(tests ${LOOT_TESTS_SRC} ${LOOT_TESTS_HEADERS})
add_dependencies(tests loot${PROJECT_ARCH} GTest testing-metadata testing-plugins)
target_link_libraries(tests loot${PROJECT_ARCH} ${Boost_LIBRARIES} ${YAML_CPP_LIBRARIES} ${LOOT_LIBS} ${GTEST_LIBRARIES})
# Build application.
add_executable (LOOT ${LOOT_GUI_SRC} ${LOOT_GUI_HEADERS})
target_link_libraries (LOOT ${Boost_LIBRARIES} ${YAML_CPP_LIBRARIES} ${LOOT_GUI_LIBS})
add_dependencies (LOOT libespm libgit2 libloadorder pseudosem yaml-cpp)
target_link_libraries (LOOT ${Boost_LIBRARIES} ${LOOT_GUI_LIBS} ${LIBGIT2_LIBRARIES} ${LIBLOADORDER_LIBRARIES} ${YAML_CPP_LIBRARIES})
# Build validator.
add_executable (metadata-validator ${LOOT_VALIDATOR_SRC} ${LOOT_VALIDATOR_HEADERS})
target_link_libraries (metadata-validator ${Boost_LIBRARIES} ${YAML_CPP_LIBRARIES} ${LOOT_LIBS})
add_dependencies (LOOT libespm libgit2 libloadorder yaml-cpp)
target_link_libraries (metadata-validator ${Boost_LIBRARIES} ${LOOT_LIBS} ${LIBGIT2_LIBRARIES} ${LIBLOADORDER_LIBRARIES} ${YAML_CPP_LIBRARIES})
@@ -423,3 +478,17 @@ ENDFOREACH()
# Run Vulcanize to build the UI HTML.
add_custom_command(TARGET LOOT POST_BUILD
COMMAND "node" "${CMAKE_SOURCE_DIR}/scripts/vulcanize.js" ${CMAKE_SOURCE_DIR})
# Copy testing metadata
ExternalProject_Get_Property(testing-metadata SOURCE_DIR)
add_custom_command(TARGET tests POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
${SOURCE_DIR}
"$<TARGET_FILE_DIR:tests>/testing-metadata")
# Copy testing plugins
ExternalProject_Get_Property(testing-plugins SOURCE_DIR)
add_custom_command(TARGET tests POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
${SOURCE_DIR}
$<TARGET_FILE_DIR:tests>)
+2 -19
View File
@@ -25,23 +25,10 @@ Once Node.js is installed, run `npm install` from the repository root to install
### Dependencies
LOOT requires the following C/C++ libraries (version numbers used in latest development revision given):
LOOT requires a mix of web and C/C++ libraries. The web libraries can be fetched by running `./node_modules/.bin/bower install` from the repository root, and most of the C/C++ dependencies are resolved by CMake, but the following must be obtained separately (version numbers used in latest development revision given):
* [Boost](http://www.boost.org) v1.60.0
* [Chromium Embedded Framework](https://bitbucket.org/chromiumembedded/cef) branch 2623: Required to build the GUI, but not the API or tests.
* [Google Test](https://github.com/google/googletest) v1.7: Required to build the tests, but not the API or the GUI.
* [Libespm](http://github.com/WrinklyNinja/libespm) v2.5.0
* [Libgit2](http://libgit2.github.com/) v0.24.0
* [Libloadorder](http://github.com/WrinklyNinja/libloadorder) v7.0.0
* [Pseudosem](http://github.com/WrinklyNinja/pseudosem) v1.0.1
* [yaml-cpp](http://github.com/WrinklyNinja/yaml-cpp): Use the `patched-for-loot` branch.
In addition, LOOT's UI relies on the web libraries below, which can be fetched by running `./node_modules/.bin/bower install` from the repository root.
* [Polymer](https://www.polymer-project.org)
* [Jed](https://github.com/SlexAxton/Jed)
* [Jed Gettext Parser](https://github.com/WrinklyNinja/jed-gettext-parser)
* [Marked](https://github.com/chjj/marked)
### Building
@@ -59,12 +46,8 @@ Parameter | Values | Default |Description
`PROJECT_STATIC_RUNTIME` | `ON`, `OFF` | `ON` | Whether to link the C++ runtime statically or not. This also affects the whether static or shared Boost libraries are used.
`PROJECT_ARCH` | `32`, `64` | `32` | Whether to build 32 or 64 bit LOOT binaries.
`CEF_ROOT` | path | `../../cef` | Path to the root of the Chromium Embedded Framework folder.
`LIBESPM_ROOT` | path | `../../libespm` | Path to the root of the libespm repository folder.
`LIBGIT2_ROOT` | path | `../../libgit2` | Path to the root of the libgit2 repository folder.
`LIBLOADORDER_ROOT` | path | `../../libloadorder` | Path to the root of the libloadorder repository folder.
`PSEUDOSEM_ROOT` | Path | `../../pseudosem` | Path to the root of the Pseudosem repository folder.
The default paths given in the table above are relative to LOOT's `CMakeLists.txt`.
The default paths given in the table above are relative to LOOT's `CMakeLists.txt`. You may also need to set `BOOST_ROOT` if CMake cannot find Boost.
## Packaging Releases
+3 -44
View File
@@ -1,6 +1,6 @@
# Build Instructions using Microsoft Visual C++
These instructions were used to build LOOT using Microsoft Visual Studio 2013 Community, though they should apply to other versions of MSVC.
These instructions were used to build LOOT using Microsoft Visual Studio 2015 Community, though they should apply to other versions of MSVC.
#### Boost
@@ -19,55 +19,14 @@ Most of the required binaries are pre-built, but the libcef_dll_wrapper dynamic
```
mkdir build && cd build
cmake.exe .. -G "Visual Studio 12"
cmake.exe .. -G "Visual Studio 14"
```
2. Open the generated solution file, and build it with `Release` configuration.
#### Google Test
1. Configure CMake and generate a build system for Visual Studio by running:
```
mkdir build && cd build
cmake.exe .. -G "Visual Studio 12"
```
2. Open the generated solution file, and build it with `Release` configuration.
#### Libgit2
1. Configure CMake and generate a build system for Visual Studio by running:
```
mkdir build && cd build
cmake.exe .. -G "Visual Studio 12" -DBUILD_SHARED_LIBS=OFF
```
Adapt the commands as necessary for your particular setup.
2. Open the generated solution file, and build it with `Release` configuration.
#### Libloadorder
Follow the instructions in libloadorder's README.md to build it as a static library.
Example CMake keys: `-DCMAKE_RUNTIME_OUTPUT_DIRECTORY=build -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY=build`
#### yaml-cpp
1. Configure CMake and generate a build system for Visual Studio by running:
```
mkdir build && cd build
cmake.exe .. -G "Visual Studio 12" -DBOOST_ROOT={BOOST_ROOT} -DMSVC_SHARED_RT=OFF
```
Adapt the commands as necessary for your particular setup.
2. Open the generated solution file, and build it with `Release` configuration.
#### LOOT
1. Set CMake up so that it builds the binaries in the `build` subdirectory of the LOOT folder.
2. Define any necessary parameters.
3. Configure CMake, then generate a build system for Visual Studio 12.
3. Configure CMake, then generate a build system for Visual Studio.
4. Open the generated solution file, and build it.
-37
View File
@@ -1,37 +0,0 @@
#!/bin/bash
set -ev
# Move out of LOOT repo path.
cd ../..
# Install libespm.
wget https://github.com/WrinklyNinja/libespm/archive/2.5.0.tar.gz -O - | tar -xz
mv libespm-2.5.0 libespm
# Build yaml-cpp
wget https://github.com/WrinklyNinja/yaml-cpp/archive/patched-for-loot.tar.gz -O - | tar -xz
mv yaml-cpp-patched-for-loot yaml-cpp
mkdir yaml-cpp/build && cd yaml-cpp/build
cmake ..
make yaml-cpp
cd ../..
# Build libgit2
wget https://github.com/libgit2/libgit2/archive/v0.24.0.tar.gz -O - | tar -xz
mv libgit2-0.24.0 libgit2
mkdir libgit2/build && cd libgit2/build
cmake .. -DBUILD_SHARED_LIBS=OFF
make git2
cd ../..
# Build libloadorder
wget https://github.com/WrinklyNinja/libloadorder/archive/7.0.0.tar.gz -O - | tar -xz
mv libloadorder-7.0.0 libloadorder
mkdir libloadorder/build && cd libloadorder/build
cmake .. -DPROJECT_ARCH=64 -DPROJECT_STATIC_RUNTIME=OFF -DBUILD_SHARED_LIBS=OFF -DGTEST_ROOT=../gtest-1.7.0
make loadorder64
cd ../..
# Install pseudosem
wget https://github.com/WrinklyNinja/pseudosem/archive/1.0.1.tar.gz -O - | tar -xz
mv pseudosem-1.0.1 pseudosem