CMake stuff works now on linux and windows... and should be possible to make to work on OS X.

This commit is contained in:
Perttu Ahola 2011-01-08 17:34:25 +02:00
parent 426c206d7e
commit 9fbb0889a7
9 changed files with 367 additions and 102 deletions

@ -4,12 +4,72 @@ if(${CMAKE_VERSION} STREQUAL "2.8.2")
message( WARNING "CMake/CPack version 2.8.2 will not create working .deb packages!")
endif(${CMAKE_VERSION} STREQUAL "2.8.2")
set(CMAKE_BUILD_TYPE Debug)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")
# This can be read from ${PROJECT_NAME} after project() is called
project(minetest)
# This is done here so that IRRDIR is relative to the typical cmake call directory
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")
include(${CMAKE_SOURCE_DIR}/cmake/Modules/misc.cmake)
# Default to Release
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type: Debug or Release" FORCE)
endif()
# Configuration
set(RUN_IN_PLACE 0 CACHE BOOL "Run directly in source directory structure")
set(BUILD_CLIENT 1 CACHE BOOL "Build client")
set(BUILD_SERVER 1 CACHE BOOL "Build server")
# Get date and time
GETDATETIME(BUILD_DATE)
MESSAGE(STATUS "BUILD_DATE = ${BUILD_DATE}")
# This is done here so that relative search paths are more reasnable
find_package(Irrlicht)
# This way the CMakeLists.txt file in src/ is processed
add_subdirectory(src)
install(FILES "doc/README.txt" DESTINATION "share/minetest/doc")
# CPack
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "An InfiniMiner/Minecraft inspired game")
set(CPACK_PACKAGE_VERSION_MAJOR 0)
set(CPACK_PACKAGE_VERSION_MINOR 0)
set(CPACK_PACKAGE_VERSION_PATCH 0)
set(CPACK_PACKAGE_VENDOR "celeron55")
set(CPACK_PACKAGE_FILE_NAME "minetest-${BUILD_DATE}")
if(WIN32)
# For some reason these aren't copied otherwise
if(BUILD_CLIENT)
install(FILES bin/minetest.exe DESTINATION bin)
endif()
if(BUILD_SERVER)
install(FILES bin/minetestserver.exe DESTINATION bin)
endif()
set(CPACK_GENERATOR ZIP)
# This might be needed for some installer
#set(CPACK_PACKAGE_EXECUTABLES bin/minetest.exe "Minetest" bin/minetestserver.exe "Minetest Server")
elseif(APPLE)
# TODO
# see http://cmake.org/Wiki/CMake:CPackPackageGenerators#Bundle_.28OSX_only.29
set(CPACK_PACKAGE_FILE_NAME ${PROJECT_NAME})
set(CPACK_PACKAGE_ICON "")
set(CPACK_BUNDLE_NAME ${PROJECT_NAME})
set(CPACK_BUNDLE_ICON "")
set(CPACK_BUNDLE_PLIST "")
set(CPACK_BUNDLE_STARTUP_COMMAND "Contents/MacOS/minetest")
set(CPACK_GENERATOR BUNDLE)
else()
set(CPACK_GENERATOR TGZ)
set(CPACK_SOURCE_GENERATOR TGZ)
endif()
include(CPack)

