Skip to content

Commit

Permalink
enhancement: cherry-pick build improvements from upstream
Browse files Browse the repository at this point in the history
  • Loading branch information
midwan committed Sep 23, 2024
1 parent 45b9799 commit 369f32b
Show file tree
Hide file tree
Showing 30 changed files with 341 additions and 760 deletions.
File renamed without changes.
File renamed without changes.
552 changes: 42 additions & 510 deletions .github/workflows/c-cpp.yml

Large diffs are not rendered by default.

204 changes: 115 additions & 89 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
cmake_minimum_required(VERSION 3.16)
project(amiberry)
project(amiberry-lite VERSION 5.7.5)
enable_language(C CXX ASM)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_C_FLAGS_RELEASE "-O3 -pipe")
set(CMAKE_C_FLAGS_DEBUG "-Og -g -rdynamic -funwind-tables -DDEBUG -Wl,--export-dynamic -pipe")
set(CMAKE_C_FLAGS_RELEASE "-O3 -pipe -fno-pie -no-pie")
set(CMAKE_C_FLAGS_DEBUG "-Og -g -funwind-tables -DDEBUG -pipe -fno-pie -no-pie")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")
set(CMAKE_ASM_COMPILER "${CMAKE_C_COMPILER}")
Expand Down Expand Up @@ -33,38 +33,20 @@ endif ()
# Needed so that cmake uses our find modules.
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)

include(CheckSymbolExists)
function(detect_architecture symbol arch)
if (NOT DEFINED ARCHITECTURE)
set(CMAKE_REQUIRED_QUIET 1)
check_symbol_exists("${symbol}" "" ARCHITECTURE_${arch})
unset(CMAKE_REQUIRED_QUIET)

# The output variable needs to be unique across invocations otherwise
# CMake's crazy scope rules will keep it defined
if (ARCHITECTURE_${arch})
set(ARCHITECTURE "${arch}" PARENT_SCOPE)
endif ()
endif ()
endfunction()

detect_architecture("__x86_64__" x86_64)
detect_architecture("__aarch64__" arm64)
detect_architecture("__arm__" arm32)

message(STATUS "Target architecture: ${ARCHITECTURE}")

