CMakelists.txt смехотворно сложен, чтобы заставить работать windows и mac, есть ли лучший способ? - PullRequest
1 голос
/ 25 сентября 2011

Я собирал CMakeLists.txt вместе, чтобы скомпилировать то, что сейчас является образцом SFML, в процессе подготовки к созданию моего собственного исходного кода. Это похоже на взлом, хотя он работает (Mac Makefile, VS nmake, VS решение) прямо сейчас.

Основной репозиторий на https://github.com/iaefai/Spider-Fish/

Любые предложения приветствуются.

cmake_minimum_required(VERSION 2.8)

PROJECT(Spider-Fish)

FIND_PACKAGE(OpenGL REQUIRED)
FIND_PACKAGE(SFML REQUIRED)


IF (WIN32)
    # Windows

    link_directories(${SFML_INCLUDE_DIR}/../lib)

    set(RESOURCE_HANDLER ${CMAKE_CURRENT_SOURCE_DIR}/src/windows/resources.cpp)
#   link_directories(${FIND_SFML_LIB_PATHS})

ELSEIF(APPLE)
        # Mac
        SET(RESOURCE_HANDLER ${CMAKE_CURRENT_SOURCE_DIR}/src/mac/resources.mm)
        SET(MACOSX_BUNDLE_GUI_IDENTIFER "com.iaefai.Spider-Fish")
        SET(MACOSX_BUNDLE_BUNDLE_NAME ${PROJECT_NAME})
        if (NOT CMAKE_OSX_ARCHITECTURES)
            set(CMAKE_OSX_ARCHITECTURES "i386;x86_64"
                CACHE STRING "Build architectures for OSX" FORCE)
        endif()

        if(EXISTS /Developer/SDKs/MacOSX10.7.sdk)
            set(CMAKE_OSX_SYSROOT "/Developer/SDKs/MacOSX10.7.sdk"
                CACHE STRING "Defaults to 10.7" FORCE)
        else()
            # use default SDK
        endif()           

        find_library(COCOA_LIB  Cocoa)

        SET(EXTRA_LIBS ${COCOA_LIB} ${OPENGL_LIBRARIES})
ELSE()
        # Linux // Assumed??
ENDIF()

#include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include})

include_directories(${SFML_INCLUDE_DIR})

SET(RESOURCES   ${CMAKE_CURRENT_SOURCE_DIR}/assets/background.jpg 
                ${CMAKE_CURRENT_SOURCE_DIR}/assets/blur.sfx
                ${CMAKE_CURRENT_SOURCE_DIR}/assets/colorize.sfx
                ${CMAKE_CURRENT_SOURCE_DIR}/assets/edge.sfx
                ${CMAKE_CURRENT_SOURCE_DIR}/assets/fisheye.sfx
                ${CMAKE_CURRENT_SOURCE_DIR}/assets/nothing.sfx
                ${CMAKE_CURRENT_SOURCE_DIR}/assets/pixelate.sfx
                ${CMAKE_CURRENT_SOURCE_DIR}/assets/sansation.ttf
                ${CMAKE_CURRENT_SOURCE_DIR}/assets/sprite.png
                ${CMAKE_CURRENT_SOURCE_DIR}/assets/wave.jpg
                ${CMAKE_CURRENT_SOURCE_DIR}/assets/wave.sfx)


SET (SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/Shader.cpp)
#SET (HEADERS include/resources.h)


add_executable(${PROJECT_NAME} ${SOURCES} ${RESOURCE_HANDLER})

Самым большим взломом, похоже, является копирование ресурсов. Это было бы идеально, если бы у нас была специальная команда, которая могла бы делать это на мультиплатформе. Не совсем уверен, как это сделать - я подозреваю, что set_target_resources будет хорошим именем.

IF (APPLE)

    set_target_properties(${PROJECT_NAME} 
        PROPERTIES
            MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/src/mac/Spider-Fish-Info.plist
            MACOSX_BUNDLE  TRUE)      

#    add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
    add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD 
        COMMAND echo copying resources... 
        #${RESOURCES}
        COMMAND mkdir -p ./${PROJECT_NAME}.app/Contents/Resources
        COMMAND cp ${RESOURCES} ./${PROJECT_NAME}.app/Contents/Resources                
    )
#    add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND echo ${PROJECT_NAME}.app/Contents/Resources)


ENDIF (APPLE)

IF (WIN32)
    set_target_properties(${PROJECT_NAME}
        PROPERTIES
            WIN32_EXECUTABLE FALSE)

Я бы побеспокоился об этом пользовательском материале для окон из-за того, насколько специализированным он становится.

    set(EXTRA_LIBS sfml-main ${OPENGL_LIBRARIES})
    # note we can add stuff to ADDITIONAL_MAKE_CLEAN_FILES 
    string(COMPARE EQUAL ${CMAKE_GENERATOR} "NMake Makefiles" NMAKE)
    if (NMAKE)
        add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
            COMMAND echo copying dlls...
            COMMAND copy ${SFML_INCLUDE_DIR}\\..\\bin\\*.dll .
            COMMAND echo copying resources... from ${CMAKE_CURRENT_SOURCE_DIR}
            COMMAND -mkdir resources 
            COMMAND copy \"${CMAKE_CURRENT_SOURCE_DIR}\\assets\\*.*\" resources)
    else ()
        add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
            COMMAND echo copying dlls...
            COMMAND copy ${SFML_INCLUDE_DIR}\\..\\bin\\*.dll .
            COMMAND echo copying resources... from ${CMAKE_CURRENT_SOURCE_DIR}
            # Visual Studio does not support the '-' to ignore errors
            COMMAND rmdir /s /q resources
            COMMAND mkdir resources 
            COMMAND copy \"${CMAKE_CURRENT_SOURCE_DIR}\\assets\\*.*\" resources)
    endif (NMAKE)
ENDIF (WIN32)

#if (APPLE)
target_link_libraries(${PROJECT_NAME} 
    sfml-system 
    sfml-window
    sfml-network
    sfml-graphics
    sfml-audio
    ${EXTRA_LIBS})
#endif (APPLE)

1 Ответ

2 голосов
/ 26 сентября 2011

Вы пытались использовать команду INSTALL вместо пользовательских шагов после сборки.

...