commit 224a176496abd503cb029567ea6668a7dd714134
parent 081cab31c7012255d11225c73fc695f8cec169d3
Author: cfillion <cfillion@users.noreply.github.com>
Date: Fri, 4 Dec 2015 14:55:24 -0800
port on windows
Diffstat:
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!
}
}