if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
set(MACOS TRUE)
message(STATUS "macOS platform detected")
if (CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64" OR ARCHITECTURE MATCHES "arm64")
set(CMAKE_EXE_LINKER_FLAGS "-L/usr/local/lib external/libguisan/dylib/libguisan.dylib -L/opt/homebrew/lib/ -framework IOKit -framework Foundation")
if (CMAKE_SYSTEM_PROCESSOR MATCHES "arm64")
include_directories("/opt/homebrew/include")
set(CMAKE_EXE_LINKER_FLAGS "-L/opt/homebrew/lib -framework IOKit -framework Foundation -liconv")
else ()
set(CMAKE_EXE_LINKER_FLAGS "-L/usr/local/lib external/libguisan/dylib/libguisan.dylib -framework IOKit -framework Foundation")
include_directories("/usr/local/include")
set(CMAKE_EXE_LINKER_FLAGS "-L/usr/local/lib -framework IOKit -framework Foundation -liconv")
endif ()
endif ()

add_executable(${PROJECT_NAME}
# Define the list of source files
set(SOURCE_FILES
src/a2065.cpp
src/a2091.cpp
src/akiko.cpp
Expand Down Expand Up @@ -329,10 +311,19 @@ add_executable(${PROJECT_NAME}
src/cpuemu_44.cpp
)

target_compile_options(${PROJECT_NAME} PRIVATE -fno-pie)
if (APPLE)
add_executable(${PROJECT_NAME} MACOSX_BUNDLE ${SOURCE_FILES})
set_target_properties(${PROJECT_NAME} PROPERTIES
MACOSX_BUNDLE TRUE
MACOSX_BUNDLE_INFO_PLIST ${CMAKE_SOURCE_DIR}/Info.plist
)
else ()
add_executable(${PROJECT_NAME} ${SOURCE_FILES})
endif()

target_compile_definitions(${PROJECT_NAME} PRIVATE _FILE_OFFSET_BITS=64)

if (CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64" OR ARCHITECTURE MATCHES "arm64")
if (CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "arm64")
target_compile_definitions(${PROJECT_NAME} PRIVATE CPU_AARCH64)
target_sources(${PROJECT_NAME} PRIVATE
src/osdep/aarch64_helper.s
Expand All @@ -343,7 +334,7 @@ if (CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64" OR ARCHITECTURE MATCHES "arm64")
)
endif ()

if (CMAKE_SYSTEM_PROCESSOR MATCHES "arm" OR ARCHITECTURE MATCHES "arm32")
if (CMAKE_SYSTEM_PROCESSOR MATCHES "arm")
target_compile_definitions(${PROJECT_NAME} PRIVATE CPU_arm ARMV6_ASSEMBLY ARMV6T2 USE_ARMNEON ARM_HAS_DIV)
target_sources(${PROJECT_NAME} PRIVATE
src/osdep/neon_helper.s
Expand All @@ -354,9 +345,10 @@ if (CMAKE_SYSTEM_PROCESSOR MATCHES "arm" OR ARCHITECTURE MATCHES "arm32")
)
endif ()

find_package(SDL2 REQUIRED CONFIG REQUIRED COMPONENTS SDL2)
find_package(SDL2_image REQUIRED)
find_package(SDL2_ttf REQUIRED)
find_package(SDL2 CONFIG REQUIRED)
find_package(SDL2_image MODULE REQUIRED)
find_package(SDL2_ttf MODULE REQUIRED)
include_directories(${SDL2_INCLUDE_DIR} ${SDL2_IMAGE_INCLUDE_DIR} ${SDL2_TTF_INCLUDE_DIR})

if (USE_GPIOD)
target_compile_definitions(${PROJECT_NAME} PRIVATE USE_GPIOD)
Expand Down Expand Up @@ -389,9 +381,8 @@ add_subdirectory(external/libguisan)
# Add dependencies to ensure external libraries are built
add_dependencies(${PROJECT_NAME} mt32emu floppybridge capsimage guisan)

target_include_directories(${PROJECT_NAME} PRIVATE ${SDL2_INCLUDE_DIRS} src src/osdep src/include src/threaddep src/archivers external/libguisan/include external/mt32emu/src external/floppybridge/src)
target_link_libraries(${PROJECT_NAME} PRIVATE SDL2 SDL2_image SDL2_ttf guisan mt32emu ${DBUS_LIBRARIES} FLAC portmidi png mpg123 mpeg2convert mpeg2 serialport z)
target_link_options(${PROJECT_NAME} PRIVATE "LINKER:-as-needed,-no-pie")
target_include_directories(${PROJECT_NAME} PRIVATE src src/osdep src/include src/threaddep src/archivers src/ppc/pearpc external/libguisan/include external/mt32emu/src external/floppybridge/src)
target_link_libraries(${PROJECT_NAME} PRIVATE SDL2 SDL2_image SDL2_ttf guisan mt32emu ${DBUS_LIBRARIES} FLAC portmidi png MPG123::libmpg123 mpeg2convert mpeg2 serialport z pthread dl)

if (USE_OPENGL)
target_compile_definitions(${PROJECT_NAME} PRIVATE USE_OPENGL)
Expand Down Expand Up @@ -453,58 +444,93 @@ add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
DEPENDS external/capsimage)

# Install the executable
install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin)
if (APPLE)
install(TARGETS ${PROJECT_NAME} BUNDLE DESTINATION .)
else ()
install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin)
# Install additional directories
install(DIRECTORY ${CMAKE_SOURCE_DIR}/cdroms
DESTINATION share/${PROJECT_NAME}
)
install(DIRECTORY ${CMAKE_SOURCE_DIR}/conf
DESTINATION share/${PROJECT_NAME}
)
install(DIRECTORY ${CMAKE_SOURCE_DIR}/controllers
DESTINATION share/${PROJECT_NAME}
)
install(DIRECTORY ${CMAKE_SOURCE_DIR}/data
DESTINATION share/${PROJECT_NAME}
)
install(DIRECTORY ${CMAKE_SOURCE_DIR}/floppies
DESTINATION share/${PROJECT_NAME}
)
install(DIRECTORY ${CMAKE_SOURCE_DIR}/harddrives
DESTINATION share/${PROJECT_NAME}
)
install(DIRECTORY ${CMAKE_SOURCE_DIR}/inputrecordings
DESTINATION share/${PROJECT_NAME}
)
install(DIRECTORY ${CMAKE_SOURCE_DIR}/kickstarts
DESTINATION share/${PROJECT_NAME}
)
install(DIRECTORY ${CMAKE_SOURCE_DIR}/lha
DESTINATION share/${PROJECT_NAME}
)
install(DIRECTORY ${CMAKE_SOURCE_DIR}/nvram
DESTINATION share/${PROJECT_NAME}
)
install(DIRECTORY ${CMAKE_SOURCE_DIR}/plugins
DESTINATION share/${PROJECT_NAME}
)
install(DIRECTORY ${CMAKE_SOURCE_DIR}/savestates
DESTINATION share/${PROJECT_NAME}
)
install(DIRECTORY ${CMAKE_SOURCE_DIR}/screenshots
DESTINATION share/${PROJECT_NAME}
)
install(DIRECTORY ${CMAKE_SOURCE_DIR}/whdboot
DESTINATION share/${PROJECT_NAME}
)

# Install additional directories
install(DIRECTORY ${CMAKE_SOURCE_DIR}/cdroms
DESTINATION share/${PROJECT_NAME}/cdroms
)
install(DIRECTORY ${CMAKE_SOURCE_DIR}/conf
DESTINATION share/${PROJECT_NAME}/conf
)
install(DIRECTORY ${CMAKE_SOURCE_DIR}/controllers
DESTINATION share/${PROJECT_NAME}/controllers
)
install(DIRECTORY ${CMAKE_SOURCE_DIR}/data
DESTINATION share/${PROJECT_NAME}/data
)
install(DIRECTORY ${CMAKE_SOURCE_DIR}/floppies
DESTINATION share/${PROJECT_NAME}/floppies
)
install(DIRECTORY ${CMAKE_SOURCE_DIR}/harddrives
DESTINATION share/${PROJECT_NAME}/harddrives
)
install(DIRECTORY ${CMAKE_SOURCE_DIR}/inputrecordings
DESTINATION share/${PROJECT_NAME}/inputrecordings
)
install(DIRECTORY ${CMAKE_SOURCE_DIR}/kickstarts
DESTINATION share/${PROJECT_NAME}/kickstarts
)
install(DIRECTORY ${CMAKE_SOURCE_DIR}/lha
DESTINATION share/${PROJECT_NAME}/lha
)
install(DIRECTORY ${CMAKE_SOURCE_DIR}/nvram
DESTINATION share/${PROJECT_NAME}/nvram
)
install(DIRECTORY ${CMAKE_SOURCE_DIR}/plugins
DESTINATION share/${PROJECT_NAME}/plugins
)
install(DIRECTORY ${CMAKE_SOURCE_DIR}/savestates
DESTINATION share/${PROJECT_NAME}/savestates
)
install(DIRECTORY ${CMAKE_SOURCE_DIR}/screenshots
DESTINATION share/${PROJECT_NAME}/screenshots
)
install(DIRECTORY ${CMAKE_SOURCE_DIR}/whdboot
DESTINATION share/${PROJECT_NAME}/whdboot
)
# Install shared libraries
install(FILES ${CMAKE_BINARY_DIR}/external/floppybridge/libfloppybridge.so
DESTINATION share/${PROJECT_NAME}/plugins
)
install(FILES ${CMAKE_BINARY_DIR}/external/capsimage/libcapsimage.so
DESTINATION share/${PROJECT_NAME}/plugins
)

# Install shared libraries
install(FILES ${CMAKE_BINARY_DIR}/external/floppybridge/libfloppybridge.so
DESTINATION share/${PROJECT_NAME}/plugins
)
install(FILES ${CMAKE_BINARY_DIR}/external/capsimage/libcapsimage.so
DESTINATION share/${PROJECT_NAME}/plugins
)
# Install desktop file
install(FILES ${CMAKE_SOURCE_DIR}/data/Amiberry.desktop
DESTINATION share/applications
)
endif ()

include(InstallRequiredSystemLibraries)

if(APPLE)
set(CPACK_GENERATOR "Bundle")
set(CPACK_BUNDLE_NAME "Amiberry")
set(CPACK_BUNDLE_PLIST ${CMAKE_SOURCE_DIR}/Info.plist)
set(CPACK_BUNDLE_APPLE_ENTITLEMENTS ${CMAKE_SOURCE_DIR}/Entitlements.plist)
set(CPACK_BUNDLE_ICON ${CMAKE_SOURCE_DIR}/data/amiberry.png)
else()
set(CPACK_GENERATOR "DEB")
set(CPACK_SOURCE_IGNORE_FILES .git/ .github/ .vscode/ _CPack_Packages/)
SET(CPACK_PACKAGE_NAME ${CMAKE_PROJECT_NAME})
SET(CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR})
SET(CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR})
SET(CPACK_PACKAGE_VERSION_PATCH ${PROJECT_VERSION_PATCH})
SET(CPACK_PACKAGE_VENDOR "BlitterStudio")
SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE")
SET(CPACK_RESOURCE_FILE_README "${CMAKE_SOURCE_DIR}/docs/README.md")
SET(CPACK_DEBIAN_PACKAGE_NAME ${CMAKE_PROJECT_NAME})
set(CPACK_DEBIAN_PACKAGE_HOMEPAGE "https://amiberry.com")
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Dimitris Panokostas <[email protected]>") # Required
set(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6 (>= 2.27), libstdc++6 (>= 8.3.0), libsdl2-2.0-0, libsdl2-image-2.0-0, libsdl2-ttf-2.0-0, flac, libmpg123-0, libpng16-16, zlib1g, libserialport0, libportmidi0, libmpeg2-4") # Adjust dependencies as needed
set(CPACK_DEBIAN_PACKAGE_DESCRIPTION "Amiberry-Lite is an optimized Amiga emulator various platforms.")
set(CPACK_DEBIAN_PACKAGE_SECTION "games")
set(CPACK_DEBIAN_FILE_NAME "DEB-DEFAULT")
endif()

include(CPack)
include(CPack)
13 changes: 7 additions & 6 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ CPPFLAGS = -MD -MT $@ -MF $(@:%.o=%.d) $(SDL_CFLAGS) -Iexternal/libguisan/includ
CFLAGS=-pipe -Wno-shift-overflow -Wno-narrowing -fno-pie

LDFLAGS = $(SDL_LDFLAGS) -lSDL2_image -lSDL2_ttf -lserialport -lportmidi -lguisan -Lexternal/libguisan/lib -lmt32emu -Lexternal/mt32emu
LDFLAGS += -Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed -lpthread -lz -lpng -lrt -lFLAC -lmpg123 -ldl -lmpeg2convert -lmpeg2 -lstdc++fs -no-pie
LDFLAGS += -Wl,-O1 -lpthread -lz -lpng -lFLAC -lmpg123 -ldl -lmpeg2convert -lmpeg2 -no-pie

ifdef USE_OPENGL
CFLAGS += -DUSE_OPENGL
Expand Down Expand Up @@ -76,7 +76,7 @@ endif
ifndef DEBUG
CFLAGS += -O3
else
CFLAGS += -g -rdynamic -funwind-tables -DDEBUG -Wl,--export-dynamic
CFLAGS += -g -rdynamic -funwind-tables -DDEBUG
endif

ifdef USE_OLDGCC
Expand Down Expand Up @@ -239,16 +239,17 @@ else ifeq ($(PLATFORM),oga)

# macOS Apple Silicon (SDL2, 64-bit, Apple Silicon)
else ifeq ($(PLATFORM),osx-m1)
LDFLAGS = -L/usr/local/lib external/libguisan/dylib/libguisan.dylib -Lexternal/mt32emu -lSDL2_image -lSDL2_ttf -lpng -liconv -lz -lFLAC -L/opt/homebrew/lib/ -lmpg123 -lmpeg2 -lmpeg2convert -lserialport -lportmidi -lmt32emu $(SDL_LDFLAGS) -framework IOKit -framework Foundation
CPPFLAGS = -MD -MT $@ -MF $(@:%.o=%.d) $(SDL_CFLAGS) -I/opt/homebrew/include -Iexternal/libguisan/include -Isrc -Isrc/osdep -Isrc/threaddep -Isrc/include -Isrc/archivers -Iexternal/floppybridge/src -Iexternal/mt32emu/src -D_FILE_OFFSET_BITS=64 -DCPU_AARCH64 $(SDL_CFLAGS)
LDFLAGS += -L/opt/homebrew/lib/ -framework IOKit -framework Foundation -liconv
CPPFLAGS += $(CPPFLAGS64)
CPPFLAGS += -I/opt/homebrew/include
CXX=/usr/bin/c++
# DEBUG=1
APPBUNDLE=1

# macOS intel (SDL2, 64-bit, x86-64)
else ifeq ($(PLATFORM),osx-x86)
LDFLAGS = -L/usr/local/lib external/libguisan/dylib/libguisan.dylib -Lexternal/mt32emu -lSDL2_image -lSDL2_ttf -lpng -liconv -lz -lFLAC -lmpg123 -lmpeg2 -lmpeg2convert -lserialport -lportmidi -lmt32emu $(SDL_LDFLAGS) -framework IOKit -framework Foundation
CPPFLAGS = -MD -MT $@ -MF $(@:%.o=%.d) $(SDL_CFLAGS) -I/usr/local/include -Iexternal/libguisan/include -Isrc -Isrc/osdep -Isrc/threaddep -Isrc/include -Isrc/archivers -Iexternal/floppybridge/src -Iexternal/mt32emu/src -D_FILE_OFFSET_BITS=64 $(SDL_CFLAGS)
LDFLAGS += -L/usr/local/lib -framework IOKit -framework Foundation -liconv
CPPFLAGS += -I/usr/local/include
CXX=/usr/bin/c++
# DEBUG=1
APPBUNDLE=1
Expand Down
Loading

0 comments on commit 369f32b

Please sign in to comment.