@ -1,28 +1,54 @@
MESSAGE(STATUS "IRRDIR = $ENV{IRRDIR}")
#FindIrrlicht.cmake
set(IRRLICHT_SOURCE_DIR "" CACHE PATH "Path to irrlicht source directory (optional)")
if( UNIX )
# Unix
else( UNIX )
# Windows
endif( UNIX )
# Find include directory
FIND_PATH(IRRLICHT_INCLUDE_DIR NAMES irrlicht.h
PATHS
$ENV{IRRDIR}/include
/usr/local/include/irrlicht
/usr/include/irrlicht
"${IRRLICHT_SOURCE_DIR}/include"
)
MESSAGE(STATUS "IRRLICHT_INCLUDE_DIR = ${IRRLICHT_INCLUDE_DIR}")
# Find library directory
FIND_LIBRARY(IRRLICHT_LIBRARY NAMES libIrrlicht.a Irrlicht
PATHS
$ENV{IRRDIR}/lib
$ENV{IRRDIR}/lib/Linux
$ENV{IRRDIR}/lib/MacOSX
$ENV{IRRDIR}/lib/Win32-gcc
$ENV{IRRDIR}/lib/Win32-visualstudio
$ENV{IRRDIR}/lib/Win64-visualstudio
/usr/local/lib
/usr/lib
#${IRRLICHT_PLATFORM_DIR}
"${IRRLICHT_SOURCE_DIR}/lib/Win32-visualstudio"
"${IRRLICHT_SOURCE_DIR}/lib/Win32-gcc"
)
MESSAGE(STATUS "IRRLICHT_INCLUDE_DIR = ${IRRLICHT_INCLUDE_DIR}")
MESSAGE(STATUS "IRRLICHT_LIBRARY = ${IRRLICHT_LIBRARY}")
# On windows, find the dll for installation
if(WIN32)
if(MSVC)
FIND_FILE(IRRLICHT_DLL NAMES Irrlicht.dll
PATHS
"${IRRLICHT_SOURCE_DIR}/bin/Win32-VisualStudio"
DOC "Path of the Irrlicht dll (for installation)"
)
else()
FIND_FILE(IRRLICHT_DLL NAMES Irrlicht.dll
PATHS
"${IRRLICHT_SOURCE_DIR}/bin/Win32-gcc"
DOC "Path of the Irrlicht dll (for installation)"
)
endif()
MESSAGE(STATUS "IRRLICHT_DLL = ${IRRLICHT_DLL}")
endif(WIN32)
# handle the QUIETLY and REQUIRED arguments and set IRRLICHT_FOUND to TRUE if
# all listed variables are TRUE
INCLUDE(FindPackageHandleStandardArgs)
@ -34,5 +60,5 @@ ELSE(IRRLICHT_FOUND)
SET(IRRLICHT_LIBRARIES)
ENDIF(IRRLICHT_FOUND)
MARK_AS_ADVANCED(IRRLICHT_LIBRARY IRRLICHT_INCLUDE_DIR)
MARK_AS_ADVANCED(IRRLICHT_LIBRARY IRRLICHT_INCLUDE_DIR IRRLICHT_DLL)

16
cmake/Modules/misc.cmake Normal file

@ -0,0 +1,16 @@
MACRO (GETDATETIME RESULT)
IF (WIN32)
EXECUTE_PROCESS(COMMAND "cmd" /C echo %date% %time% OUTPUT_VARIABLE ${RESULT})
string(REGEX REPLACE "\n" "" ${RESULT} "${${RESULT}}")
ELSEIF(UNIX)
EXECUTE_PROCESS(COMMAND "date" "+%Y-%m-%d_%H:%M:%S" OUTPUT_VARIABLE ${RESULT})
string(REGEX REPLACE "\n" "" ${RESULT} "${${RESULT}}")
ELSE (WIN32)
MESSAGE(SEND_ERROR "date not implemented")
SET(${RESULT} "Unknown")
ENDIF (WIN32)
string(REGEX REPLACE " " "_" ${RESULT} "${${RESULT}}")
ENDMACRO (GETDATETIME)

