From af6028a9ddca683c3319437ae79ef461dc741cac Mon Sep 17 00:00:00 2001 From: Rafael Kitover Date: Tue, 16 Apr 2024 15:30:30 +0000 Subject: [PATCH] build: fix build for nix on macOS Add the NIXPKGS_ALLOW_UNSUPPORTED_SYSTEM env var to the macOS CI as faudio has not been marked compatible with macOS yet. Remove FindGettext.cmake as it is a core cmake module that is available in the versions of cmake we support now. Add support for nix to MacPackageManagers.cmake and add brew gettext to CMAKE_IGNORE_PATH when not using brew. Also update the cmake style. Add faudio, libintl and the System framework to buildInputs in default.nix. Signed-off-by: Rafael Kitover --- .github/workflows/macos-build.yml | 2 + cmake/FindGettext.cmake | 231 ------------------------------ cmake/MacPackageManagers.cmake | 91 ++++++------ cmake/Toolchain.cmake | 2 +- default.nix | 4 +- 5 files changed, 54 insertions(+), 276 deletions(-) delete mode 100644 cmake/FindGettext.cmake diff --git a/.github/workflows/macos-build.yml b/.github/workflows/macos-build.yml index 487334c1..5b2b4193 100644 --- a/.github/workflows/macos-build.yml +++ b/.github/workflows/macos-build.yml @@ -27,6 +27,8 @@ jobs: - build_type: debug build_options: translations_only runs-on: macos-latest + env: + NIXPKGS_ALLOW_UNSUPPORTED_SYSTEM: 1 steps: - name: Checkout the code diff --git a/cmake/FindGettext.cmake b/cmake/FindGettext.cmake deleted file mode 100644 index 9f07b0a4..00000000 --- a/cmake/FindGettext.cmake +++ /dev/null @@ -1,231 +0,0 @@ -# Distributed under the OSI-approved BSD 3-Clause License. See accompanying -# file Copyright.txt or https://cmake.org/licensing for details. - -#.rst: -# FindGettext -# ----------- -# -# Find GNU gettext tools -# -# This module looks for the GNU gettext tools. This module defines the -# following values: -# -# :: -# -# GETTEXT_MSGMERGE_EXECUTABLE: the full path to the msgmerge tool. -# GETTEXT_MSGFMT_EXECUTABLE: the full path to the msgfmt tool. -# GETTEXT_FOUND: True if gettext has been found. -# GETTEXT_VERSION_STRING: the version of gettext found (since CMake 2.8.8) -# -# -# -# Additionally it provides the following macros: -# -# GETTEXT_CREATE_TRANSLATIONS ( outputFile [ALL] file1 ... fileN ) -# -# :: -# -# This will create a target "translations" which will convert the -# given input po files into the binary output mo file. If the -# ALL option is used, the translations will also be created when -# building the default target. -# -# GETTEXT_PROCESS_POT_FILE( [ALL] [INSTALL_DESTINATION ] -# LANGUAGES ... ) -# -# :: -# -# Process the given pot file to mo files. -# If INSTALL_DESTINATION is given then automatically install rules will -# be created, the language subdirectory will be taken into account -# (by default use share/locale/). -# If ALL is specified, the pot file is processed when building the all traget. -# It creates a custom target "potfile". -# -# GETTEXT_PROCESS_PO_FILES( [ALL] [INSTALL_DESTINATION ] -# PO_FILES ... ) -# -# :: -# -# Process the given po files to mo files for the given language. -# If INSTALL_DESTINATION is given then automatically install rules will -# be created, the language subdirectory will be taken into account -# (by default use share/locale/). -# If ALL is specified, the po files are processed when building the all traget. -# It creates a custom target "pofiles". -# -# .. note:: -# If you wish to use the Gettext library (libintl), use :module:`FindIntl`. - -find_program(GETTEXT_MSGMERGE_EXECUTABLE msgmerge) - -find_program(GETTEXT_MSGFMT_EXECUTABLE msgfmt) - -if(GETTEXT_MSGMERGE_EXECUTABLE) - execute_process(COMMAND ${GETTEXT_MSGMERGE_EXECUTABLE} --version - OUTPUT_VARIABLE gettext_version - ERROR_QUIET - OUTPUT_STRIP_TRAILING_WHITESPACE) - get_filename_component(msgmerge_name ${GETTEXT_MSGMERGE_EXECUTABLE} NAME) - get_filename_component(msgmerge_namewe ${GETTEXT_MSGMERGE_EXECUTABLE} NAME_WE) - if (gettext_version MATCHES "^(${msgmerge_name}|${msgmerge_namewe}) \\([^\\)]*\\) ([0-9\\.]+[^ \n]*)") - set(GETTEXT_VERSION_STRING "${CMAKE_MATCH_2}") - endif() - unset(gettext_version) - unset(msgmerge_name) - unset(msgmerge_namewe) -endif() - -include(FindPackageHandleStandardArgs) - -FIND_PACKAGE_HANDLE_STANDARD_ARGS(Gettext - REQUIRED_VARS GETTEXT_MSGMERGE_EXECUTABLE GETTEXT_MSGFMT_EXECUTABLE - VERSION_VAR GETTEXT_VERSION_STRING) - -function(_GETTEXT_GET_UNIQUE_TARGET_NAME _name _unique_name) - set(propertyName "_GETTEXT_UNIQUE_COUNTER_${_name}") - get_property(currentCounter GLOBAL PROPERTY "${propertyName}") - if(NOT currentCounter) - set(currentCounter 1) - endif() - set(${_unique_name} "${_name}_${currentCounter}" PARENT_SCOPE) - math(EXPR currentCounter "${currentCounter} + 1") - set_property(GLOBAL PROPERTY ${propertyName} ${currentCounter} ) -endfunction() - -macro(GETTEXT_CREATE_TRANSLATIONS _potFile _firstPoFileArg) - # make it a real variable, so we can modify it here - set(_firstPoFile "${_firstPoFileArg}") - - set(_gmoFiles) - get_filename_component(_potName ${_potFile} NAME) - string(REGEX REPLACE "^(.+)(\\.[^.]+)$" "\\1" _potBasename ${_potName}) - get_filename_component(_absPotFile ${_potFile} ABSOLUTE) - - set(_addToAll) - if(${_firstPoFile} STREQUAL "ALL") - set(_addToAll "ALL") - set(_firstPoFile) - endif() - - foreach (_currentPoFile ${_firstPoFile} ${ARGN}) - get_filename_component(_absFile ${_currentPoFile} ABSOLUTE) - get_filename_component(_abs_PATH ${_absFile} PATH) - string(REGEX REPLACE "^.*/([^/]+)(\\.[^.]+)$" "\\1" _lang ${_absFile}) - set(_gmoFile ${CMAKE_CURRENT_BINARY_DIR}/${_lang}.gmo) - - add_custom_command( - OUTPUT ${_gmoFile} - #COMMAND ${GETTEXT_MSGMERGE_EXECUTABLE} --quiet --update --backup=none -s ${_absFile} ${_absPotFile} - COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} -o ${_gmoFile} ${_absFile} - DEPENDS ${_absPotFile} ${_absFile} - ) - - install(FILES ${_gmoFile} DESTINATION share/locale/${_lang}/LC_MESSAGES RENAME ${_potBasename}.mo) - set(_gmoFiles ${_gmoFiles} ${_gmoFile}) - - endforeach () - - if(NOT TARGET translations) - add_custom_target(translations) - endif() - - _GETTEXT_GET_UNIQUE_TARGET_NAME(translations uniqueTargetName) - - add_custom_target(${uniqueTargetName} ${_addToAll} DEPENDS ${_gmoFiles}) - - add_dependencies(translations ${uniqueTargetName}) -endmacro() - - -function(GETTEXT_PROCESS_POT_FILE _potFile) - set(_gmoFiles) - set(_options ALL) - set(_oneValueArgs INSTALL_DESTINATION) - set(_multiValueArgs LANGUAGES) - - CMAKE_PARSE_ARGUMENTS(_parsedArguments "${_options}" "${_oneValueArgs}" "${_multiValueArgs}" ${ARGN}) - - get_filename_component(_potName ${_potFile} NAME) - string(REGEX REPLACE "^(.+)(\\.[^.]+)$" "\\1" _potBasename ${_potName}) - get_filename_component(_absPotFile ${_potFile} ABSOLUTE) - - foreach (_lang ${_parsedArguments_LANGUAGES}) - set(_poFile "${CMAKE_CURRENT_BINARY_DIR}/${_lang}.po") - set(_gmoFile "${CMAKE_CURRENT_BINARY_DIR}/${_lang}.gmo") - - add_custom_command( - OUTPUT "${_poFile}" - COMMAND ${GETTEXT_MSGMERGE_EXECUTABLE} --quiet --update --backup=none -s ${_poFile} ${_absPotFile} - DEPENDS ${_absPotFile} - ) - - add_custom_command( - OUTPUT "${_gmoFile}" - COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} -o ${_gmoFile} ${_poFile} - DEPENDS ${_absPotFile} ${_poFile} - ) - - if(_parsedArguments_INSTALL_DESTINATION) - install(FILES ${_gmoFile} DESTINATION ${_parsedArguments_INSTALL_DESTINATION}/${_lang}/LC_MESSAGES RENAME ${_potBasename}.mo) - endif() - list(APPEND _gmoFiles ${_gmoFile}) - endforeach () - - if(NOT TARGET potfiles) - add_custom_target(potfiles) - endif() - - _GETTEXT_GET_UNIQUE_TARGET_NAME( potfiles uniqueTargetName) - - if(_parsedArguments_ALL) - add_custom_target(${uniqueTargetName} ALL DEPENDS ${_gmoFiles}) - else() - add_custom_target(${uniqueTargetName} DEPENDS ${_gmoFiles}) - endif() - - add_dependencies(potfiles ${uniqueTargetName}) - -endfunction() - - -function(GETTEXT_PROCESS_PO_FILES _lang) - set(_options ALL) - set(_oneValueArgs INSTALL_DESTINATION) - set(_multiValueArgs PO_FILES) - set(_gmoFiles) - - CMAKE_PARSE_ARGUMENTS(_parsedArguments "${_options}" "${_oneValueArgs}" "${_multiValueArgs}" ${ARGN}) - - foreach(_current_PO_FILE ${_parsedArguments_PO_FILES}) - get_filename_component(_name ${_current_PO_FILE} NAME) - string(REGEX REPLACE "^(.+)(\\.[^.]+)$" "\\1" _basename ${_name}) - set(_gmoFile ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.gmo) - add_custom_command(OUTPUT ${_gmoFile} - COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} -o ${_gmoFile} ${_current_PO_FILE} - WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" - DEPENDS ${_current_PO_FILE} - ) - - if(_parsedArguments_INSTALL_DESTINATION) - install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.gmo DESTINATION ${_parsedArguments_INSTALL_DESTINATION}/${_lang}/LC_MESSAGES/ RENAME ${_basename}.mo) - endif() - list(APPEND _gmoFiles ${_gmoFile}) - endforeach() - - - if(NOT TARGET pofiles) - add_custom_target(pofiles) - endif() - - _GETTEXT_GET_UNIQUE_TARGET_NAME( pofiles uniqueTargetName) - - if(_parsedArguments_ALL) - add_custom_target(${uniqueTargetName} ALL DEPENDS ${_gmoFiles}) - else() - add_custom_target(${uniqueTargetName} DEPENDS ${_gmoFiles}) - endif() - - add_dependencies(pofiles ${uniqueTargetName}) - -endfunction() diff --git a/cmake/MacPackageManagers.cmake b/cmake/MacPackageManagers.cmake index 601b0caf..6482d9f4 100644 --- a/cmake/MacPackageManagers.cmake +++ b/cmake/MacPackageManagers.cmake @@ -11,8 +11,8 @@ # In addition, the following commands are called with the package manager's # paths: # -# INCLUDE_DIRECTORIES() -# LINK_DIRECTORIES() +# include_directories() +# link_directories() # # The paths of package managers not currently in $ENV{PATH} are added to # CMAKE_IGNORE_PATH . @@ -41,68 +41,75 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -IF(NOT APPLE) - RETURN() -ENDIF() +if(NOT APPLE) + return() +endif() -IF(EXISTS /usr/local/bin/brew AND $ENV{PATH} MATCHES "(^|:)/usr/local/bin/?(:|$)") - MESSAGE("-- Configuring for Mac Homebrew") +if(NOT "$ENV{IN_NIX_SHELL}" STREQUAL "") + message(STATUS "Configuring for Nix") - SET(MAC_HOMEBREW ON) + set(NIX ON) - SET(CMAKE_IGNORE_PATH /opt/local /opt/local/bin /opt/local/include /opt/local/Library/Frameworks /opt/local/lib ${CMAKE_IGNORE_PATH}) - SET(CMAKE_IGNORE_PATH /sw /sw/bin /sw/include /sw/Library/Frameworks /sw/lib ${CMAKE_IGNORE_PATH}) + set(CMAKE_IGNORE_PATH /opt/local /opt/local/bin /opt/local/include /opt/local/Library/Frameworks /opt/local/lib ${CMAKE_IGNORE_PATH}) + set(CMAKE_IGNORE_PATH /sw /sw/bin /sw/include /sw/Library/Frameworks /sw/lib ${CMAKE_IGNORE_PATH}) +elseif(EXISTS /usr/local/bin/brew AND $ENV{PATH} MATCHES "(^|:)/usr/local/bin/?(:|$)") + message(STATUS "Configuring for Mac Homebrew") - SET(CMAKE_FRAMEWORK_PATH /usr/local/Frameworks ${CMAKE_FRAMEWORK_PATH}) + set(MAC_HOMEBREW ON) - SET(CMAKE_INCLUDE_PATH /usr/local/include ${CMAKE_INCLUDE_PATH}) - INCLUDE_DIRECTORIES("/usr/local/include") + set(CMAKE_IGNORE_PATH /opt/local /opt/local/bin /opt/local/include /opt/local/Library/Frameworks /opt/local/lib ${CMAKE_IGNORE_PATH}) + set(CMAKE_IGNORE_PATH /sw /sw/bin /sw/include /sw/Library/Frameworks /sw/lib ${CMAKE_IGNORE_PATH}) - SET(CMAKE_LIBRARY_PATH /usr/local/lib ${CMAKE_LIBRARY_PATH}) - LINK_DIRECTORIES("/usr/local/lib") + set(CMAKE_FRAMEWORK_PATH /usr/local/Frameworks ${CMAKE_FRAMEWORK_PATH}) - SET(CMAKE_PROGRAM_PATH /usr/local/bin ${CMAKE_PROGRAM_PATH}) + set(CMAKE_INCLUDE_PATH /usr/local/include ${CMAKE_INCLUDE_PATH}) + include_directories("/usr/local/include") + + set(CMAKE_LIBRARY_PATH /usr/local/lib ${CMAKE_LIBRARY_PATH}) + link_directories("/usr/local/lib") + + set(CMAKE_PROGRAM_PATH /usr/local/bin ${CMAKE_PROGRAM_PATH}) set(ZLIB_ROOT /usr/local/opt/zlib) -ELSEIF(EXISTS /opt/local/bin/port AND $ENV{PATH} MATCHES "(^|:)/opt/local/bin/?(:|$)") - MESSAGE("-- Configuring for MacPorts") +elseif(EXISTS /opt/local/bin/port AND $ENV{PATH} MATCHES "(^|:)/opt/local/bin/?(:|$)") + message(STATUS "Configuring for MacPorts") - SET(MACPORTS ON) + set(MACPORTS ON) - SET(CMAKE_IGNORE_PATH /sw /sw/bin /sw/include /sw/Library/Frameworks /sw/lib ${CMAKE_IGNORE_PATH}) + set(CMAKE_IGNORE_PATH /sw /sw/bin /sw/include /sw/Library/Frameworks /sw/lib ${CMAKE_IGNORE_PATH}) - SET(CMAKE_FRAMEWORK_PATH /opt/local/Library/Frameworks ${CMAKE_FRAMEWORK_PATH}) + set(CMAKE_FRAMEWORK_PATH /opt/local/Library/Frameworks ${CMAKE_FRAMEWORK_PATH}) - SET(CMAKE_INCLUDE_PATH /opt/local/include ${CMAKE_INCLUDE_PATH}) - INCLUDE_DIRECTORIES("/opt/local/include") + set(CMAKE_INCLUDE_PATH /opt/local/include ${CMAKE_INCLUDE_PATH}) + include_directories("/opt/local/include") - SET(CMAKE_LIBRARY_PATH /opt/local/lib ${CMAKE_LIBRARY_PATH}) - LINK_DIRECTORIES("/opt/local/lib") + set(CMAKE_LIBRARY_PATH /opt/local/lib ${CMAKE_LIBRARY_PATH}) + link_directories("/opt/local/lib") - SET(CMAKE_PROGRAM_PATH /opt/local/bin ${CMAKE_PROGRAM_PATH}) -ELSEIF(EXISTS /sw/bin/fink AND $ENV{PATH} MATCHES "(^|:)/sw/bin/?(:|$)") - MESSAGE("-- Configuring for Fink") + set(CMAKE_PROGRAM_PATH /opt/local/bin ${CMAKE_PROGRAM_PATH}) +elseif(EXISTS /sw/bin/fink AND $ENV{PATH} MATCHES "(^|:)/sw/bin/?(:|$)") + message(STATUS "Configuring for Fink") - SET(FINK ON) + set(FINK ON) - SET(CMAKE_IGNORE_PATH /opt/local /opt/local/bin /opt/local/include /opt/local/Library/Frameworks /opt/local/lib ${CMAKE_IGNORE_PATH}) + set(CMAKE_IGNORE_PATH /opt/local /opt/local/bin /opt/local/include /opt/local/Library/Frameworks /opt/local/lib ${CMAKE_IGNORE_PATH}) - SET(CMAKE_FRAMEWORK_PATH /sw/Library/Frameworks ${CMAKE_FRAMEWORK_PATH}) + set(CMAKE_FRAMEWORK_PATH /sw/Library/Frameworks ${CMAKE_FRAMEWORK_PATH}) - SET(CMAKE_INCLUDE_PATH /sw/include ${CMAKE_INCLUDE_PATH}) - INCLUDE_DIRECTORIES("/sw/include") + set(CMAKE_INCLUDE_PATH /sw/include ${CMAKE_INCLUDE_PATH}) + include_directories("/sw/include") - SET(CMAKE_LIBRARY_PATH /sw/lib ${CMAKE_LIBRARY_PATH}) - LINK_DIRECTORIES("/sw/lib") + set(CMAKE_LIBRARY_PATH /sw/lib ${CMAKE_LIBRARY_PATH}) + link_directories("/sw/lib") - SET(CMAKE_PROGRAM_PATH /sw/bin ${CMAKE_PROGRAM_PATH}) -ELSE() + set(CMAKE_PROGRAM_PATH /sw/bin ${CMAKE_PROGRAM_PATH}) +else() # no package manager found or active, do nothing - RETURN() -ENDIF() + return() +endif() # only ignore /usr/local if brew is installed and not in the PATH # in other cases, it is the user's personal installations -IF(NOT MAC_HOMEBREW AND EXISTS /usr/local/bin/brew) - SET(CMAKE_IGNORE_PATH /usr/local /usr/local/bin /usr/local/include /usr/local/Library/Frameworks /usr/local/lib ${CMAKE_IGNORE_PATH}) -ENDIF() +if(NOT MAC_HOMEBREW AND EXISTS /usr/local/bin/brew) + set(CMAKE_IGNORE_PATH /usr/local /usr/local/bin /usr/local/include /usr/local/Library/Frameworks /usr/local/lib /usr/local/opt/gettext/bin /usr/local/opt/gettext/lib ${CMAKE_IGNORE_PATH}) +endif() diff --git a/cmake/Toolchain.cmake b/cmake/Toolchain.cmake index cec1a17d..9297df27 100644 --- a/cmake/Toolchain.cmake +++ b/cmake/Toolchain.cmake @@ -12,7 +12,7 @@ if(ENABLE_LTO) include(CheckIPOSupported) check_ipo_supported(RESULT LTO_SUPPORTED) - # MINGW64 on x64 does not support LTO + # MINGW64 does not support LTO if(WIN32 AND CMAKE_CXX_COMPILER_ID STREQUAL "GNU") set(LTO_SUPPORTED FALSE) endif() diff --git a/default.nix b/default.nix index 0e373af2..d9ef6f42 100644 --- a/default.nix +++ b/default.nix @@ -2,7 +2,7 @@ with import {}; stdenv.mkDerivation { name = "visualboyadvance-m"; buildInputs = if stdenv.isDarwin then - [ ninja cmake gcc nasm faudio gettext pkg-config zip sfml zlib openal ffmpeg wxGTK32 SDL2 pcre pcre2 darwin.apple_sdk.frameworks.IOKit darwin.apple_sdk.frameworks.Carbon darwin.apple_sdk.frameworks.Cocoa darwin.apple_sdk.frameworks.QuartzCore darwin.apple_sdk.frameworks.AudioToolbox darwin.apple_sdk.frameworks.OpenGL darwin.apple_sdk.frameworks.OpenAL llvmPackages_latest.clang llvmPackages_latest.bintools ] + [ ninja cmake gcc nasm faudio gettext libintl pkg-config zip sfml zlib openal ffmpeg wxGTK32 SDL2 pcre pcre2 darwin.apple_sdk.frameworks.System darwin.apple_sdk.frameworks.IOKit darwin.apple_sdk.frameworks.Carbon darwin.apple_sdk.frameworks.Cocoa darwin.apple_sdk.frameworks.QuartzCore darwin.apple_sdk.frameworks.AudioToolbox darwin.apple_sdk.frameworks.OpenGL darwin.apple_sdk.frameworks.OpenAL llvmPackages_latest.clang llvmPackages_latest.bintools ] else - [ ninja cmake gcc nasm faudio gettext pkg-config zip sfml zlib openal ffmpeg wxGTK32 libGL libGLU glfw SDL2 gtk3-x11 pcre pcre2 util-linuxMinimal libselinux libsepol libthai libdatrie xorg.libXdmcp xorg.libXtst libxkbcommon epoxy dbus at-spi2-core ]; + [ ninja cmake gcc nasm faudio gettext libintl pkg-config zip sfml zlib openal ffmpeg wxGTK32 libGL libGLU glfw SDL2 gtk3-x11 pcre pcre2 util-linuxMinimal libselinux libsepol libthai libdatrie xorg.libXdmcp xorg.libXtst libxkbcommon epoxy dbus at-spi2-core ]; }