143 lines
5.1 KiB
Plaintext
143 lines
5.1 KiB
Plaintext
|
|
[[toc]]
|
|
|
|
## The Setup
|
|
Here we are assuming that you have the following systems and you want a competent and easy-to-use cross-platform and native-centric compiling solution:
|
|
|
|
* Mac OS 10.6.8
|
|
* XCode 4.2
|
|
* Windows 7
|
|
* Visual Studio 2013
|
|
* Linux
|
|
* GNU Make w/ GCC 4
|
|
|
|
## The Problem
|
|
In my experience, many cross-platform build solutions feel very clunky (CMake) or use a specific IDE to provide cross-platform support (Code::Blocks, GNU Make w/ GCC on Windows with many shivs).
|
|
|
|
In the case of the former, I prefer highly portable and very small programs that are easy to deploy to any environment -- CMake does not fulfill this. In the case of the latter, I prefer to use the tools intended for a given platform, as it is a headache not only for oneself to set up all the specific requirements, but it is cumbersome to those who wish to simply build your project.
|
|
|
|
Towards this end, we are searching for a solution that focuses on using **native tools**, is **portable**, and **easy to use**.
|
|
|
|
The answer that I've found is *Premake* -- version 5 to be exact.
|
|
## The Solution: Premake
|
|
### What is Premake
|
|
Premake is...
|
|
### Why Premake
|
|
* Single lua script
|
|
* Portable binary with built-in lua
|
|
### Example premake5.lua
|
|
Let's say you have an SDL2 project that uses OpenGL and you want the following
|
|
directory structure:
|
|
* Project/
|
|
* src/
|
|
* build/
|
|
|
|
*src* is where the project source code lies, and *build* is where you want the
|
|
project files to end up. After compilation, you want the binary to be placed
|
|
in the project root.
|
|
|
|
To create a script compatible with generating project files for Linux, Windows,
|
|
and Mac OS X, you would use a script similar to the following:
|
|
|
|
solution "Project"
|
|
configurations { "Debug", "Release" }
|
|
location ("build/" .. _ACTION)
|
|
|
|
project "Project"
|
|
kind "WindowedApp"
|
|
language "C++"
|
|
targetdir "./"
|
|
location ("build" .. _ACTION)
|
|
|
|
files { "src/**.hpp", "src/**.cpp" }
|
|
|
|
configuration { "linux" }
|
|
buildoptions { "-I/usr/include/SDL2/" }
|
|
links { "SDL2", "GLEW", "GL", "pthread" }
|
|
configuration "windows"
|
|
links { "glew32", "opengl32", "SDL2", "SDL2main", "ws2_32" }
|
|
configuration "macosx"
|
|
syslibdirs { "/Library/Frameworks/" }
|
|
libdirs { "/Library/Frameworks/" }
|
|
links { "SDL2.framework", "OpenGL.framework" }
|
|
includedirs { "/Library/Frameworks/SDL2.framework/Headers/" }
|
|
sysincludedirs { "/Library/Frameworks/SDL2.framework/Headers/" }
|
|
|
|
### The Linux Build
|
|
On Linux, you have multiple options, but here we assume GNU make is our target project file:
|
|
|
|
premake5 gmake
|
|
|
|
Afterwards, you can simply enter the *build/gmake* directory and run `make`:
|
|
|
|
cd build/gmake && make && cd ../..
|
|
|
|
Now you can execute your program:
|
|
|
|
./Project
|
|
### The Windows Build
|
|
On Windows you also have multiple possible IDE project files, but here we assume
|
|
Visual Studio 2013:
|
|
|
|
premake5 vs2013
|
|
|
|
Now you can open your project file generated in *build/vs2013/* and build/run it.
|
|
|
|
### From The Command-line with cygwin/babun: `vsbuild`
|
|
[](use-premake-and-start-winning/premake_vsbuild.gif)
|
|
However, if you're like me, you might prefer being able to use the terminal to
|
|
build and run your project as well.
|
|
|
|
Using this method **requires** you to select the "Programming Languages -> Visual C++ -> Common Tools for Visual C++ 2015" option during the install of Visual Studio -- this is what provides the *vcvarsall.bat* file.
|
|
|
|
[](use-premake-and-start-winning/vs2015_install.png)
|
|
|
|
My solution was to create two scripts to be executed: a shell script that
|
|
executes a batch file and the batch file itself.
|
|
|
|
The wrapper shell script is simple enough:
|
|
|
|
#!/bin/bash
|
|
cmd /c C:/Users/kts/.local/bin/vsbuild.bat "$@"
|
|
|
|
The batch is also fairly simple, but you will have to adjust it to use the appropriate Visual Studio directory:
|
|
|
|
call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x86
|
|
msbuild %*
|
|
|
|
Now instead of opening the project file with VS, you can simply navigate to the
|
|
*build/vs2013* directory and run `vsbuild`:
|
|
cd build/vs2013 && vsbuild && cd ../..
|
|
|
|
You can then execute your program:
|
|
./Project.exe
|
|
|
|
Note: There are some issues with how stdout is handled from within mintty/cygwin
|
|
-- output was only flushed when the program finished.
|
|
|
|
* Compile: `vsbuild`
|
|
* Clean: `vsbuild /t:clean`
|
|
|
|
I have tested this with *Visual Studio 2013* and *Visual Studio 2015 CE*
|
|
|
|
### The Mac Build
|
|
Mac OS X also has multiple options, but here we are using XCode4 due to an older
|
|
laptop:
|
|
|
|
premake5 xcode4
|
|
|
|
You can then open your project file with XCode and do the normal build/run.
|
|
|
|
Or use the command-line:
|
|
cd build/xcode4 && xcodebuild && cd ../..
|
|
|
|
You can then run your program:
|
|
|
|
./Project
|
|
|
|
Note: There are some obvious problems with not creating an application bundle, so
|
|
you likely want to clear the *targetdir* project directive.
|
|
|
|
* Compile: `xcodebuild`
|
|
* Clean: `xcodebuild clean`
|