@ -5,67 +5,81 @@ Copyright (c) 2010 Perttu Ahola <celeron55@gmail.com>
An InfiniMiner/Minecraft inspired game.
NOTE: This file is somewhat outdated most of the time.
This is a development version:
- Don't expect it to work as well as a finished game will.
- Please report any bugs to me. That way I can fix them to the next release.
- debug.txt is very useful when the game crashes.
- debug.txt is useful when the game crashes.
Public servers:
kray.dy.fi :30000 (friend's server - recommended)
celeron.55.lt :30000 (my own server, kind of unused)
- If you want to run a server, I can list you on my website and in here.
kray.dy.fi :30000 (friend's server)
celeron.55.lt :30000 (my own server)
Controls:
- WASD+mouse: Move
- Mouse L: Dig
- Mouse R: Place block
- Mouse Wheel: Change item
- F: Change item
- R: Toggle full view range
- See the in-game pause menu
Configuration file:
- An optional configuration file can be used. See minetest.conf.example.
- Path to file can be passed as a parameter to the executable:
--config <path-to-file>
- If not given as a parameter, these are checked, in order:
- Defaults:
- If built with -DRUN_IN_PLACE:
../minetest.conf
../../minetest.conf
- Otherwise something like this:
Windows: C:\Documents and Settings\user\Application Data\minetest\minetest.conf
Linux: ~/.minetest/minetest.conf
OS X: ~/Library/Application Support/minetest.conf
Command-line options:
- Use --help
Running on Windows:
- The working directory should be ./bin
Running on GNU/Linux:
- fasttest is a linux binary compiled on a recent Arch Linux installation.
It should run on most recent GNU/Linux distributions.
- Browse to the game ./bin directory and type:
LD_LIBRARY_PATH=. ./fasttest
- If it doesn't work, use wine. I aim at 100% compatibility with wine.
Compiling on GNU/Linux:
- You need:
* Irrlicht:
http://downloads.sourceforge.net/irrlicht/irrlicht-1.7.2.zip
* JThread:
http://research.edm.uhasselt.be/~jori/page/index.php?n=CS.Jthread
* zlib:
- Get the -dev package from your package manager.
- Irrlicht and JThread are very likely not to be found from your distro's
repository.
- Compiling each of them should be fairly unproblematic, though.
* CMake
* Irrlicht
* Zlib
- You can probably find these in your distro's package manager
- Check possible options:
$ cd whatever/minetest
$ cmake . -LH
- A system-wide install:
$ cd whatever/minetest
$ cmake . -DCMAKE_INSTALL_PREFIX=/usr/local
$ make -j2
$ sudo make install
$ minetest
- For running in the source directory:
$ cd whatever/minetest
$ cmake . -DRUN_IN_PLACE
$ make -j2
$ ./bin/minetest
Compiling on Windows:
- You need Irrlicht, JThread and zlib, see above
- Be sure to
#define JMUTEX_CRITICALSECTION
in jmutex.h before compiling it. Otherwise mutexes will be very slow.
- You need CMake, Irrlicht, zlib and Visual Studio or MinGW
- NOTE: Probably it will not work easily and you will need to fix some stuff.
- Steps:
- Start up the CMake GUI
- Select your compiler
- Hit "Configure"
- Set up some options and paths
- Hit "Configure"
- Hit "Generate"
- VC: Open the generated .sln and build it
- MinGW: Browse to the build directory and run 'make'
License of Minetest-c55
-----------------------
Minetest-c55
Copyright (C) 2010 celeron55, Perttu Ahola <celeron55@gmail.com>
Copyright (C) 2010-2011 celeron55, Perttu Ahola <celeron55@gmail.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by

@ -27,6 +27,8 @@
# Server side stuff
#map-dir = /home/palle/custom_map
# - The possible generators are:
# (Indeed you can do all of them with only "power" 8))
# H=value:

@ -1,19 +1,37 @@
project(minetest)
cmake_minimum_required( VERSION 2.6 )
set ( CMAKE_BUILD_TYPE Debug )
add_definitions ( -Wall -DRUN_IN_PLACE -O2)
find_package(ZLIB REQUIRED)
if(RUN_IN_PLACE)
add_definitions ( -DRUN_IN_PLACE )
endif(RUN_IN_PLACE)
if(UNIX)
# Unix
if(BUILD_CLIENT)
find_package(X11 REQUIRED)
find_package(OpenGL REQUIRED)
find_package(JPEG REQUIRED)
find_package(BZip2 REQUIRED)
endif(BUILD_CLIENT)
find_package(ZLIB REQUIRED)
set(SERVER_PLATFORM_LIBS -lpthread)
elseif(WIN32)
# Windows
# Surpress some warnings
add_definitions ( /D "_CRT_SECURE_NO_DEPRECATE" /W1 )
# Zlib stuff
set(ZLIB_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/../../zlib/zlib-1.2.5"
CACHE PATH "Zlib include directory")
set(ZLIB_LIBRARIES "${PROJECT_SOURCE_DIR}/../../zlib125dll/dll32/zlibwapi.lib"
CACHE PATH "Path to zlibwapi.lib")
set(ZLIB_DLL "${PROJECT_SOURCE_DIR}/../../zlib125dll/dll32/zlibwapi.dll"
CACHE PATH "Path to zlibwapi.dll (for installation)")
endif()
if( UNIX )
#set( platform_SRCS some_necessary_linux_file.cpp )
else( UNIX )
#windows
#set( platform_SRCS dllmain.cpp stdafx.cpp )
endif( UNIX )
configure_file(
"${PROJECT_SOURCE_DIR}/config.h.in"
"${PROJECT_BINARY_DIR}/config.h"
)
set(minetest_SRCS
porting.cpp
@ -48,16 +66,44 @@ set(minetest_SRCS
test.cpp
)
set(minetestserver_SRCS
porting.cpp
materials.cpp
defaultsettings.cpp
mapnode.cpp
voxel.cpp
mapblockobject.cpp
inventory.cpp
debug.cpp
serialization.cpp
light.cpp
filesys.cpp
connection.cpp
environment.cpp
server.cpp
socket.cpp
mapblock.cpp
mapsector.cpp
heightmap.cpp
map.cpp
player.cpp
utility.cpp
servermain.cpp
test.cpp
)
include_directories(
${ZLIB_INCLUDE_DIR}
${PROJECT_BINARY_DIR}
${IRRLICHT_INCLUDE_DIR}
${ZLIB_INCLUDE_DIR}
${CMAKE_BUILD_TYPE}
"${PROJECT_SOURCE_DIR}/jthread"
)
set(EXECUTABLE_OUTPUT_PATH ../bin)
if(BUILD_CLIENT)
add_executable(minetest ${minetest_SRCS})
target_link_libraries(
minetest
${ZLIB_LIBRARIES}
@ -67,7 +113,88 @@ target_link_libraries(
${BZIP2_LIBRARIES}
jthread
)
endif(BUILD_CLIENT)
if(BUILD_SERVER)
add_executable(minetestserver ${minetestserver_SRCS})
target_link_libraries(
minetestserver
${ZLIB_LIBRARIES}
jthread
${SERVER_PLATFORM_LIBS}
)
endif(BUILD_SERVER)
# Set some optimizations and tweaks
if( UNIX )
# Unix
set(UNIX_FLAGS "-Wall")
if(BUILD_CLIENT)
set_target_properties(minetest PROPERTIES COMPILE_FLAGS
"${UNIX_FLAGS}")
endif(BUILD_CLIENT)
if(BUILD_SERVER)
set_target_properties(minetestserver PROPERTIES COMPILE_FLAGS
"${UNIX_FLAGS} -DSERVER")
endif(BUILD_SERVER)
else( UNIX )
# Windows
if(BUILD_CLIENT)
# EHa enables SEH exceptions (used for catching segfaults)
set_target_properties(minetest PROPERTIES COMPILE_FLAGS
"/O2 /Ob2 /Oi /Ot /Oy /GL /EHa")
endif(BUILD_CLIENT)
if(BUILD_SERVER)
# EHa enables SEH exceptions (used for catching segfaults)
set_target_properties(minetestserver PROPERTIES COMPILE_FLAGS
"/O2 /Ob2 /Oi /Ot /Oy /GL /EHa /D SERVER")
endif(BUILD_SERVER)
endif( UNIX )
#
# Installation
#
if(WIN32)
set(DATADIR "data")
set(BINDIR "bin")
elseif(APPLE)
set(DATADIR "share/minetest")
set(BINDIR "bin")
elseif(UNIX)
set(DATADIR "share/minetest")
set(BINDIR "bin")
endif()
if(BUILD_CLIENT)
install(TARGETS minetest DESTINATION ${BINDIR})
file(GLOB images "${CMAKE_CURRENT_SOURCE_DIR}/../data/*.png")
install(FILES ${images} DESTINATION ${DATADIR})
if(WIN32)
if(DEFINED IRRLICHT_DLL)
install(FILES ${IRRLICHT_DLL} DESTINATION ${BINDIR})
endif()
if(DEFINED ZLIB_DLL)
install(FILES ${ZLIB_DLL} DESTINATION ${BINDIR})
endif()
endif()
endif(BUILD_CLIENT)
if(BUILD_SERVER)
install(TARGETS minetestserver DESTINATION ${BINDIR})
endif(BUILD_SERVER)
# Subdirectories
add_subdirectory(jthread)
#END
#end

@ -212,7 +212,7 @@ Doing now:
*/
#define FIELD_OF_VIEW_TEST 0
#ifdef UNITTEST_DISABLE
#ifdef NDEBUG
#ifdef _WIN32
#pragma message ("Disabling unit tests")
#else
@ -259,6 +259,7 @@ Doing now:
#include "materials.h"
#include "guiMessageMenu.h"
#include "filesys.h"
#include "config.h"
IrrlichtWrapper *g_irrlicht;
@ -1110,6 +1111,12 @@ int main(int argc, char *argv[])
BEGIN_DEBUG_EXCEPTION_HANDLER
// Print startup message
dstream<<DTIME<<"minetest-c55"
" with SER_FMT_VER_HIGHEST="<<(int)SER_FMT_VER_HIGHEST
<<", "<<BUILD_INFO
<<std::endl;
try
{
@ -1170,12 +1177,6 @@ int main(int argc, char *argv[])
// Initialize default settings
set_default_settings();
// Print startup message
dstream<<DTIME<<"minetest-c55"
" with SER_FMT_VER_HIGHEST="<<(int)SER_FMT_VER_HIGHEST
<<", ENABLE_TESTS="<<ENABLE_TESTS
<<std::endl;
// Set locale. This is for forcing '.' as the decimal point.
std::locale::global(std::locale("C"));
// This enables printing all characters in bitmap font
@ -1211,6 +1212,9 @@ int main(int argc, char *argv[])
{
core::array<std::string> filenames;
filenames.push_back(porting::path_userdata + "/minetest.conf");
#ifdef RUN_IN_PLACE
filenames.push_back(porting::path_userdata + "/../minetest.conf");
#endif
for(u32 i=0; i<filenames.size(); i++)
{
@ -1282,6 +1286,8 @@ int main(int argc, char *argv[])
std::string map_dir = porting::path_userdata+"/map";
if(cmd_args.exists("map-dir"))
map_dir = cmd_args.get("map-dir");
else if(g_settings.exists("map-dir"))
map_dir = g_settings.get("map-dir");
if(cmd_args.getFlag("server"))
{

@ -24,6 +24,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
*/
#include "porting.h"
#include "config.h"
namespace porting
{
@ -103,7 +104,9 @@ void initializePaths()
path_userdata = std::string("../");
#endif
#else
#else // RUN_IN_PLACE
/*
Use platform-specific paths otherwise
*/
@ -127,6 +130,7 @@ void initializePaths()
// Use "./bin/../data"
path_data = std::string(buf) + "/../data";
//path_data = std::string(buf) + "/../share/" + APPNAME;
// Use "C:\Documents and Settings\user\Application Data\<APPNAME>"
len = GetEnvironmentVariable("APPDATA", buf, buflen);
@ -137,20 +141,23 @@ void initializePaths()
Linux
*/
#elif defined(linux)
#include <unistd.h>
path_userdata = std::string("~/.") + APPNAME;
path_data = std::string("/usr/share/") + APPNAME;
path_userdata = std::string(getenv("HOME")) + "/." + APPNAME;
path_data = std::string(INSTALL_PREFIX) + "/share/" + APPNAME;
/*
OS X
*/
#elif defined(__APPLE__)
#include <unistd.h>
path_userdata = std::string("~/Library/Application Support/") + APPNAME;
path_userdata = std::string(getenv("HOME")) + "/Library/Application Support/" + APPNAME;
path_data = std::string("minetest-mac.app/Contents/Resources/data/");
#endif
#endif
#endif // RUN_IN_PLACE
dstream<<"path_data = "<<path_data<<std::endl;
dstream<<"path_userdata = "<<path_userdata<<std::endl;

@ -25,12 +25,13 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#ifndef SERVER
#ifdef _WIN32
#pragma error ("For a server build, SERVER must be defined globally")
#else
#error "For a server build, SERVER must be defined globally"
#endif
#endif
#ifdef UNITTEST_DISABLE
#ifdef NDEBUG
#ifdef _WIN32
#pragma message ("Disabling unit tests")
#else
@ -66,6 +67,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "strfnd.h"
#include "porting.h"
#include "materials.h"
#include "config.h"
/*
Settings.
@ -129,6 +131,12 @@ int main(int argc, char *argv[])
BEGIN_DEBUG_EXCEPTION_HANDLER
// Print startup message
dstream<<DTIME<<"minetest-c55"
" with SER_FMT_VER_HIGHEST="<<(int)SER_FMT_VER_HIGHEST
<<", "<<BUILD_INFO
<<std::endl;
try
{
@ -185,12 +193,6 @@ int main(int argc, char *argv[])
// Initialize default settings
set_default_settings();
// Print startup message
dstream<<DTIME<<"minetest-c55 server"
" with SER_FMT_VER_HIGHEST="<<(int)SER_FMT_VER_HIGHEST
<<", ENABLE_TESTS="<<ENABLE_TESTS
<<std::endl;
// Set locale. This is for forcing '.' as the decimal point.
std::locale::global(std::locale("C"));
// This enables printing all characters in bitmap font
@ -226,6 +228,9 @@ int main(int argc, char *argv[])
{
core::array<std::string> filenames;
filenames.push_back(porting::path_userdata + "/minetest.conf");
#ifdef RUN_IN_PLACE
filenames.push_back(porting::path_userdata + "/../minetest.conf");
#endif
for(u32 i=0; i<filenames.size(); i++)
{
@ -308,6 +313,8 @@ int main(int argc, char *argv[])
std::string map_dir = porting::path_userdata+"/map";
if(cmd_args.exists("map-dir"))
map_dir = cmd_args.get("map-dir");
else if(g_settings.exists("map-dir"))
map_dir = g_settings.get("map-dir");
Server server(map_dir.c_str(), hm_params, map_params);
server.start(port);