reapack

Package manager for REAPER
Log | Files | Refs | Submodules | README | LICENSE

commit 224a176496abd503cb029567ea6668a7dd714134
parent 081cab31c7012255d11225c73fc695f8cec169d3
Author: cfillion <cfillion@users.noreply.github.com>
Date:   Fri,  4 Dec 2015 14:55:24 -0800

port on windows

Diffstat:
M.gitignore | 4++--
MREADME.md | 17+++++++++++++++++
MTupfile | 38++++++++++++++++++--------------------
ATupfile.osx | 18++++++++++++++++++
ATupfile.win32 | 18++++++++++++++++++
Msrc/config.cpp | 12++++++------
Msrc/database.hpp | 4++--
Msrc/download.cpp | 4++--
Msrc/download.hpp | 2+-
Msrc/package.cpp | 4++--
Msrc/package.hpp | 2+-
Msrc/path.cpp | 8++++++++
Msrc/path.hpp | 4++--
Msrc/version.cpp | 6+++---
Msrc/version.hpp | 8++++----
Mtest/database_v1.cpp | 2+-
16 files changed, 105 insertions(+), 46 deletions(-)

diff --git a/.gitignore b/.gitignore @@ -2,5 +2,5 @@ .tup/ bin/ build/ -vendor/*.h* -vendor/WDL/ +vendor/ +!vendor/.gitkeep diff --git a/README.md b/README.md @@ -37,3 +37,20 @@ vendor `brew install tup boost` 3. Run `tup --quiet && bin/test` from this directory 4. Copy or link `bin/reaper_reapack.dylib` to REAPER's extension directory + +### Windows + +1. Install [tup](http://gittup.org/tup/) and + [Visual Studio Express 2013 for Desktop](https://www.microsoft.com/en-ca/download/details.aspx?id=44914) +2. Download the latest [boost](http://www.boost.org/) and copy the + `boost` subdirectory into `<reapack>\vendor` +3. Download the latest [curl](http://curl.haxx.se/download.html) source + code and extract it on your computer +4. Launch "Developer Command Prompt for VS2013" and run + `VC\vcvarsall x86_amd64` (or x86 for 32-bit) +5. Navigate to `<curl directory>\winbuild` and run + `nmake /f Makefile.vc mode=static MACHINE=x64` (or x86) +6. Copy `..\builds\libcurl-vc-x64-release-static-ipv6-sspi-winssl` + to `<reapack directory>\vendor` as `libcurl` +7. Navigate to `<reapack directory>` and run `tup --quiet` +8. Run `bin\test` and copy `bin\reaper_reapack.dll` to your REAPER plugin folder diff --git a/Tupfile b/Tupfile @@ -1,32 +1,30 @@ -CXX := c++ - -CXXFLAGS := -Wall -Wextra -Werror -Wno-unused-parameter -pipe -fPIC -CXXFLAGS += -fdiagnostics-color -fstack-protector-strong -CXXFLAGS += -O2 -std=c++14 -CXXFLAGS += -Ivendor -Ivendor/WDL -Ivendor/WDL/WDL -CXXFLAGS += -DWDL_NO_DEFINE_MINMAX - -LDFLAGS := -framework Cocoa -framework Carbon -lcurl -SOFLAGS := -dynamiclib - WDL := vendor/WDL/WDL -SWELL := $(WDL)/swell -WDLSOURCE := $(SWELL)/swell.cpp $(SWELL)/swell-ini.cpp -WDLSOURCE += $(SWELL)/swell-gdi.mm $(SWELL)/swell-kb.mm $(SWELL)/swell-menu.mm -WDLSOURCE += $(SWELL)/swell-misc.mm $(SWELL)/swell-dlg.mm $(SWELL)/swell-wnd.mm +ifeq (@(TUP_PLATFORM),macosx) + SWELL := $(WDL)/swell + WDLSOURCE := $(SWELL)/swell.cpp $(SWELL)/swell-ini.cpp + WDLSOURCE += $(SWELL)/swell-gdi.mm $(SWELL)/swell-kb.mm $(SWELL)/swell-menu.mm + WDLSOURCE += $(SWELL)/swell-misc.mm $(SWELL)/swell-dlg.mm $(SWELL)/swell-wnd.mm +endif TINYXML := $(WDL)/tinyxml WDLSOURCE += $(TINYXML)/tinyxml.cpp $(TINYXML)/tinystr.cpp WDLSOURCE += $(TINYXML)/tinyxmlparser.cpp $(TINYXML)/tinyxmlerror.cpp -!build = |> $(CXX) $(CXXFLAGS) -c %f -o %o |> -!link = |> $(CXX) $(CXXFLAGS) %f $(LDFLAGS) -o %o |> +ifeq (@(TUP_PLATFORM),macosx) + include Tupfile.osx +else + ifeq (@(TUP_PLATFORM),win32) + include Tupfile.win32 + else + error Unsupported platform. + endif +endif : foreach src/*.cpp |> !build |> build/%B.o -: foreach $(WDLSOURCE) |> !build -std=c++98 -w |> build/wdl_%B.o -: build/*.o |> !link $(SOFLAGS) |> bin/reaper_reapack.dylib +: foreach $(WDLSOURCE) |> !build $(WDLFLAGS) |> build/wdl_%B.o +: build/*.o |> !link $(SOFLAGS) |> $(LIB_TARGET) : foreach test/*.cpp |> !build -Isrc |> build/test/%B.o : test/helper/*.cpp |> !build -Isrc |> build/test/helper_%B.o -: build/*.o build/test/*.o |> !link |> bin/test +: build/*.o build/test/*.o |> !link |> $(TEST_TARGET) diff --git a/Tupfile.osx b/Tupfile.osx @@ -0,0 +1,18 @@ +CXX := c++ + +CXXFLAGS := -Wall -Wextra -Werror -Wno-unused-parameter -pipe -fPIC +CXXFLAGS += -fdiagnostics-color -fstack-protector-strong +CXXFLAGS += -O2 -std=c++14 +CXXFLAGS += -Ivendor -Ivendor/WDL -Ivendor/WDL/WDL +CXXFLAGS += -DWDL_NO_DEFINE_MINMAX + +WDLFLAGS := -std=c++98 -w + +LDFLAGS := -framework Cocoa -framework Carbon -lcurl +SOFLAGS := -dynamiclib + +LIB_TARGET = bin/reaper_reapack.dylib +TEST_TARGET = bin/test + +!build = |> $(CXX) $(CXXFLAGS) -c %f -o %o |> +!link = |> $(CXX) $(CXXFLAGS) %f $(LDFLAGS) -o %o |> diff --git a/Tupfile.win32 b/Tupfile.win32 @@ -0,0 +1,18 @@ +CXX := cl +LD := link + +CXXFLAGS := /nologo /W3 /WX /wd4996 /O2 /EHsc /MD +CXXFLAGS += /Ivendor /Ivendor/WDL /Ivendor/WDL/WDL +CXXFLAGS += /Ivendor/libcurl/include +CXXFLAGS += /DWDL_NO_DEFINE_MINMAX +CXXFLAGS += /DCURL_STATICLIB + +LDFLAGS := /nologo vendor/libcurl/lib/libcurl_a.lib +SOFLAGS := /DLL /OUT:bin/reaper_reapack.dll + +LIB_TARGET = bin/reaper_reapack.dll +LIB_TARGET += bin/reaper_reapack.lib bin/reaper_reapack.exp +TEST_TARGET = bin/test.exe bin/test.lib bin/test.exp + +!build = |> $(CXX) $(CXXFLAGS) /c %f /Fo%o |> +!link = |> $(LD) $(LDFLAGS) %f /OUT:bin/test.exe |> diff --git a/src/config.cpp b/src/config.cpp @@ -16,7 +16,7 @@ static const char *REGISTRY_GRP = "registry"; static const char *PACK_KEY = "reapack"; static const char *VER_KEY = "version"; -static string ArrayKey(const string &key, const int i) +static string ArrayKey(const string &key, const size_t i) { return key + to_string(i); } @@ -66,7 +66,7 @@ void Config::write() const void Config::readRemotes() { - int i = 0; + size_t i = 0; do { const string name = getString(REMOTES_GRP, ArrayKey(NAME_KEY, i)); @@ -81,9 +81,9 @@ void Config::readRemotes() void Config::writeRemotes() const { - const int size = m_remotes.size(); + const size_t size = m_remotes.size(); - for(int i = 0; i < size; i++) { + for(size_t i = 0; i < size; i++) { const Remote &remote = m_remotes[i]; setString(REMOTES_GRP, ArrayKey(NAME_KEY, i), remote.name()); @@ -93,7 +93,7 @@ void Config::writeRemotes() const void Config::readRegistry() { - int i = 0; + size_t i = 0; do { const string pack = getString(REGISTRY_GRP, ArrayKey(PACK_KEY, i)); @@ -108,7 +108,7 @@ void Config::readRegistry() void Config::writeRegistry() const { - int i = 0; + size_t i = 0; for(auto it = m_registry.begin(); it != m_registry.end(); it++, i++) { setString(REGISTRY_GRP, ArrayKey(PACK_KEY, i), it->first); diff --git a/src/database.hpp b/src/database.hpp @@ -26,7 +26,7 @@ public: void addCategory(Category *cat); const CategoryList &categories() const { return m_categories; } - Category *category(const int i) const { return m_categories[i]; } + Category *category(const size_t i) const { return m_categories[i]; } const PackageList &packages() const { return m_packages; } @@ -50,7 +50,7 @@ public: void addPackage(Package *pack); const PackageList &packages() const { return m_packages; } - Package *package(const int i) const { return m_packages[i]; } + Package *package(const size_t i) const { return m_packages[i]; } private: Database *m_database; diff --git a/src/download.cpp b/src/download.cpp @@ -45,10 +45,10 @@ void Download::addCallback(const Download::Callback &callback) void Download::TimerTick() { vector<Download *> &activeDownloads = Download::s_active; - const int size = activeDownloads.size(); + const size_t size = activeDownloads.size(); const auto begin = activeDownloads.begin(); - for(int i = 0; i < size; i++) { + for(size_t i = 0; i < size; i++) { Download *download = activeDownloads[i]; if(!download->isFinished()) diff --git a/src/download.hpp b/src/download.hpp @@ -62,7 +62,7 @@ public: ~DownloadQueue(); void push(Download *); - int size() const { return m_queue.size(); } + size_t size() const { return m_queue.size(); } bool empty() const { return m_queue.empty(); } private: diff --git a/src/package.cpp b/src/package.cpp @@ -32,11 +32,11 @@ void Package::addVersion(Version *ver) m_versions.insert(ver); } -Version *Package::version(const int index) const +Version *Package::version(const size_t index) const { auto it = m_versions.begin(); - for(int i = 0; i < index; i++) + for(size_t i = 0; i < index; i++) it++; return *it; diff --git a/src/package.hpp b/src/package.hpp @@ -30,7 +30,7 @@ public: void addVersion(Version *ver); const VersionSet &versions() const { return m_versions; } - Version *version(const int i) const; + Version *version(const size_t i) const; Version *lastVersion() const; Path targetPath() const; diff --git a/src/path.cpp b/src/path.cpp @@ -20,6 +20,14 @@ void Path::append(const string &part) m_parts.push_back(part); } +string Path::basename() const +{ + if(m_parts.empty()) + return string(); + + return m_parts.back(); +} + string Path::join(const bool skipLast) const { string path; diff --git a/src/path.hpp b/src/path.hpp @@ -10,9 +10,9 @@ public: void append(const std::string &part); bool empty() const { return m_parts.empty(); } - int size() const { return m_parts.size(); } + size_t size() const { return m_parts.size(); } - const std::string &basename() const { return m_parts.back(); } + std::string basename() const; std::string dirname() const { return join(true); } std::string join() const { return join(false); } diff --git a/src/version.cpp b/src/version.cpp @@ -18,16 +18,16 @@ Version::Version(const std::string &str) // set the major version by default // even if there are less than 4 numeric components in the string - const int size = std::max(4L, distance(begin, end)); + const size_t size = max((size_t)4, (size_t)distance(begin, end)); if(begin == end || size > 4L) throw reapack_error("invalid version name"); for(sregex_iterator it = begin; it != end; it++) { const smatch match = *it; - const int index = distance(begin, it); + const size_t index = distance(begin, it); - m_code += stoi(match[1]) * pow(1000, size - index - 1); + m_code += stoi(match[1]) * (size_t)pow(1000, size - index - 1); } } diff --git a/src/version.hpp b/src/version.hpp @@ -14,20 +14,20 @@ public: ~Version(); const std::string &name() const { return m_name; } - unsigned long code() const { return m_code; } + size_t code() const { return m_code; } void setChangelog(const std::string &); const std::string &changelog() const { return m_changelog; } void addSource(Source *source); const SourceList &sources() const { return m_sources; } - Source *source(const int i) const { return m_sources[i]; } + Source *source(const size_t i) const { return m_sources[i]; } bool operator<(const Version &) const; private: std::string m_name; - unsigned long m_code; + size_t m_code; std::string m_changelog; SourceList m_sources; @@ -35,7 +35,7 @@ private: class VersionCompare { public: - constexpr bool operator()(const Version *l, const Version *r) const + bool operator()(const Version *l, const Version *r) const { return *l < *r; } diff --git a/test/database_v1.cpp b/test/database_v1.cpp @@ -54,7 +54,7 @@ TEST_CASE("null package type", M) { Database *db = Database::load(DBPATH "missing_type.xml"); DBPTR(db); } - catch(const reapack_error &e) { + catch(const reapack_error &) { // no segfault -> test passes! } }