-cmake_minimum_required(VERSION 2.8.12 FATAL_ERROR)
-list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
+cmake_minimum_required(VERSION 3.1 FATAL_ERROR)
+
project(NetRadiant C CXX)
+#-----------------------------------------------------------------------
+# Builtins: configuration
+#-----------------------------------------------------------------------
+
+set(BUILTINS_INSTALL_DIR "${CMAKE_BINARY_DIR}/builtins")
+set(BUILTINS_INCLUDE_DIR "${BUILTINS_INSTALL_DIR}/include")
+set(BUILTINS_LIB_DIR "${BUILTINS_INSTALL_DIR}/lib")
+set(BUILTINS_PKGCONFIG_DIR "${BUILTINS_INSTALL_DIR}/lib/pkgconfig")
+
+option(BUILTIN_GTKGLEXT "Builtin GtkGLExt" OFF)
+
+set(BUILTIN_GTKGLEXT_BUILT OFF CACHE INTERNAL "...")
+if (EXISTS "${BUILTINS_INSTALL_DIR}/lib/pkgconfig/gtkglext-1.0.pc")
+ set(BUILTIN_GTKGLEXT_BUILT ON)
+endif ()
+
+if (EXISTS "${BUILTINS_INCLUDE_DIR}")
+ include_directories("${BUILTINS_INCLUDE_DIR}")
+endif ()
+
+if (EXISTS "${BUILTINS_LIB_DIR}")
+ set(ENV{LD_LIBRARY_PATH} "$ENV{LD_LIBRARY_PATH}:${BUILTINS_LIB_DIR}")
+ link_directories("${BUILTINS_LIB_DIR}")
+endif ()
+
+if (EXISTS "${BUILTINS_PKGCONFIG_DIR}")
+ set(ENV{PKG_CONFIG_PATH} "$ENV{PKG_CONFIG_PATH}:${BUILTINS_PKGCONFIG_DIR}")
+endif ()
+
+#-----------------------------------------------------------------------
+# CMake modules
+#-----------------------------------------------------------------------
+
+list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
+
+#-----------------------------------------------------------------------
+# Submodules
+#-----------------------------------------------------------------------
+
if (EXISTS "${PROJECT_SOURCE_DIR}/libs/crunch/inc/crn_decomp.h")
set(DEFAULT_BUILD_CRUNCH ON CACHE INTERNAL "...")
else ()
set(DEFAULT_BUILD_DAEMONMAP OFF CACHE INTERNAL "...")
endif ()
+#-----------------------------------------------------------------------
+# Build options
+#-----------------------------------------------------------------------
+
option(BUILD_RADIANT "Build the GUI" ON)
option(BUILD_TOOLS "Build the tools" ON)
option(BUILD_CRUNCH "Build Crunch image support" ${DEFAULT_BUILD_CRUNCH})
set(BUILD_BINARIES ON)
endif ()
+if (BUILD_BINARIES)
+ if (WIN32 OR APPLE OR "${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
+ set(BUNDLING_SUPPORTED ON)
+ endif()
+
+ if (BUNDLING_SUPPORTED)
+ if(WIN32 AND NOT CMAKE_CROSSCOMPILING)
+ set(BUNDLE_LIBRARIES_DEFAULT ON)
+ else ()
+ set(BUNDLE_LIBRARIES_DEFAULT OFF)
+ endif ()
+
+ option(BUNDLE_LIBRARIES "Bundle libraries" ${BUNDLE_LIBRARIES_DEFAULT})
+ endif ()
+
+ if (BUNDLE_LIBRARIES AND BUNDLING_SUPPORTED)
+ set(FHS_INSTALL OFF CACHE PATH "Disabled because of BUNDLE_LIBRARIES" FORCE)
+ endif ()
+endif ()
+
#-----------------------------------------------------------------------
# Paths
#-----------------------------------------------------------------------
set(CMAKE_INSTALL_PREFIX "${PROJECT_SOURCE_DIR}/install" CACHE PATH "..." FORCE)
endif ()
+if (APPLE)
+ set(APPLE_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX}/NetRadiant.app)
+ set(FINAL_INSTALL_PREFIX ${APPLE_INSTALL_PREFIX}/Contents/Prefix)
+else ()
+ set(FINAL_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX})
+endif ()
+
set(RADIANT_NAME "NetRadiant" CACHE INTERNAL "...")
add_definitions(-DRADIANT_NAME="${RADIANT_NAME}")
set(RADIANT_BASENAME "netradiant" CACHE INTERNAL "...")
add_definitions(-DRADIANT_BASENAME="${RADIANT_BASENAME}")
-set(RADIANT_LIB_DIR ${CMAKE_INSTALL_PREFIX} CACHE INTERNAL "...")
-set(RADIANT_BIN_DIR ${CMAKE_INSTALL_PREFIX} CACHE INTERNAL "...")
-set(RADIANT_DATA_DIR ${CMAKE_INSTALL_PREFIX} CACHE INTERNAL "...")
+set(RADIANT_BIN_DIR ${FINAL_INSTALL_PREFIX} CACHE INTERNAL "...")
+set(RADIANT_LIB_DIR ${FINAL_INSTALL_PREFIX}/lib CACHE INTERNAL "...")
+set(RADIANT_ADDONS_DIR ${FINAL_INSTALL_PREFIX} CACHE INTERNAL "...")
+set(RADIANT_ETC_DIR ${FINAL_INSTALL_PREFIX}/etc CACHE INTERNAL "...")
+set(RADIANT_SHARE_DIR ${FINAL_INSTALL_PREFIX}/share CACHE INTERNAL "...")
+set(RADIANT_DATA_DIR ${FINAL_INSTALL_PREFIX} CACHE INTERNAL "...")
if (FHS_INSTALL AND NOT BUNDLE_LIBRARIES)
- set(RADIANT_LIB_DIR ${CMAKE_INSTALL_PREFIX}/lib/${RADIANT_BASENAME})
- set(RADIANT_BIN_DIR ${CMAKE_INSTALL_PREFIX}/bin)
- set(RADIANT_DATA_DIR ${CMAKE_INSTALL_PREFIX}/share/${RADIANT_BASENAME})
+ set(RADIANT_BIN_DIR ${FINAL_INSTALL_PREFIX}/bin)
+ set(RADIANT_LIB_DIR ${FINAL_INSTALL_PREFIX}/lib)
+ set(RADIANT_ADDONS_DIR ${RADIANT_LIB_DIR}/${RADIANT_BASENAME})
+ set(RADIANT_ETC_DIR ${FINAL_INSTALL_PREFIX}/etc)
+ set(RADIANT_SHARE_DIR ${FINAL_INSTALL_PREFIX}/share)
+ set(RADIANT_DATA_DIR ${RADIANT_SHARE_DIR}/${RADIANT_BASENAME})
endif ()
set(GAMEPACKS_DOWNLOAD_DIR ${PROJECT_BINARY_DIR}/download CACHE PATH "Where to store downloaded game packs")
add_definitions(-DWORKAROUND_WINDOWS_GTK2_GLWIDGET=1)
endif ()
endif ()
+
+ if (APPLE)
+ if (GTK_TARGET EQUAL 2)
+ add_definitions(-DWORKAROUND_MACOS_GTK2_DESTROY=1)
+ endif ()
+ endif ()
endif ()
#-----------------------------------------------------------------------
include_directories("${PROJECT_SOURCE_DIR}/include")
include_directories("${PROJECT_SOURCE_DIR}/libs")
- if (WIN32 OR "${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
- set(BUNDLING_SUPPORTED ON)
- endif()
-
- if (BUNDLING_SUPPORTED)
- if(WIN32 AND NOT CMAKE_CROSSCOMPILING)
- set(BUNDLE_LIBRARIES_DEFAULT ON)
- else ()
- set(BUNDLE_LIBRARIES_DEFAULT OFF)
- endif ()
-
- option(BUNDLE_LIBRARIES "Bundle libraries" ${BUNDLE_LIBRARIES_DEFAULT})
- endif ()
-
- if (BUNDLE_LIBRARIES AND BUNDLING_SUPPORTED)
- add_subdirectory(bundle)
-
- set(FHS_INSTALL OFF CACHE PATH "Disabled because of BUNDLE_LIBRARIES" FORCE)
- endif ()
-
macro (copy_dlls target)
if (BUNDLE_LIBRARIES AND BUNDLING_SUPPORTED)
add_custom_command(TARGET ${target} POST_BUILD
endmacro ()
endif ()
+#-----------------------------------------------------------------------
+# Bundle
+#-----------------------------------------------------------------------
+
+if (BUILD_BINARIES)
+ if (BUNDLE_LIBRARIES AND BUNDLING_SUPPORTED)
+ add_subdirectory(bundle)
+ endif ()
+endif ()
+
+#-----------------------------------------------------------------------
+# Builtins: targets
+#-----------------------------------------------------------------------
+
+add_custom_target(builtins)
+
+if (BUILTIN_GTKGLEXT)
+ include(${CMAKE_ROOT}/Modules/ExternalProject.cmake)
+
+ execute_process(COMMAND pkg-config --libs gdk-2.0 gtk+-2.0 glib-2.0 gl
+ OUTPUT_VARIABLE GTKGLEXT_LDFLAGS
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ )
+ set(GTKGLEXT_LDFLAGS "$ENV{LDFLAGS} -lm ${GTKGLEXT_LDFLAGS}")
+
+ if (NOT CMAKE_BUILD_TYPE MATCHES Release)
+ set(GTKGLEXT_CFLAGS "$ENV{CFLAGS} -g")
+ else ()
+ set(GTKGLEXT_CFLAGS "$ENV{CFLAGS}")
+ endif()
+
+ set(CONFIGURE_OPTIONS --disable-gtk-doc --disable-gtk-doc-html --disable-gtk-doc-pdf)
+
+ if (APPLE)
+ set(GTKGLEXT_GIT_TAG macos)
+ else ()
+ set(GTKGLEXT_GIT_TAG fixes)
+ endif ()
+
+ ExternalProject_Add(gtkglext
+ GIT_REPOSITORY https://gitlab.gnome.org/illwieckz/gtkglext.git
+ GIT_TAG ${GTKGLEXT_GIT_TAG}
+ BUILD_IN_SOURCE ON
+ CONFIGURE_COMMAND export LDFLAGS=${GTKGLEXT_LDFLAGS}
+ CONFIGURE_COMMAND && NOCONFIGURE=1 ./autogen.sh
+ CONFIGURE_COMMAND && ./configure --prefix "${BUILTINS_INSTALL_DIR}" ${CONFIGURE_OPTIONS}
+ BUILD_COMMAND $(MAKE) CFLAGS=${GTKGLEXT_CFLAGS} LDFLAGS=${GTKGLEXT_LDFLAGS}
+ INSTALL_COMMAND $(MAKE) install
+ )
+
+ include_directories("${BUILTINS_INSTALL_DIR}/lib/gtkglext-1.0/include")
+ include_directories("${BUILTINS_INSTALL_DIR}/include/gtkglext-1.0")
+
+ add_dependencies(builtins gtkglext)
+ set_target_properties(gtkglext PROPERTIES EXCLUDE_FROM_ALL ON)
+endif ()
+
+if (BUNDLE_LIBRARIES AND EXISTS ${BUILTINS_LIB_DIR})
+ set(CMAKE_SKIP_BUILD_RPATH ON)
+endif()
+
#-----------------------------------------------------------------------
# Libraries
#-----------------------------------------------------------------------
endif ()
if (DOWNLOAD_GAMEPACKS)
- if (FHS_INSTALL)
- set(GAME_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}/share/netradiant")
- else ()
- set(GAME_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
- endif ()
-
install(DIRECTORY
${PROJECT_BINARY_DIR}/gamepacks
DESTINATION ${RADIANT_DATA_DIR}
)
endif ()
-if(BUILD_BINARIES AND FHS_INSTALL AND NOT WIN32 AND NOT APPLE)
+if (BUILD_BINARIES AND FHS_INSTALL AND NOT WIN32 AND NOT APPLE)
install(FILES
- ${PROJECT_SOURCE_DIR}/icons/netradiant.png
- DESTINATION ${CMAKE_INSTALL_PREFIX}/share/pixmaps
+ icons/netradiant.png
+ DESTINATION ${RADIANT_SHARE_DIR}/pixmaps
)
install(FILES
- ${PROJECT_SOURCE_DIR}/icons/netradiant.desktop
- DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications
+ icons/netradiant.desktop
+ DESTINATION ${RADIANT_SHARE_DIR}/applications
)
install(FILES
- ${PROJECT_SOURCE_DIR}/icons/mime/map.xml
- DESTINATION ${CMAKE_INSTALL_PREFIX}/share/mime/model
+ icons/mime/map.xml
+ DESTINATION ${RADIANT_SHARE_DIR}/mime/model
+ )
+endif ()
+
+if (APPLE)
+ install(DIRECTORY
+ setup/apple/Contents
+ DESTINATION ${APPLE_INSTALL_PREFIX}
+ )
+ install(PROGRAMS
+ setup/apple/netradiant
+ DESTINATION ${APPLE_INSTALL_PREFIX}/Contents/MacOS
)
endif ()
if (WIN32)
set(BUNDLE_OS_NAME "windows")
- set(BUNDLE_SHARE ON)
+ set(BUNDLE_SHARE ON)
+elseif (APPLE)
+ set(BUNDLE_OS_NAME "macos")
+ set(BUNDLE_SHARE ON)
+ set(BUNDLE_ETC ON)
elseif ("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
set(BUNDLE_OS_NAME "linux")
else ()
endif ()
add_custom_target(bundle ALL
- COMMAND "${PROJECT_SOURCE_DIR}/library-bundler"
+ COMMAND
+ export LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH} &&
+ "${PROJECT_SOURCE_DIR}/library-bundler"
"${BUNDLE_OS_NAME}" "${PROJECT_BINARY_DIR}"
VERBATIM
COMMENT "Bundling libraries"
install(DIRECTORY
${PROJECT_BINARY_DIR}/lib
- DESTINATION ${CMAKE_INSTALL_PREFIX}
+ DESTINATION ${FINAL_INSTALL_PREFIX}
)
if (BUNDLE_SHARE)
install(DIRECTORY
${PROJECT_BINARY_DIR}/share
- DESTINATION ${CMAKE_INSTALL_PREFIX}
+ DESTINATION ${FINAL_INSTALL_PREFIX}
+ )
+endif ()
+
+if (BUNDLE_ETC)
+ install(DIRECTORY
+ ${PROJECT_BINARY_DIR}/etc
+ DESTINATION ${FINAL_INSTALL_PREFIX}
)
endif ()
find_package(PkgConfig)
+if (NOT BUILTIN_GTKGLEXT OR BUILTIN_GTKGLEXT_BUILT)
if (PKG_CONFIG_FOUND)
if (GtkGLExt_FIND_REQUIRED)
set(_pkgconfig_REQUIRED REQUIRED)
endif ()
endif ()
mark_as_advanced(GtkGLExt_INCLUDE_DIRS GtkGLExt_LIBRARIES)
+endif()
copy_dlls(${name})
install(
TARGETS ${name}
- LIBRARY DESTINATION ${RADIANT_LIB_DIR}/plugins
+ LIBRARY DESTINATION ${RADIANT_ADDONS_DIR}/plugins
)
endmacro()
fi
done
+case "$(uname -s)" in
+ 'Darwin')
+ cmake_user_opts[${#cmake_user_opts[@]}]='-DBUILTIN_GTKGLEXT=ON'
+ ;;
+esac
+
set -x
"${fetch_submodules_cmd[@]}"
"${cmake_user_opts[@]}" \
"${project_source_dir}"
+cmake \
+ --build "${build_dir}" \
+ -- \
+ -j"${job_count}" \
+ 'builtins'
+
cmake \
--build "${build_dir}" \
-- \
set -e
+export LANG='C.UTF-8'
+export LANGUAGE="${LANG}"
+
+_sed () {
+ case "${system_name}" in
+ 'macos')
+ gsed "${@}"
+ ;;
+ *)
+ sed "${@}"
+ ;;
+ esac
+}
+
+_cpr () {
+ case "${system_name}" in
+ 'macos')
+ cp -R ${@}
+ ;;
+ *)
+ cp -R --preserve=timestamps ${@}
+ ;;
+ esac
+}
+
Common::noOp () {
true
}
printf '%s\n' "${file_path}"
fi
fi \
- | sed -e 's|/*$||'
+ | _sed -e 's|/*$||'
}
Common::grepLdd () {
- egrep ' => '
+ case "${system_name}" in
+ 'macos')
+ egrep '^\t/'
+ ;;
+ *)
+ egrep ' => '
+ ;;
+ esac
}
Common::stripLdd () {
- sed -e 's/ (0x[0-9a-f]*)$//;s/^.* => //'
+ case "${system_name}" in
+ 'macos')
+ _sed -e 's/^\t\(.*\) (compatibility version .*/\1/'
+ ;;
+ *)
+ _sed -e 's/ (0x[0-9a-f]*)$//;s/^.* => //'
+ ;;
+ esac
}
Multi::excludeLdd () {
case "${system_name}" in
'linux')
+ # - always bundle built-in libraries
# - always rely on up-to-date x11 and gl libraries, bundling them will break on future distros
# - gtk is not easily bundlable on linux because it looks for harcoded system path to optional
# shared libraries like image codecs, theme engines, sound notification system, etc.
# which is likely to pull gtk itself, x11 and gl dependencies
# - old fontconfig does not work correctly if newer fontconfig configuration is installed
# - if gtk and fontconfig is installed, pango and freetype are
- egrep -v '/libc\.|/libstdc\+\+\.|/libdl\.|/libm\.|/libX|/libxcb|/libGL|/libICE\.|/libSM\.|/libpthread\.' \
- | egrep -v '/libatk|/libgdk|/libgtk|/libgio|/libglib|/libgmodule|/libgobject|/libcairo|/libpango|/libfontconfig|/libfreetype'
+ local ldd_line
+ while read ldd_line
+ do
+ if echo "${ldd_line}" | egrep '/builtins/'
+ then
+ echo "${ldd_line}"
+ elif echo "${ldd_line}" \
+ | egrep -q '/libc\.|/libstdc\+\+\.|/libdl\.|/libm\.|/libX|/libxcb|/libGL|/libICE\.|/libSM\.|/libpthread\.'
+ then
+ Common::noOp
+ elif echo "${ldd_line}" \
+ | egrep -q '/libatk|/libgdk|/libgtk|/libgio|/libglib|/libgmodule|/libgobject|/libcairo|/libpango|/libfontconfig|/libfreetype'
+ then
+ Common::noOp
+ else
+ echo "${ldd_line}"
+ fi
+ done
;;
'windows')
- egrep -i '\.dll => [A-Z]:\\msys64\\' \
+ egrep -i '\.dll => [A-Z]:\\msys64\\'
+ ;;
+ 'macos')
+ egrep -v '^\t/System/|^\t/usr/lib/'
;;
esac
}
'windows')
ntldd --recursive "${exe_file}"
;;
+ 'macos')
+ otool -L "${exe_file}"
esac
}
'windows')
echo 'MS-Windows'
;;
+ *)
+ echo 'Raleigh'
+ ;;
esac
}
'windows')
echo 'libgtk-win32-2.0-0.dll'
;;
+ 'macos')
+ echo 'libgtk-quartz-2.0.0.dylib'
+ ;;
esac
}
| xargs -n1 -P1 which \
| cut -f2 -d'/'
;;
+ 'macos')
+ echo 'usr/local'
esac
}
'windows')
echo 'lib'
;;
+ 'macos')
+ echo 'lib'
+ ;;
esac
}
local lib_prefix="${1}"
local gtk_theme_name="${2}"
- cat <<-EOF
- share/themes/${gtk_theme_name}/gtk-2.0
- share/icons/hicolor
- ${lib_prefix}/gdk-pixbuf-2.0
- ${lib_prefix}/gtk-2.0
- EOF
+ case "${system_name}" in
+ 'linux'|'windows')
+ cat <<-EOF
+ share/themes/${gtk_theme_name}/gtk-2.0
+ share/icons/hicolor
+ ${lib_prefix}/gdk-pixbuf-2.0
+ ${lib_prefix}/gtk-2.0
+ EOF
+ ;;
+ 'macos')
+ cat <<-EOF
+ etc/fonts
+ share/themes/${gtk_theme_name}/gtk-2.0
+ share/fontconfig
+ share/icons/hicolor
+ share/locale
+ ${lib_prefix}/gdk-pixbuf-2.0
+ ${lib_prefix}/gtk-2.0
+ EOF
+ ;;
+ esac
case "${system_name}" in
'linux')
esac
}
+Multi::rewriteLoadersCache () {
+ local bundle_component_path="${1}"
+ local cache_file
+
+ find "${bundle_component_path}" \
+ -type f \
+ \( \
+ -name 'loaders.cache' \
+ -o -name 'immodules.cache' \
+ \) \
+ | while read cache_file
+ do
+ _sed \
+ -e 's|^"/[^"]*/lib/|"lib/|;s| "/[^"]*/share/| "share/|;/^# ModulesPath = /d;/^# Created by /d;/^#$/d' \
+ -i "${cache_file}"
+ done
+}
+
Multi::bundleGtkDepsFromFile () {
local lib_file="${1}"
+ local component_dir
+ local real_component_dir
+ local bundle_component_dir
lib_basename="$(basename "${lib_file}")"
for component_dir in $(Multi::getGtkDeps "${lib_prefix}" "${gtk_theme_name}")
do
- bundle_component_dir="$(echo "${component_dir}" | sed -e 's|^'"${lib_prefix}"'|lib|')"
+ bundle_component_dir="$(echo "${component_dir}" | _sed -e 's|^'"${lib_prefix}"'|lib|')"
if ! [ -e "${bundle_dir}/${bundle_component_dir}" ]
then
- mkdir --parents "${bundle_dir}/$(dirname "${bundle_component_dir}")"
+ real_component_dir="$(realpath "/${root_prefix}/${component_dir}")"
+
+ mkdir -p "${bundle_dir}/$(dirname "${bundle_component_dir}")"
+
+ _cpr -H -L \
+ "${real_component_dir}" \
+ "${bundle_dir}/${bundle_component_dir}"
- cp -H -r --preserve=timestamps \
- "/${root_prefix}/${component_dir}" \
+ touch -r \
+ "/${real_component_dir}" \
"${bundle_dir}/${bundle_component_dir}"
+
+ Multi::rewriteLoadersCache "${bundle_dir}/${bundle_component_dir}"
fi
done
fi
Multi::bundleLibFromFile () {
local exe_file="${1}"
+ local lib_file
Multi::printLdd "${exe_file}" \
| Multi::filterLib \
| while read lib_file
do
+ if [ "${lib_file}" = 'not found' ]
+ then
+ printf 'ERROR: library not found while bundling %s (but link worked)\n' "${exe_file}" >&2
+ Multi::printLdd "${exe_file}" | grep 'not found'
+ exit 1
+ fi
lib_basename="$(basename "${lib_file}")"
if [ -f "${lib_dir}/${lib_basename}" ]
continue
fi
- cp --preserve=timestamps \
+ cp -H \
+ "${lib_file}" \
+ "${lib_dir}/${lib_basename}"
+
+ touch -r \
"${lib_file}" \
"${lib_dir}/${lib_basename}"
Multi::bundleGtkDepsFromFile "${lib_file}"
+
+ case "${system_name}" in
+ 'macos')
+ Multi::bundleLibFromFile "${lib_file}"
+ ;;
+ esac
done
}
find "${bundle_dir}/lib" \
-type f \
-name '*.a' \
- -exec rm {} \;
+ -exec rm -f {} \;
find "${bundle_dir}/lib" \
-type f \
-name '*.h' \
- -exec rm {} \;
+ -exec rm -f {} \;
find "${bundle_dir}/lib" \
-depth \
-type d \
- -exec rmdir --ignore-fail-on-non-empty {} \;
+ -exec rmdir {} \; \
+ || true
}
Linux::getRpath () {
local path_start="$(printf '%s' "${bundle_dir}" | wc -c)"
path_start="$((${path_start} + 1))"
- local exe_subdir="$(echo "${exe_dir}" | cut -c "${path_start}-" | sed -e 's|//*|/|;s|^/||')"
+ local exe_subdir="$(echo "${exe_dir}" | cut -c "${path_start}-" | _sed -e 's|//*|/|;s|^/||')"
local rpath_origin='$ORIGIN'
done
}
+Darwin::patchExe () {
+ local exe_file="${1}"
+
+ Multi::printLdd "${exe_file}" \
+ | Multi::filterLib \
+ | while read lib_file
+ do
+ new_path="$(echo "${lib_file}" | _sed -e 's|^/.*/lib/|@executable_path/lib/|')"
+ id_name="$(echo "${lib_file}" | _sed -e 's|.*/||g')"
+ chmod u+w,go-w "${exe_file}"
+ install_name_tool -change "${lib_file}" "${new_path}" "${exe_file}"
+ install_name_tool -id "${id_name}" "${exe_file}"
+ done
+}
+
+Darwin::patchLib () {
+ local lib_dir="${1}"
+ local exe_file
+
+ find "${lib_dir}" \
+ -type f \
+ \( \
+ -name '*.dylib' \
+ -o -name '*.so' \
+ \) \
+ | while read exe_file
+ do
+ Darwin::patchExe "${exe_file}"
+ chmod ugo-x "${exe_file}"
+ done
+}
+
Windows::listLibForManifest () {
local lib_dir="${1}"
case "${system_name}" in
'register')
- mkdir --parents "${registry_dir}"
+ mkdir -p "${registry_dir}"
Common::getPath "${exe_file}" > "${registry_dir}/$(uuidgen)"
exit
;;
'windows')
lib_action='Windows::writeManifest'
;;
+ 'macos')
+ exe_action='Darwin::patchExe'
+ lib_action='Darwin::patchLib'
+ ;;
*)
printf 'ERROR: unsupported system: %s\n' "${system_name}" >&2
exit 1
;;
esac
-mkdir --parents "${lib_dir}"
+mkdir -p "${lib_dir}"
if [ -d "${registry_dir}" ]
then
void XORRectangle::draw() const
{
+#ifndef WORKAROUND_MACOS_GTK2_DESTROY
const int x = float_to_integer(m_rectangle.x);
const int y = float_to_integer(m_rectangle.y);
const int w = float_to_integer(m_rectangle.w);
cairo_set_source_rgb(cr, 1, 1, 1);
cairo_set_operator(cr, CAIRO_OPERATOR_DIFFERENCE);
cairo_stroke(cr);
+#endif
}
XORRectangle::XORRectangle(ui::GLArea widget) : m_widget(widget), cr(0)
XORRectangle::~XORRectangle()
{
if (initialised()) {
+#ifndef WORKAROUND_MACOS_GTK2_DESTROY
cairo_destroy(cr);
+#endif
}
}
copy_dlls(${name})
install(
TARGETS ${name}
- LIBRARY DESTINATION ${RADIANT_LIB_DIR}/modules
+ LIBRARY DESTINATION ${RADIANT_ADDONS_DIR}/modules
)
endmacro()
for ( std::vector<ui::Widget>::iterator i = g_floating_windows.begin(); i != g_floating_windows.end(); ++i )
{
+#ifndef WORKAROUND_MACOS_GTK2_DESTROY
i->destroy();
+#endif
}
+#ifndef WORKAROUND_MACOS_GTK2_DESTROY
m_window.destroy();
+#endif
}
void MainFrame::SetActiveXY( XYWnd* p ){
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+ <key>CFBundleDisplayName</key>
+ <string>NetRadiant</string>
+ <key>CFBundleExecutable</key>
+ <string>netradiant</string>
+ <key>CFBundleIconFile</key>
+ <string>netradiant.icns</string>
+ <key>CFBundleIdentifier</key>
+ <string>org.xonotic.netradiant</string>
+ <key>CFBundleName</key>
+ <string>NetRadiant</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleShortVersionString</key>
+ <string>1.5.0</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>1.5.0</string>
+ <key>LSMinimumSystemVersion</key>
+ <string>10.7</string>
+</dict>
+</plist>
+++ /dev/null
-# Makefile for NetRadiant.app, requires http://macdylibbundler.sourceforge.net/
-
-INSTALL = ../../install
-TARGET = target
-RESOURCES = $(TARGET)/NetRadiant.app/Contents/Resources
-BINDIR = $(RESOURCES)/install
-CONFDIR = $(RESOURCES)/etc
-DATADIR = $(RESOURCES)/share
-LIBDIR = $(RESOURCES)/lib
-VERSION = 1.5.0
-DMG = $(TARGET)/NetRadiant-$(VERSION).dmg
-VOLUME_NAME = "NetRadiant $(VERSION)"
-
-# We must rewrite some Gtk configuration files, which vary from environment to
-# environment depending on where you've installed MacPorts. Fun!
-
-MACPORTS_PREFIX := $(shell which port | sed 's:/bin/port::')
-PREFIX_SED_EXPR = "s:$(MACPORTS_PREFIX):@executable_path/..:g"
-
-all: install bundle
-
--pre-install:
- install -d $(TARGET)
- cp -r NetRadiant.app $(TARGET)
- find $(TARGET) -name .turd -delete
-
--gtk-runtime-gdk-pixbuf-2.0:
- cp -r $(MACPORTS_PREFIX)/lib/gdk-pixbuf-2.0 $(LIBDIR)
- find $(LIBDIR)/gdk-pixbuf-2.0 -type f ! -name "*.so" -delete
-
- gdk-pixbuf-query-loaders | sed $(PREFIX_SED_EXPR) > \
- $(CONFDIR)/gtk-2.0/gdk-pixbuf.loaders
-
--gtk-runtime-pango:
- cp -r $(MACPORTS_PREFIX)/lib/pango $(LIBDIR)
- find $(LIBDIR)/pango -type f ! -name "*.so" -delete
-
- pango-querymodules | sed $(PREFIX_SED_EXPR) > \
- $(CONFDIR)/pango/pango.modules
-
--gtk-runtime: -gtk-runtime-gdk-pixbuf-2.0 -gtk-runtime-pango
- cp -r $(MACPORTS_PREFIX)/lib/gtk-2.0 $(LIBDIR)
- find $(LIBDIR)/gtk-2.0 -type f ! -name "*.so" -delete
-
- rm -rf $(LIBDIR)/gtk-2.0/{includes,modules}
- rm -rf $(LIBDIR)/gtk-2.0/*/printbackends
-
- cp -r $(MACPORTS_PREFIX)/share/themes/Default $(RESOURCES)/share
-
- gtk-query-immodules-2.0 | sed $(PREFIX_SED_EXPR) > \
- $(CONFDIR)/gtk-2.0/gtk.immodules
-
-install: -pre-install -gtk-runtime
- cp -r $(INSTALL) $(RESOURCES)
- #rm -rf `find $(INSTDIR)/installs -type d -name .svn`
-
-bundle:
-
- # The Radiant plugins (modules) are a little funky
- # Some of them are actually linked against the build directory
-
- test -L install || ln -s $(INSTALL)
-
- dylibbundler -b \
- -x $(BINDIR)/radiant \
- -x $(BINDIR)/q2map \
- -x $(BINDIR)/q3data \
- -x $(BINDIR)/q3map2 \
- -x $(BINDIR)/qdata3 \
- `find $(BINDIR)/modules -name "*.dylib" | xargs -I {} echo -x {}` \
- `find $(LIBDIR) -name "*.dylib" | xargs -I {} echo -x {}` \
- -d $(LIBDIR) -of -p @executable_path/../lib
-
- rm -f install
-
-image:
- find $(TARGET) -name .DS_Store -delete
- ln -f -s /Applications $(TARGET)/Applications
- hdiutil create -ov $(DMG) -srcfolder $(TARGET) -volname $(VOLUME_NAME)
- rm $(TARGET)/Applications
-
-clean:
- rm -rf $(TARGET)/*
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleDisplayName</key>
- <string>NetRadiant</string>
- <key>CFBundleExecutable</key>
- <string>radiant</string>
- <key>CFBundleIconFile</key>
- <string>radiant.icns</string>
- <key>CFBundleIdentifier</key>
- <string>org.xonotic.netradiant</string>
- <key>CFBundleName</key>
- <string>NetRadiant</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleShortVersionString</key>
- <string>1.5.0</string>
- <key>CFBundleSignature</key>
- <string>????</string>
- <key>CFBundleVersion</key>
- <string>1.5.0</string>
- <key>LSMinimumSystemVersion</key>
- <string>10.7</string>
-</dict>
-</plist>
+++ /dev/null
-#!/bin/bash
-
-RADIANT_HOME=$(dirname "$0")
-RADIANT_HOME=${RADIANT_HOME/NetRadiant.app*/NetRadiant.app}
-
-echo
-echo "Starting NetRadiant in ${RADIANT_HOME}"
-echo
-
-set -x
-
-resources="${RADIANT_HOME}/Contents/Resources"
-
-export FONTCONFIG_PATH="${resources}/etc/fonts"
-export FC_DEBUG=1024
-
-export GDK_GL_LIBGL_PATH="${resources}/lib/libGL.1.dylib"
-export GDK_GL_LIBGLU_PATH="${resources}/lib/libGLU.1.dylib"
-
-export GDK_PATH="${resources}"
-export GDK_PIXBUF_MODULE_FILE="${resources}/etc/gtk-2.0/gdk-pixbuf.loaders"
-
-export GOBJECT_PATH="${resources}"
-
-export GTK_DATA_PREFIX="${resources}"
-export GTK_EXE_PREFIX="${resources}"
-export GTK_PATH="${resources}"
-
-export PANGO_SYSCONFDIR="${resources}/etc"
-export PANGO_LIBDIR="${resources}/lib"
-
-cd "${resources}/install"
-./radiant &
-
-set +x
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0"?>
-<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
-<fontconfig>
-
-<!--
- Adjusted FontConfig for GtkRadiant.app. Include only paths which Mac users
- will more than likely have.
--->
-
-<!--
- Font directory list
--->
- <dir>/usr/X11/lib/X11/fonts</dir>
- <dir>/Library/Fonts</dir>
- <dir>/System/Library/Fonts</dir>
- <dir prefix="xdg">fonts</dir>
-
-<!--
- Accept deprecated 'mono' alias, replacing it with 'monospace'
--->
- <match target="pattern">
- <test qual="any" name="family">
- <string>mono</string>
- </test>
- <edit name="family" mode="assign" binding="same">
- <string>monospace</string>
- </edit>
- </match>
-
-<!--
- Accept alternate 'sans serif' spelling, replacing it with 'sans-serif'
--->
- <match target="pattern">
- <test qual="any" name="family">
- <string>sans serif</string>
- </test>
- <edit name="family" mode="assign" binding="same">
- <string>sans-serif</string>
- </edit>
- </match>
-
-<!--
- Accept deprecated 'sans' alias, replacing it with 'sans-serif'
--->
- <match target="pattern">
- <test qual="any" name="family">
- <string>sans</string>
- </test>
- <edit name="family" mode="assign" binding="same">
- <string>sans-serif</string>
- </edit>
- </match>
-
-<!-- Font cache directory list -->
- <cachedir prefix="xdg">fontconfig</cachedir>
-
- <config>
-<!--
- These are the default Unicode chars that are expected to be blank
- in fonts. All other blank chars are assumed to be broken and
- won't appear in the resulting charsets
- -->
- <blank>
- <int>0x0020</int> <!-- SPACE -->
- <int>0x00A0</int> <!-- NO-BREAK SPACE -->
- <int>0x00AD</int> <!-- SOFT HYPHEN -->
- <int>0x034F</int> <!-- COMBINING GRAPHEME JOINER -->
- <int>0x0600</int> <!-- ARABIC NUMBER SIGN -->
- <int>0x0601</int> <!-- ARABIC SIGN SANAH -->
- <int>0x0602</int> <!-- ARABIC FOOTNOTE MARKER -->
- <int>0x0603</int> <!-- ARABIC SIGN SAFHA -->
- <int>0x06DD</int> <!-- ARABIC END OF AYAH -->
- <int>0x070F</int> <!-- SYRIAC ABBREVIATION MARK -->
- <int>0x115F</int> <!-- HANGUL CHOSEONG FILLER -->
- <int>0x1160</int> <!-- HANGUL JUNGSEONG FILLER -->
- <int>0x1680</int> <!-- OGHAM SPACE MARK -->
- <int>0x17B4</int> <!-- KHMER VOWEL INHERENT AQ -->
- <int>0x17B5</int> <!-- KHMER VOWEL INHERENT AA -->
- <int>0x180E</int> <!-- MONGOLIAN VOWEL SEPARATOR -->
- <int>0x2000</int> <!-- EN QUAD -->
- <int>0x2001</int> <!-- EM QUAD -->
- <int>0x2002</int> <!-- EN SPACE -->
- <int>0x2003</int> <!-- EM SPACE -->
- <int>0x2004</int> <!-- THREE-PER-EM SPACE -->
- <int>0x2005</int> <!-- FOUR-PER-EM SPACE -->
- <int>0x2006</int> <!-- SIX-PER-EM SPACE -->
- <int>0x2007</int> <!-- FIGURE SPACE -->
- <int>0x2008</int> <!-- PUNCTUATION SPACE -->
- <int>0x2009</int> <!-- THIN SPACE -->
- <int>0x200A</int> <!-- HAIR SPACE -->
- <int>0x200B</int> <!-- ZERO WIDTH SPACE -->
- <int>0x200C</int> <!-- ZERO WIDTH NON-JOINER -->
- <int>0x200D</int> <!-- ZERO WIDTH JOINER -->
- <int>0x200E</int> <!-- LEFT-TO-RIGHT MARK -->
- <int>0x200F</int> <!-- RIGHT-TO-LEFT MARK -->
- <int>0x2028</int> <!-- LINE SEPARATOR -->
- <int>0x2029</int> <!-- PARAGRAPH SEPARATOR -->
- <int>0x202A</int> <!-- LEFT-TO-RIGHT EMBEDDING -->
- <int>0x202B</int> <!-- RIGHT-TO-LEFT EMBEDDING -->
- <int>0x202C</int> <!-- POP DIRECTIONAL FORMATTING -->
- <int>0x202D</int> <!-- LEFT-TO-RIGHT OVERRIDE -->
- <int>0x202E</int> <!-- RIGHT-TO-LEFT OVERRIDE -->
- <int>0x202F</int> <!-- NARROW NO-BREAK SPACE -->
- <int>0x205F</int> <!-- MEDIUM MATHEMATICAL SPACE -->
- <int>0x2060</int> <!-- WORD JOINER -->
- <int>0x2061</int> <!-- FUNCTION APPLICATION -->
- <int>0x2062</int> <!-- INVISIBLE TIMES -->
- <int>0x2063</int> <!-- INVISIBLE SEPARATOR -->
- <int>0x206A</int> <!-- INHIBIT SYMMETRIC SWAPPING -->
- <int>0x206B</int> <!-- ACTIVATE SYMMETRIC SWAPPING -->
- <int>0x206C</int> <!-- INHIBIT ARABIC FORM SHAPING -->
- <int>0x206D</int> <!-- ACTIVATE ARABIC FORM SHAPING -->
- <int>0x206E</int> <!-- NATIONAL DIGIT SHAPES -->
- <int>0x206F</int> <!-- NOMINAL DIGIT SHAPES -->
- <int>0x2800</int> <!-- BRAILLE PATTERN BLANK -->
- <int>0x3000</int> <!-- IDEOGRAPHIC SPACE -->
- <int>0x3164</int> <!-- HANGUL FILLER -->
- <int>0xFEFF</int> <!-- ZERO WIDTH NO-BREAK SPACE -->
- <int>0xFFA0</int> <!-- HALFWIDTH HANGUL FILLER -->
- <int>0xFFF9</int> <!-- INTERLINEAR ANNOTATION ANCHOR -->
- <int>0xFFFA</int> <!-- INTERLINEAR ANNOTATION SEPARATOR -->
- <int>0xFFFB</int> <!-- INTERLINEAR ANNOTATION TERMINATOR -->
- </blank>
-<!--
- Rescan configuration every 30 seconds when FcFontSetList is called
- -->
- <rescan>
- <int>30</int>
- </rescan>
- </config>
-
-</fontconfig>
-
+++ /dev/null
-[Pango]
\ No newline at end of file
+++ /dev/null
-NetRadiant for Apple OS X
-========================
-
-This directory provides packaging steps for NetRadiant for OS X. This document describes compiling the application on OSX as well as generating distributable bundles using the framework provided in this directory.
-
-Dependencies & Compilation
---------------------------
-
-Directions for OS X Yosemite 10.10 - your mileage may vary:
-
-- Install [MacPorts](http://macports.org).
-- Install [XQuartz](http://xquartz.macosforge.org/)
-
-- Install dependencies with MacPorts:
-
-```
-sudo port install dylibbundler pkgconfig gtkglext
-```
-
-- Get the NetRadiant code and compile:
-
-```
-git clone https://gitlab.com/xonotic/netradiant.git
-cd netradiant/
-make
-```
-
-- Run the build:
-
-(from the netradiant/ directory)
-```
-./install/radiant
-```
-
-XQuartz note: on my configuration XQuartz doesn't automatically start for some reason. I have to open another terminal, and run the following command: `/Applications/Utilities/XQuartz.app/Contents/MacOS/X11.bin`, then start radiant.
-
-Building NetRadiant.app
------------------------
-
-The `Makefile` in the 'setup/apple/' directory will produce a distributable .app bundle for NetRadiant using `dylibbundler`:
-
-```
-make
-make image
-```
-
-Getting help
-------------
-
-IRC: Quakenet #xonotic, or post something on the issue tracker..
--- /dev/null
+#! /usr/bin/env bash
+
+set -o physical
+
+script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
+
+bundle_dir="$(cd "${script_dir}/../Prefix"; pwd)"
+
+echo "Starting NetRadiant in ${bundle_dir}"
+
+set -x
+
+cd "${bundle_dir}"
+
+export FC_DEBUG=1024
+
+# if bundled
+if [ -d "${bundle_dir}/share/icons/hicolor" ]
+then
+ export FONTCONFIG_PATH="${bundle_dir}/etc/fonts"
+
+ # export GDK_GL_LIBGL_PATH="${bundle_dir}/lib/libGL.1.dylib"
+ # export GDK_GL_LIBGLU_PATH="${bundle_dir}/lib/libGLU.1.dylib"
+
+ export GDK_PATH="${bundle_dir}"
+
+ export GDK_PIXBUF_MODULE_FILE="${bundle_dir}/lib/gdk-pixbuf-2.0/2.10.0/loaders.cache"
+
+ export GTK_IM_MODULE_FILE="${bundle_dir}/lib/gtk-2.0/2.10.0/immodules.cache"
+
+ export GOBJECT_PATH="${bundle_dir}"
+
+ export GTK_DATA_PREFIX="${bundle_dir}"
+ export GTK_EXE_PREFIX="${bundle_dir}"
+ export GTK_PATH="${bundle_dir}"
+fi
+
+./netradiant &
#include "mathlib.h"
#include "inout.h"
#include "vfs.h"
-#include <minizip/unzip.h>
+#include <unzip.h>
#include <glib.h>
typedef struct
-Subproject commit 1ce452e88274fd6214b3d1b23ed6f8b4bf8c7646
+Subproject commit e6f3aec0a1b201193cc0e1cc58de98252b476456