This commit contains all the changes to the CMake build system required to generate a valid Visual Studio 2017 solution and projects for MuseScore.

In detail, changes are as follows:
- Changed .gitignore to ignore VS-specific files and directories.
- VS uses a global settings file for the CMake build process: CMakeSettings.json. This is a text file, which is conceptually equivalent to the Makefile used to invoke CMake through Make. This file might need to be changed on an individual user basis, if dependencies are not installed in default paths.
- New cmake macros to copy files in build\CopyFilesMacros.cmake. The code is from https://cmake.org/pipermail/cmake/2009-March/027892.html
- Pre-compiled headers: Visual Studio requires to create pre-compiled headers per-project (a general per-solution PCH file, although possible, is extremely problematic and not recommended). Therefore, the  new macro vstudio_pch in CreatePrecompiledHeader.cmake was created to add the pre-compiled header creation step to an existing target (similar to what is done for XCode). The existing macro precompiled_header was modified to set the values for a group of variables. As part of this, the empty file all.cpp was added to the root of the source tree, as VS requires a source file to create pre-compiled headers (the header file alone can not be compiled).
- all.h is not copied to binary dir for MSVC, as I could determine no need to do this. Because of this, and the differences in PCH handling, the pseudo-targets mops1 and mops2 are not created for MSVC.
- Revised all steps conditional on toolchain, and added MSVC paths as needed. In many instances, the MSVC path is the same as the MINGW path, but not always.
- The manual (genManual) target used the getopt() functionality defined in POSIX libraries, which is not available on Windows. An LGPL'd port of getopt() for Windows was added in manual\getopt. The original source is in GitHub: nanoporetech/getopt-win32, based on a CodeProject article: https://www.codeproject.com/KB/cpp/getopt4win.aspx?msg=3987371. The corresponding CMakeLists.txt file was modified to include this files when compiling with MSVC.
- Changes in CMakeLists.txt files to create valid MSVC targets. The changes, always conditional on the MSVC toolchain, consist of:
     x Setting target properties for MSVC
     x Using all.h in source dir
     x Adding pre-compiled headers to target
     x Removing dependency from mops1 and mops2

Notes:
- The INSTALL target has NOT BEEN UPDATED for MSVC.
This commit is contained in:
Andres Fernandez de Prado 2018-05-01 12:48:42 -03:00 committed by alexandr
parent 8366ff1e43
commit 188386ba2e
37 changed files with 2333 additions and 285 deletions

3
.gitignore vendored
View file

@ -34,6 +34,8 @@ vtest/LOG
vtest/META-INF
vtest/Thumbnails
vtest/Pictures
.vs
dependencies
# Downloaded files during build process
MS_General.sf3
@ -43,3 +45,4 @@ MuseScore_General.sf3
MuseScore_General-License.md
MuseScore_General-changelog.txt
VERSION
/mscore/data/mscore.aps

View file

@ -55,6 +55,11 @@ if(POLICY CMP0071)
cmake_policy(SET CMP0071 OLD)
endif(POLICY CMP0071)
# Define MINGW for VS, as it appears not to be defined
if (MSVC)
set (MINGW false)
endif (MSVC)
# Look for Qt5
SET(QT_MIN_VERSION "5.8.0")
# Include modules
@ -74,6 +79,11 @@ set(USE_SSE TRUE)
set(SCRIPT_INTERFACE TRUE)
# Disable components not supported on Windows
if (MSVC)
set(WIN_NOT_AVAIL "Not available on Windows")
option(BUILD_PULSEAUDIO ${WIN_NOT_AVAIL} OFF)
option(BUILD_ALSA ${WIN_NOT_AVAIL} OFF)
endif (MSVC)
if (MINGW)
set(WIN_NOT_AVAIL "Not available on Windows")
option(BUILD_PULSEAUDIO ${WIN_NOT_AVAIL} OFF)
@ -88,10 +98,10 @@ if (APPLE)
endif (APPLE)
# Disable components not supported on Linux/BSD
if (NOT APPLE AND NOT MINGW)
if (NOT APPLE AND NOT MINGW AND NOT MSVC)
set(NIX_NOT_AVAIL "Not available on Linux/BSD")
#option(BUILD_PORTMIDI "PortMidi disabled on Linux. (It uses ALSA but it's better to use ALSA directly)" OFF)
endif (NOT APPLE AND NOT MINGW)
endif (NOT APPLE AND NOT MINGW AND NOT MSVC)
option(AEOLUS "Enable pipe organ synthesizer" OFF)
option(ZERBERUS "Enable experimental SFZ sampler" ON)
@ -155,8 +165,10 @@ if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU")
endif()
endif ("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU")
set(CMAKE_CXX_FLAGS_DEBUG "-g")
set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG -DQT_NO_DEBUG")
if (NOT MSVC)
set(CMAKE_CXX_FLAGS_DEBUG "-g")
set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG -DQT_NO_DEBUG")
endif (NOT MSVC)
if (APPLE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fPIC -stdlib=libc++ -Wno-inconsistent-missing-override")
@ -165,16 +177,29 @@ if (APPLE)
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
SET(CMAKE_INSTALL_RPATH "${QT_INSTALL_PREFIX}/lib")
else (APPLE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
if (MINGW)
# -mno-ms-bitfields see #22048
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mno-ms-bitfields")
set(CMAKE_EXE_LINKER_FLAGS "-Wl,--large-address-aware")
else (MINGW)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall -Wextra -Woverloaded-virtual")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DQT_NO_DEBUG_OUTPUT")
endif (MINGW)
if (MSVC)
# Set compiler options for VS2017 toolchain.
# Note: /D_CRT_SECURE_NO WARNINGS disables warnings when using "non-secure" library functions like sscanf...
set(CMAKE_CXX_FLAGS "/DWIN32 /D_WINDOWS /GR /EHsc /D_UNICODE /DUNICODE /D_CRT_SECURE_NO_WARNINGS /execution-charset:utf-8")
if (USE_SSE)
# If USE_SSE is set, enable use of SSE instructions to compiler.
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:SSE")
endif (USE_SSE)
set(CMAKE_CXX_FLAGS_DEBUG "/MDd /permissive- /std:c++14 /W4 /Zi /Ob0 /Od /RTC1")
set(CMAKE_CXX_FLAGS_RELEASE "/MD /permissive- /std:c++14 /W4 /O2 /Ob2 -DNDEBUG -DQT_NO_DEBUG")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "/MD /permissive- /std:c++14 /W4 /Zi /O2 /Ob1 -DNDEBUG -DQT_NO_DEBUG")
else (MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
if (MINGW)
# -mno-ms-bitfields see #22048
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mno-ms-bitfields")
set(CMAKE_EXE_LINKER_FLAGS "-Wl,--large-address-aware")
else (MINGW)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall -Wextra -Woverloaded-virtual")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DQT_NO_DEBUG_OUTPUT")
endif (MINGW)
endif (MSVC)
endif(APPLE)
set(CMAKE_INCLUDE_CURRENT_DIR TRUE)
@ -201,18 +226,26 @@ if (MSCORE_UNSTABLE)
SET (MUSESCORE_NAME_VERSION "${MUSESCORE_NAME_VERSION} (${MUSESCORE_VERSION_FULL} unstable)")
endif (MSCORE_UNSTABLE)
if (MINGW OR APPLE)
if (MINGW OR MSVC OR APPLE)
if(MINGW)
# Option for MINGW
SET(Mscore_INSTALL_NAME "")
SET(Mscore_SHARE_NAME "./")
else(MINGW)
SET(Mscore_INSTALL_NAME "Contents/Resources/")
SET(Mscore_SHARE_NAME "mscore.app/")
if (MSVC)
# Option for MSVC
SET(Mscore_INSTALL_NAME "")
SET(Mscore_SHARE_NAME "./")
else (MSVC)
# Option for Apple
SET(Mscore_INSTALL_NAME "Contents/Resources/")
SET(Mscore_SHARE_NAME "mscore.app/")
endif (MSVC)
endif(MINGW)
else (MINGW OR APPLE)
else (MINGW OR MSVC OR APPLE)
SET(Mscore_INSTALL_NAME "mscore${MSCORE_INSTALL_SUFFIX}-${MUSESCORE_VERSION}/")
SET(Mscore_SHARE_NAME "share/")
endif (MINGW OR APPLE)
endif (MINGW OR MSVC OR APPLE)
# Download MuseScore SoundFont
if (DOWNLOAD_SOUNDFONT)
@ -301,13 +334,13 @@ endif (BUILD_ALSA)
## MIDI
##
if (APPLE OR MINGW)
if (APPLE OR MINGW OR MSVC)
set (HAS_MIDI 1)
else (APPLE OR MINGW)
else (APPLE OR MINGW OR MSVC)
if (USE_ALSA)
set (HAS_MIDI 1)
endif (USE_ALSA)
endif (APPLE OR MINGW)
endif (APPLE OR MINGW OR MSVC)
##
## PulseAudio
@ -327,12 +360,12 @@ endif (BUILD_PULSEAUDIO)
##
## LAME
##
if (APPLE OR MINGW)
if (APPLE OR MINGW OR MSVC)
IF (BUILD_LAME)
include (FindLame)
set (USE_LAME 1)
ENDIF (BUILD_LAME)
else (APPLE OR MINGW)
else (APPLE OR MINGW OR MSVC)
IF (BUILD_LAME)
include (FindLame)
IF (LAME_FOUND)
@ -345,14 +378,14 @@ else (APPLE OR MINGW)
ELSE (BUILD_LAME)
MESSAGE(STATUS "LAME MP3 support disabled")
ENDIF (BUILD_LAME)
endif (APPLE OR MINGW)
endif (APPLE OR MINGW OR MSVC)
##
## Find JACK >= JACK_MIN_VERSION
##
IF(BUILD_JACK)
IF(MINGW)
IF(MINGW OR MSVC)
set (USE_JACK 1)
IF("$ENV{PROCESSOR_ARCHITEW6432}" STREQUAL "")
IF("$ENV{PROCESSOR_ARCHITECTURE}" STREQUAL "x86")
@ -374,7 +407,7 @@ IF(BUILD_JACK)
set (JACK_INCDIR "$ENV{${progenv}}/Jack/includes")
set (JACK_LIB "$ENV{${progenv}}/Jack/lib/libjack.a")
MESSAGE("JACK support enabled.")
ELSE(MINGW)
ELSE(MINGW OR MSVC)
PKGCONFIG1 (jack ${JACK_MIN_VERSION} JACK_INCDIR JACK_LIBDIR JACK_LIB JACK_CPP)
IF(JACK_INCDIR)
MESSAGE(STATUS "${JACK_LONGNAME} >= ${JACK_MIN_VERSION} found. jack support enabled.")
@ -383,7 +416,7 @@ IF(BUILD_JACK)
MESSAGE(STATUS "${JACK_LONGNAME} >= ${JACK_MIN_VERSION} not found")
MESSAGE(SEND_ERROR "Error: JACK support requested (BUILD_JACK=${BUILD_JACK}), but JACK was not found")
ENDIF(JACK_INCDIR)
ENDIF(MINGW)
ENDIF(MINGW OR MSVC)
ELSE(BUILD_JACK)
MESSAGE(STATUS "${JACK_LONGNAME} support disabled")
ENDIF(BUILD_JACK)
@ -394,9 +427,9 @@ ENDIF(BUILD_JACK)
##
if (BUILD_PORTAUDIO)
if (MINGW)
if (MINGW OR MSVC)
set ( USE_PORTAUDIO 1 )
else (MINGW)
else (MINGW OR MSVC)
PKGCONFIG1 (portaudio-2.0 19 PORTAUDIO_INCDIR PORTAUDIO_LIBDIR PORTAUDIO_LIB PORTAUDIO_CPP)
if (PORTAUDIO_INCDIR)
message("PortAudio found. PortAudio support enabled. INCDIR ${PORTAUDIO_INCDIR}, LIBDIR ${PORTAUDIO_LIBDIR}, LIB ${PORTAUDIO_LIB}")
@ -404,7 +437,7 @@ if (BUILD_PORTAUDIO)
else (PORTAUDIO_INCDIR)
message(SEND_ERROR "Error: PortAudio support requested (BUILD_PORTAUDIO=${BUILD_PORTAUDIO}), but portaudio-2.0 version 19 was not found (package portaudio19-dev)")
endif (PORTAUDIO_INCDIR)
endif (MINGW)
endif (MINGW OR MSVC)
else (BUILD_PORTAUDIO)
message(STATUS "PortAudio support disabled")
endif (BUILD_PORTAUDIO)
@ -461,11 +494,11 @@ if (APPLE)
endif (SNDFILE_INCDIR)
endif(HAS_AUDIOFILE)
else(APPLE)
if(MINGW)
if(MINGW OR MSVC)
set(SNDFILE_LIB sndfile-1)
else(MINGW)
else(MINGW OR MSVC)
set(SNDFILE_LIB sndfile)
endif(MINGW)
endif(MINGW OR MSVC)
set(OGG_LIB ogg)
set(VORBIS_LIB vorbis)
endif(APPLE)
@ -491,7 +524,7 @@ configure_file (
${PROJECT_BINARY_DIR}/config.h
)
if (NOT MINGW AND NOT APPLE)
if (NOT MINGW AND NOT MSVC AND NOT APPLE)
#### PACKAGING for Linux and BSD based systems (more in mscore/CMakeLists.txt) ####
#
# set library search path for runtime linker to load the same
@ -587,22 +620,28 @@ if (NOT MINGW AND NOT APPLE)
configure_file(build/Linux+BSD/musescore.xml.in musescore${MSCORE_INSTALL_SUFFIX}.xml)
install( FILES ${PROJECT_BINARY_DIR}/musescore${MSCORE_INSTALL_SUFFIX}.xml DESTINATION share/mime/packages COMPONENT doc)
# Note: Must now run "update-mime-database" to apply changes. This is done in the Makefile.
endif (NOT MINGW AND NOT APPLE)
endif (NOT MINGW AND NOT MSVC AND NOT APPLE)
#
# Create precompiled header file
#
# all.h is expected in PROJECT_BINARY_DIR by subdirs
execute_process(
COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/all.h ${PROJECT_BINARY_DIR}/all.h
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
)
# all.h is expected in PROJECT_BINARY_DIR by subdirs, except for MSVC
if (NOT MSVC)
execute_process(
COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/all.h ${PROJECT_BINARY_DIR}/all.h
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
)
endif (NOT MSVC)
precompiled_header(QT_INCLUDES all ${BUILD_PCH})
ADD_CUSTOM_TARGET(mops1 DEPENDS ${PROJECT_BINARY_DIR}/all.h)
ADD_CUSTOM_TARGET(mops2 DEPENDS ${PCH})
# MSVC does not require these targets, as all.h is not copied and the
# PCH generation is done per-project
if (NOT MSVC)
ADD_CUSTOM_TARGET(mops1 DEPENDS ${PROJECT_BINARY_DIR}/all.h)
ADD_CUSTOM_TARGET(mops2 DEPENDS ${PCH})
endif (NOT MSVC)
##
## Add subdirs
@ -628,9 +667,9 @@ add_subdirectory(fonttools EXCLUDE_FROM_ALL)
add_subdirectory(manual)
add_subdirectory(demos)
if (USE_PORTMIDI AND (MINGW OR APPLE))
if (USE_PORTMIDI AND (MINGW OR APPLE OR MSVC))
subdirs (thirdparty/portmidi)
endif (USE_PORTMIDI AND (MINGW OR APPLE))
endif (USE_PORTMIDI AND (MINGW OR APPLE OR MSVC))
if (AEOLUS)
subdirs (aeolus)
@ -714,3 +753,24 @@ add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/plugins
COMMAND genManual ${PROJECT_SOURCE_DIR} ${PROJECT_BINARY_DIR}
DEPENDS genManual
)
##
## For MSVC: set the startup project to be mscore
## (requires CMake 3.6.3+ to work, but should be benign on other versions
## as it is just setting the value for a property).
##
if (MSVC)
set(VS_STARTUP_PROJECT mscore)
endif (MSVC)
## TEMP: Display all variables!
### message(STATUS "===========================================================")
### message(STATUS "VARIABLES:")
### message(STATUS "")
### get_cmake_property(_variableNames VARIABLES)
### list (SORT _variableNames)
### foreach (_variableName ${_variableNames})
### message(STATUS "${_variableName}=${${_variableName}}")
### endforeach()
### message(STATUS "===========================================================")

121
CMakeSettings.json Normal file
View file

@ -0,0 +1,121 @@
{
// See https://go.microsoft.com//fwlink//?linkid=834763 for more information about this file.
"configurations": [
{
"name": "x86-Debug",
"generator": "Visual Studio 15 2017",
"configurationType": "Debug",
"inheritEnvironments": [ "msvc_x86" ],
"buildRoot": "${projectDir}\\build.debug", // "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\build\\${name}",
"installRoot": "${projectDir}\\win32install", // "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\install\\${name}",
"cmakeCommandArgs": "-Wno-deprecated -LA",
"variables": [
{
"name": "CMAKE_BUILD_TYPE",
"value": "DEBUG"
},
{
"name": "BUILD_FOR_WINSTORE",
"value": "OFF"
},
{
"name": "CMAKE_PREFIX_PATH",
"value": "C:\\Qt\\5.9.4\\msvc2015;${projectDir}\\dependencies"
},
{
"name": "CMAKE_LIBRARY_PATH",
"value": "${projectDir}\\dependencies\\libx86;${projectDir}\\dependencies\\zlib\\x86\\static\\Release"
}
],
"buildCommandArgs": "-v",
"ctestCommandArgs": ""
},
{
"name": "x86-Release",
"generator": "Visual Studio 15 2017",
"configurationType": "RelWithDebInfo",
"inheritEnvironments": [ "msvc_x86" ],
"buildRoot": "${projectDir}\\build.release", // "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\build\\${name}",
"installRoot": "${projectDir}\\win32install", // "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\install\\${name}",
"cmakeCommandArgs": "-Wno-deprecated",
"variables": [
{
"name": "CMAKE_BUILD_TYPE",
"value": "RELEASE"
},
{
"name": "BUILD_FOR_WINSTORE",
"value": "OFF"
},
{
"name": "CMAKE_PREFIX_PATH",
"value": "C:\\Qt\\5.9.4\\msvc2015;${projectDir}\\dependencies"
},
{
"name": "CMAKE_LIBRARY_PATH",
"value": "${projectDir}\\dependencies\\libx86;${projectDir}\\dependencies\\zlib\\x86\\static\\Release"
}
],
"buildCommandArgs": "-v",
"ctestCommandArgs": ""
},
{
"name": "x64-Debug",
"generator": "Visual Studio 15 2017 Win64",
"configurationType": "Debug",
"inheritEnvironments": [ "msvc_x64_x64" ],
"buildRoot": "${projectDir}\\build.debug64", // "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\build\\${name}",
"installRoot": "${projectDir}\\win64install", // "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\install\\${name}",
"cmakeCommandArgs": "-Wno-deprecated",
"variables": [
{
"name": "CMAKE_BUILD_TYPE",
"value": "DEBUG"
},
{
"name": "BUILD_FOR_WINSTORE",
"value": "OFF"
},
{
"name": "CMAKE_PREFIX_PATH",
"value": "C:\\Qt\\5.9.4\\msvc2017_64;${projectDir}\\dependencies"
},
{
"name": "CMAKE_LIBRARY_PATH",
"value": "${projectDir}\\dependencies\\libx64;${projectDir}\\dependencies\\zlib\\x64\\static\\Release"
}
],
"buildCommandArgs": "-v",
"ctestCommandArgs": ""
},
{
"name": "x64-Release",
"generator": "Ninja",
"configurationType": "RelWithDebInfo",
"inheritEnvironments": [ "msvc_x64_x64" ],
"buildRoot": "${projectDir}\\build.release64", // "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\build\\${name}",
"installRoot": "${projectDir}\\win64install", // "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\install\\${name}",
"cmakeCommandArgs": "-Wno-deprecated",
"variables": [
{
"name": "CMAKE_BUILD_TYPE",
"value": "RELEASE"
},
{
"name": "BUILD_FOR_WINSTORE",
"value": "OFF"
},
{
"name": "CMAKE_PREFIX_PATH",
"value": "C:\\Qt\\5.9.4\\msvc2017_64;${projectDir}\\dependencies"
},
{
"name": "CMAKE_LIBRARY_PATH",
"value": "${projectDir}\\dependencies\\libx64;${projectDir}\\dependencies\\zlib\\x64\\static\\Release"
}
],
"buildCommandArgs": "-v",
"ctestCommandArgs": ""
}
]
}

View file

@ -40,11 +40,19 @@ add_library (aeolus STATIC
${INCS}
)
set_target_properties (
if (NOT MSVC)
set_target_properties (
aeolus
PROPERTIES
COMPILE_FLAGS "${PCH_INCLUDE} -g -Wall -Wextra -Winvalid-pch"
)
else (NOT MSVC)
set_target_properties (
aeolus
PROPERTIES
COMPILE_FLAGS "${PCH_INCLUDE} ${PCH_FORCE_USE}"
)
endif (NOT MSVC)
install(DIRECTORY
stops

24
all.cpp Normal file
View file

@ -0,0 +1,24 @@
//=============================================================================
// MusE
// Linux Music Score Editor
// $Id: allqt.h,v 1.24 2006/03/02 17:08:30 wschweer Exp $
//
// Copyright (C) 2004-2011 Werner Schweer (ws@seh.de)
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
//=============================================================================
// MSVC requires a cpp compilable file to create pre-compiled headers.
// No need to include all.h, as it is force-included.
// #include "all.h"

View file

@ -18,20 +18,41 @@ else (APPLE)
set(INCS "")
endif (APPLE)
if (NOT MSVC)
set(_all_h_file "${PROJECT_BINARY_DIR}/all.h")
else (NOT MSVC)
set(_all_h_file "${PROJECT_SOURCE_DIR}/all.h")
endif (NOT MSVC)
add_library (audiofile STATIC
${PROJECT_BINARY_DIR}/all.h
${_all_h_file}
${PCH}
audiofile.cpp
)
set_target_properties (
if (NOT MSVC)
set_target_properties (
audiofile
PROPERTIES
COMPILE_FLAGS "${PCH_INCLUDE} -g -Wall -Wextra -Winvalid-pch"
)
else (NOT MSVC)
set_target_properties (
audiofile
PROPERTIES
COMPILE_FLAGS "${PCH_INCLUDE}"
)
endif (NOT MSVC)
xcode_pch(audiofile all)
ADD_DEPENDENCIES(audiofile mops1)
ADD_DEPENDENCIES(audiofile mops2)
# Use MSVC pre-compiled headers
vstudio_pch( audiofile )
# MSVC does not depend on mops1 & mops2 for PCH
if (NOT MSVC)
ADD_DEPENDENCIES(audiofile mops1)
ADD_DEPENDENCIES(audiofile mops2)
endif (NOT MSVC)

View file

@ -20,6 +20,12 @@
include (${PROJECT_SOURCE_DIR}/build/gch.cmake)
if (NOT MSVC)
set(_all_h_file "${PROJECT_BINARY_DIR}/all.h")
else (NOT MSVC)
set(_all_h_file "${PROJECT_SOURCE_DIR}/all.h")
endif (NOT MSVC)
add_library (
awl STATIC
aslider.cpp
@ -40,19 +46,33 @@ add_library (
knob.h midipanknob.h mslider.h panknob.h pitchedit.h pitchlabel.h
poslabel.h slider.h utils.h volknob.h volslider.h
)
set_target_properties (
if (NOT MSVC)
set_target_properties (
awl
PROPERTIES
COMPILE_FLAGS "${PCH_INCLUDE} -g -Wall -Wextra -Winvalid-pch"
)
else (NOT MSVC)
set_target_properties (
awl
PROPERTIES
COMPILE_FLAGS "${PCH_INCLUDE}"
)
endif (NOT MSVC)
xcode_pch(awl all)
ADD_DEPENDENCIES(awl mops1 mops2)
# Use MSVC pre-compiled headers
vstudio_pch( awl )
# MSVC does not depend on mops1 & mops2 for PCH
if (NOT MSVC)
ADD_DEPENDENCIES(awl mops1 mops2)
endif (NOT MSVC)
add_library (
awlplugin SHARED
${PROJECT_BINARY_DIR}/all.h
${_all_h_file}
awlplugin.cpp
aslider.cpp
knob.cpp
@ -74,11 +94,20 @@ add_library (
#
# We cannot use our precompiled headers because of -fPIC
#
set_target_properties(awlplugin
if (NOT MSVC)
set_target_properties(awlplugin
PROPERTIES
COMPILE_FLAGS
"-fPIC -D_GNU_SOURCE -D_REENTRANT -DHAVE_CONFIG_H -DQT_PLUGIN -DQT_SHARED -DQT_NO_DEBUG -include ${PROJECT_SOURCE_DIR}/all.h"
)
else (NOT MSVC)
# x86 archictecture does not support position-independent code, the -fPIC option is not relevant for this processor.
set_target_properties (
awlplugin
PROPERTIES
COMPILE_FLAGS "${PCH_INCLUDE} -D_GNU_SOURCE -D_REENTRANT -DHAVE_CONFIG_H -DQT_PLUGIN -DQT_SHARED -DQT_NO_DEBUG"
)
endif (NOT MSVC)
# Don't install awlplugin on default
#install( TARGETS awlplugin DESTINATION ${designerPlugins}/plugins/designer/ )

View file

@ -0,0 +1,45 @@
# Code from: https://cmake.org/pipermail/cmake/2009-March/027892.html
MACRO(COPY_FILE_IF_CHANGED in_file out_file target)
IF(${in_file} IS_NEWER_THAN ${out_file})
# message("COpying file: ${in_file} to: ${out_file}")
ADD_CUSTOM_COMMAND (
TARGET ${target}
POST_BUILD
COMMAND ${CMAKE_COMMAND}
ARGS -E copy ${in_file} ${out_file}
)
ENDIF(${in_file} IS_NEWER_THAN ${out_file})
ENDMACRO(COPY_FILE_IF_CHANGED)
MACRO(COPY_FILE_INTO_DIRECTORY_IF_CHANGED in_file out_dir target)
GET_FILENAME_COMPONENT(file_name ${in_file} NAME)
COPY_FILE_IF_CHANGED(${in_file} ${out_dir}/${file_name}
${target})
ENDMACRO(COPY_FILE_INTO_DIRECTORY_IF_CHANGED)
#Copies all the files from in_file_list into the out_dir.
# sub-trees are ignored (files are stored in same out_dir)
MACRO(COPY_FILES_INTO_DIRECTORY_IF_CHANGED in_file_list out_dir target)
FOREACH(in_file ${in_file_list})
COPY_FILE_INTO_DIRECTORY_IF_CHANGED(${in_file}
${out_dir} ${target})
ENDFOREACH(in_file)
ENDMACRO(COPY_FILES_INTO_DIRECTORY_IF_CHANGED)
#Copy all files and directories in in_dir to out_dir.
# Subtrees remain intact.
MACRO(COPY_DIRECTORY_IF_CHANGED in_dir out_dir target)
#message("Copying directory ${in_dir}")
FILE(GLOB_RECURSE in_file_list ${in_dir}/*)
FOREACH(in_file ${in_file_list})
if(NOT ${in_file} MATCHES ".*/CVS.*")
STRING(REGEX REPLACE ${in_dir} ${out_dir} out_file
${in_file})
COPY_FILE_IF_CHANGED(${in_file} ${out_file} ${target})
endif(NOT ${in_file} MATCHES ".*/CVS.*")
ENDFOREACH(in_file)
ENDMACRO(COPY_DIRECTORY_IF_CHANGED)

View file

@ -29,20 +29,47 @@ macro( precompiled_header includes header_name build_pch)
# Prepare the compile flags var for passing to GCC
separate_arguments( compile_flags )
set (PCH_HEADER "${PROJECT_BINARY_DIR}/${header_name}.h")
set (PCH_INCLUDE "-include ${PCH_HEADER}")
if (NOT MSVC)
set (PCH_HEADER "${PROJECT_BINARY_DIR}/${header_name}.h")
set (PCH_INCLUDE "-include ${PCH_HEADER}")
else (NOT MSVC)
set (PCH_HEADERNAME "${header_name}")
set (PCH_HEADER "${PROJECT_SOURCE_DIR}/${header_name}.h")
set (PCH_INCLUDE "/FI${PCH_HEADER}")
set (PCH_CPP "${PROJECT_SOURCE_DIR}/${header_name}.cpp")
endif (NOT MSVC)
if( ${build_pch} )
set (PCH ${PROJECT_BINARY_DIR}/${header_name}.h.gch)
add_custom_command(
OUTPUT ${PROJECT_BINARY_DIR}/${header_name}.h.gch
COMMAND ${CMAKE_CXX_COMPILER} -x c++-header -g ${compile_flags} -o ${header_name}.h.gch ${header_name}.h
DEPENDS ${PROJECT_BINARY_DIR}/${header_name}.h
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
VERBATIM
)
if(NOT MSVC)
set (PCH ${PROJECT_BINARY_DIR}/${header_name}.h.gch)
add_custom_command(
OUTPUT ${PROJECT_BINARY_DIR}/${header_name}.h.gch
COMMAND ${CMAKE_CXX_COMPILER} -x c++-header -g ${compile_flags} -o ${header_name}.h.gch ${header_name}.h
DEPENDS ${PROJECT_BINARY_DIR}/${header_name}.h
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
VERBATIM
)
else (NOT MSVC)
SET (PCH "")
# For MSVC: instead of creating pre-compiled headers here, we just set variables, and create the PCH in another macro.
# NOTE: MSVC is picky about PCH: it is difficult to share them amongst different projects (almost impossible).
# By default, if a PCH file was created by another project, it gets deleted before attempting compilation.
# Best solution would be to create PCH-files per project (per subdir).list (REMOVE_DUPLICATES compile_flags)
# set (PCH ${PROJECT_BINARY_DIR}/${header_name}.pch)
# set (PCH_FORCE_USE "/Fp${PCH} /Yu${PCH_HEADER}")
# set (PCH_FORCE_USE "") # Temp -> do not use precompiled headers, not working right now!
#add_custom_command(
# OUTPUT ${PROJECT_BINARY_DIR}/${header_name}.pch
# COMMAND ${CMAKE_CXX_COMPILER} ${compile_flags} /c /Yc${header_name}.h /Fp${header_name}.pch ${header_name}.cpp
# DEPENDS ${PROJECT_BINARY_DIR}/${header_name}.h ${PROJECT_BINARY_DIR}/${header_name}.cpp
# WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
# VERBATIM
# )
endif (NOT MSVC)
else ( ${build_pch} )
message(STATUS "No precompiled header")
set (PCH_FORCE_USE "")
endif( ${build_pch} )
endif()
endmacro()
@ -60,3 +87,40 @@ macro( xcode_pch target_name header_name )
)
endif()
endmacro()
# VStudio PCH support. Has to be called *AFTER* the target is created.
# "target_name" - the target for which PCH are being added
# The header name needs not be specified, it must have been specified in the call to
# the precompiled_header() macro (sets the variables PCH_HEADERNAME, PCH_HEADER, PCH_INCLUDE, PCH_CPP)
# [[ "header_name" - the name of the PCH header, without the extension; "all" or something similar;
# note that *the source file compiling the header* needs to have the same name ]]
macro( vstudio_pch target_name )
if( MSVC )
# Prepare paths and filenames
message(STATUS "Preparing pre-compiled headers for ${target_name}")
set(_pch_path "${CMAKE_CURRENT_BINARY_DIR}/${target_name}_pch")
make_directory("${_pch_path}")
set(_pch_file "${_pch_path}/${PCH_HEADERNAME}.pch")
set(_pch_force_use "/Fp${_pch_file} /Yu${PCH_HEADER}")
# Set precompiled-header option for all files in the project
get_target_property(_flgs ${target_name} COMPILE_FLAGS)
set(_flgs "${_flgs} ${_pch_force_use}")
set_target_properties( ${target_name}
PROPERTIES
COMPILE_FLAGS "${_flgs}"
)
# Add the pre-compiled headers cpp file to the source and set properties to force pch creation
target_sources(
${target_name}
PUBLIC ${PCH_CPP}
)
set_source_files_properties(
${PCH_CPP}
PROPERTIES
COMPILE_FLAGS "/Yc"
)
endif( MSVC )
endmacro()

View file

@ -18,13 +18,13 @@ set(_components
LinguistTools
Help
)
if (NOT MINGW)
if (NOT MINGW AND NOT MSVC)
set(_components
${_components}
WebEngine
WebEngineCore
WebEngineWidgets)
endif()
endif(NOT MINGW AND NOT MSVC)
foreach(_component ${_components})
find_package(Qt5${_component})
list(APPEND QT_LIBRARIES ${Qt5${_component}_LIBRARIES})

View file

@ -9,7 +9,7 @@
# if pkg-config was NOT found or the specified software package doesn't exist, the
# variable will be empty when the function returns, otherwise they will contain the respective information
#
IF (NOT MINGW)
IF (NOT MINGW AND NOT MSVC)
FIND_PROGRAM(PKGCONFIG_EXECUTABLE NAMES pkg-config PATHS ${PATH} /usr/bin /usr/local/bin )
MACRO(PKGCONFIG1 _package _minVersion _include_DIR _link_DIR _link_FLAGS _cflags)
@ -43,5 +43,5 @@ IF (NOT MINGW)
ENDMACRO(PKGCONFIG1 _include_DIR _link_DIR _link_FLAGS _cflags)
MARK_AS_ADVANCED(PKGCONFIG_EXECUTABLE)
ENDIF (NOT MINGW)
ENDIF (NOT MINGW AND NOT MSVC)

View file

@ -19,11 +19,13 @@
#=============================================================================
SET_SOURCE_FILES_PROPERTIES(
${PCH}
${PROJECT_BINARY_DIR}/all.h
PROPERTIES GENERATED 1
)
if (NOT MSVC)
SET_SOURCE_FILES_PROPERTIES(
${PCH}
${PROJECT_BINARY_DIR}/all.h
PROPERTIES GENERATED 1
)
endif (NOT MSVC)

View file

@ -35,7 +35,15 @@ add_library(bww STATIC
writer.cpp
)
if (NOT MINGW AND NOT APPLE)
if (MSVC)
set_target_properties (
bww
PROPERTIES
COMPILE_FLAGS "${PCH_INCLUDE}"
)
endif (MSVC)
if (NOT MINGW AND NOT APPLE AND NOT MSVC)
add_executable(bww2mxml
${INCS}
lexer.cpp
@ -57,10 +65,15 @@ if (NOT MINGW AND NOT APPLE)
)
ADD_DEPENDENCIES(bww2mxml mops1)
ADD_DEPENDENCIES(bww2mxml mops2)
endif (NOT MINGW AND NOT APPLE)
endif (NOT MINGW AND NOT APPLE AND NOT MSVC)
xcode_pch(bww all)
ADD_DEPENDENCIES(bww mops1)
ADD_DEPENDENCIES(bww mops2)
# Use MSVC pre-compiled headers
vstudio_pch( bww )
# MSVC does not depend on mops1 & mops2 for PCH
if (NOT MSVC)
ADD_DEPENDENCIES(bww mops1)
ADD_DEPENDENCIES(bww mops2)
endif (NOT MSVC)

View file

@ -26,10 +26,16 @@ QT5_WRAP_UI (ui_headers
compressor/compressor_gui.ui
)
if (NOT MSVC)
set(_all_h_file "${PROJECT_BINARY_DIR}/all.h")
else (NOT MSVC)
set(_all_h_file "${PROJECT_SOURCE_DIR}/all.h")
endif (NOT MSVC)
add_library (effects STATIC
${ui_headers}
${qrc_effects_files}
${PROJECT_BINARY_DIR}/all.h
${_all_h_file}
${PCH}
effect.cpp
effectgui.cpp
@ -41,14 +47,29 @@ add_library (effects STATIC
compressor/compressorgui.cpp
${INCS}
)
set_target_properties (
if (NOT MSVC)
set_target_properties (
effects
PROPERTIES
COMPILE_FLAGS "${PCH_INCLUDE} -g -Wall -Wextra -Winvalid-pch"
)
else (NOT MSVC)
set_target_properties (
effects
PROPERTIES
COMPILE_FLAGS "${PCH_INCLUDE}"
)
endif (NOT MSVC)
xcode_pch(effects all)
ADD_DEPENDENCIES(effects mops1)
ADD_DEPENDENCIES(effects mops2)
# Use MSVC pre-compiled headers
vstudio_pch( effects )
# MSVC does not depend on mops1 & mops2 for PCH
if (NOT MSVC)
ADD_DEPENDENCIES(effects mops1)
ADD_DEPENDENCIES(effects mops2)
endif (NOT MSVC)

View file

@ -32,8 +32,14 @@ endif (SOUNDFONT3)
QT5_WRAP_UI (fluidUi fluid_gui.ui)
if (NOT MSVC)
set(_all_h_file "${PROJECT_BINARY_DIR}/all.h")
else (NOT MSVC)
set(_all_h_file "${PROJECT_SOURCE_DIR}/all.h")
endif (NOT MSVC)
add_library (fluid STATIC
${PROJECT_BINARY_DIR}/all.h
${_all_h_file}
${PCH}
${fluidUi}
fluidgui.cpp
@ -42,14 +48,28 @@ add_library (fluid STATIC
${SF3_SRC}
${INCS}
)
set_target_properties (
if (NOT MSVC)
set_target_properties (
fluid
PROPERTIES
COMPILE_FLAGS "${PCH_INCLUDE} -g -Wall -Wextra -Winvalid-pch"
)
else (NOT MSVC)
set_target_properties (
fluid
PROPERTIES
COMPILE_FLAGS "${PCH_INCLUDE}"
)
endif (NOT MSVC)
xcode_pch(fluid all)
ADD_DEPENDENCIES(fluid mops1)
ADD_DEPENDENCIES(fluid mops2)
# Use MSVC pre-compiled headers
vstudio_pch( fluid )
# MSVC does not depend on mops1 & mops2 for PCH
if (NOT MSVC)
ADD_DEPENDENCIES(fluid mops1)
ADD_DEPENDENCIES(fluid mops2)
endif (NOT MSVC)

View file

@ -19,5 +19,14 @@ add_executable(
)
target_link_libraries(genft ${QT_LIBRARIES} -lfreetype)
set_target_properties(genft PROPERTIES COMPILE_FLAGS "-I/usr/include/freetype2 -g -Wall -Wextra -Winvalid-pch")
if (NOT MSVC)
set_target_properties(genft PROPERTIES COMPILE_FLAGS "-I/usr/include/freetype2 -g -Wall -Wextra -Winvalid-pch")
else (NOT MSVC)
set_target_properties (
genft
PROPERTIES
COMPILE_FLAGS "" # Might be enough, have to check if a forced directory or forced include is needed.
)
endif (NOT MSVC)

View file

@ -15,13 +15,16 @@
set (LIB_SCRIPT_FILES plugins.cpp)
#endif (SCRIPT_INTERFACE)
add_custom_command(
OUTPUT ${PROJECT_BINARY_DIR}/all.h
COMMAND ${CMAKE_COMMAND}
ARGS -E copy ${PROJECT_SOURCE_DIR}/all.h ${PROJECT_BINARY_DIR}/all.h
DEPENDS ${PROJECT_SOURCE_DIR}/all.h
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
)
# MSVC does not depend on copying all.h to the binary directory
if (NOT MSVC)
add_custom_command(
OUTPUT ${PROJECT_BINARY_DIR}/all.h
COMMAND ${CMAKE_COMMAND}
ARGS -E copy ${PROJECT_SOURCE_DIR}/all.h ${PROJECT_BINARY_DIR}/all.h
DEPENDS ${PROJECT_SOURCE_DIR}/all.h
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
)
endif (NOT MSVC)
if (APPLE)
file(GLOB_RECURSE INCS "*.h")
@ -29,9 +32,15 @@ else (APPLE)
set(INCS "")
endif (APPLE)
if (NOT MSVC)
set(_all_h_file "${PROJECT_BINARY_DIR}/all.h")
else (NOT MSVC)
set(_all_h_file "${PROJECT_SOURCE_DIR}/all.h")
endif (NOT MSVC)
add_library (
libmscore STATIC
${PROJECT_BINARY_DIR}/all.h
${_all_h_file}
${INCS}
${LIB_SCRIPT_FILES}
types.h
@ -80,23 +89,37 @@ add_library (
##
set(COVERAGE_OPTIONS "")
if (NOT APPLE AND NOT MINGW AND CMAKE_BUILD_TYPE MATCHES "DEBUG")
if (NOT APPLE AND NOT MINGW AND NOT MSVC AND CMAKE_BUILD_TYPE MATCHES "DEBUG")
if (COVERAGE)
set(COVERAGE_OPTIONS "-O0 --coverage")
set(CMAKE_CXX_OUTPUT_EXTENSION_REPLACE 1)
target_link_libraries(libmscore gcov)
endif (COVERAGE)
endif (NOT APPLE AND NOT MINGW AND CMAKE_BUILD_TYPE MATCHES "DEBUG")
endif (NOT APPLE AND NOT MINGW AND NOT MSVC AND CMAKE_BUILD_TYPE MATCHES "DEBUG")
set_target_properties (
if (NOT MSVC)
set_target_properties (
libmscore
PROPERTIES
COMPILE_FLAGS "-g ${PCH_INCLUDE} -Wall -Wextra -Winvalid-pch -Woverloaded-virtual ${COVERAGE_OPTIONS}"
)
else (NOT MSVC)
set_target_properties (
libmscore
PROPERTIES
COMPILE_FLAGS "${PCH_INCLUDE}"
)
endif (NOT MSVC)
xcode_pch(libmscore all)
ADD_DEPENDENCIES(libmscore mops1)
ADD_DEPENDENCIES(libmscore mops2)
# Use MSVC pre-compiled headers
vstudio_pch( libmscore )
# MSVC does not depend on mops1 & mops2 for PCH
if (NOT MSVC)
ADD_DEPENDENCIES(libmscore mops1)
ADD_DEPENDENCIES(libmscore mops2)
endif (NOT MSVC)

View file

@ -11,6 +11,8 @@
# the file LICENSE.GPL
#=============================================================================
include (${PROJECT_SOURCE_DIR}/build/CopyFilesMacros.cmake)
include_directories(
${PROJECT_BINARY_DIR}
${PROJECT_SOURCE_DIR}
@ -18,14 +20,22 @@ include_directories(
if (APPLE)
file(GLOB_RECURSE INCS "*.h")
set(GETOPT_REPLACE "")
else (APPLE)
set(INCS "")
if (MSVC)
set(GETOPT_REPLACE "getopt/getopt.c")
include_directories("getopt")
else (MSVC)
set(GETOPT_REPLACE "")
endif (MSVC)
endif (APPLE)
add_executable(
genManual
${INCS}
genManual.cpp
${GETOPT_REPLACE}
)
target_link_libraries(
genManual
@ -39,11 +49,25 @@ set_target_properties (
COMPILE_FLAGS "-include all.h -D TESTROOT=\\\\\"${PROJECT_SOURCE_DIR}\\\\\" -g -Wall -Wextra"
)
else(APPLE)
set_target_properties (
genManual
PROPERTIES
COMPILE_FLAGS "-include all.h -D TESTROOT=\\\"${PROJECT_SOURCE_DIR}\\\" -g -Wall -Wextra"
)
if (NOT MSVC)
set_target_properties (
genManual
PROPERTIES
COMPILE_FLAGS "-include all.h -D TESTROOT=\\\"${PROJECT_SOURCE_DIR}\\\" -g -Wall -Wextra"
)
else (NOT MSVC)
set_target_properties (
genManual
PROPERTIES
COMPILE_FLAGS "${PCH_INCLUDE} -D TESTROOT=\\\"${PROJECT_SOURCE_DIR}\\\" -DSTATIC_GETOPT"
)
# Copy DLL dependencies to .EXE DIRECTORY
list(APPEND dlls_to_copy_m "${QT_INSTALL_PREFIX}/bin/Qt5Core.dll" )
set( output_dir_for_dlls_m "$<TARGET_FILE_DIR:genManual>")
COPY_FILES_INTO_DIRECTORY_IF_CHANGED( "${dlls_to_copy_m}" ${output_dir_for_dlls_m} genManual)
endif (NOT MSVC)
endif(APPLE)
ADD_DEPENDENCIES(genManual mops1)

17
manual/getopt/README.md Normal file
View file

@ -0,0 +1,17 @@
getopt-win32
============
Full getopt Port for Unicode and Multibyte Microsoft Visual C or C++
GitHub: nanoporetech/getopt-win32
This repository's branch "original" is a copy of
<https://www.codeproject.com/KB/cpp/getopt4win/getopt_mb_uni_vc10.zip>
originally released by its author Ludvik Jerabek in 2012 under LGPLv3.
Its sole purpose is to publish the changes made by Oxford Nanopore
Technologies available in the current branch. In accordance with the
original licence, Oxford Nanopore Technologies does not take any liability
or warranty whatsoever.
Building the Release and Debug DLL is done via the Microsoft Visual Studio IDE.

976
manual/getopt/getopt.c Normal file
View file

@ -0,0 +1,976 @@
/* Getopt for Microsoft C
This code is a modification of the Free Software Foundation, Inc.
Getopt library for parsing command line argument the purpose was
to provide a Microsoft Visual C friendly derivative. This code
provides functionality for both Unicode and Multibyte builds.
Date: 02/03/2011 - Ludvik Jerabek - Initial Release
Version: 1.0
Comment: Supports getopt, getopt_long, and getopt_long_only
and POSIXLY_CORRECT environment flag
License: LGPL
Revisions:
02/03/2011 - Ludvik Jerabek - Initial Release
02/20/2011 - Ludvik Jerabek - Fixed compiler warnings at Level 4
07/05/2011 - Ludvik Jerabek - Added no_argument, required_argument, optional_argument defs
08/03/2011 - Ludvik Jerabek - Fixed non-argument runtime bug which caused runtime exception
08/09/2011 - Ludvik Jerabek - Added code to export functions for DLL and LIB
02/15/2012 - Ludvik Jerabek - Fixed _GETOPT_THROW definition missing in implementation file
08/01/2012 - Ludvik Jerabek - Created separate functions for char and wchar_t characters so single dll can do both unicode and ansi
10/15/2012 - Ludvik Jerabek - Modified to match latest GNU features
06/19/2015 - Ludvik Jerabek - Fixed maximum option limitation caused by option_a (255) and option_w (65535) structure val variable
**DISCLAIMER**
THIS MATERIAL IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING, BUT Not LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE, OR NON-INFRINGEMENT. SOME JURISDICTIONS DO NOT ALLOW THE
EXCLUSION OF IMPLIED WARRANTIES, SO THE ABOVE EXCLUSION MAY NOT
APPLY TO YOU. IN NO EVENT WILL I BE LIABLE TO ANY PARTY FOR ANY
DIRECT, INDIRECT, SPECIAL OR OTHER CONSEQUENTIAL DAMAGES FOR ANY
USE OF THIS MATERIAL INCLUDING, WITHOUT LIMITATION, ANY LOST
PROFITS, BUSINESS INTERRUPTION, LOSS OF PROGRAMS OR OTHER DATA ON
YOUR INFORMATION HANDLING SYSTEM OR OTHERWISE, EVEN If WE ARE
EXPRESSLY ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*/
#ifndef _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#endif
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
#include "getopt.h"
#ifdef __cplusplus
#define _GETOPT_THROW throw()
#else
#define _GETOPT_THROW
#endif
int optind = 1;
int opterr = 1;
int optopt = '?';
enum ENUM_ORDERING { REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER };
//
//
// Ansi structures and functions follow
//
//
static struct _getopt_data_a
{
int optind;
int opterr;
int optopt;
char *optarg;
int __initialized;
char *__nextchar;
enum ENUM_ORDERING __ordering;
int __posixly_correct;
int __first_nonopt;
int __last_nonopt;
} getopt_data_a;
char *optarg_a;
static void exchange_a(char **argv, struct _getopt_data_a *d)
{
int bottom = d->__first_nonopt;
int middle = d->__last_nonopt;
int top = d->optind;
char *tem;
while (top > middle && middle > bottom)
{
if (top - middle > middle - bottom)
{
int len = middle - bottom;
register int i;
for (i = 0; i < len; i++)
{
tem = argv[bottom + i];
argv[bottom + i] = argv[top - (middle - bottom) + i];
argv[top - (middle - bottom) + i] = tem;
}
top -= len;
}
else
{
int len = top - middle;
register int i;
for (i = 0; i < len; i++)
{
tem = argv[bottom + i];
argv[bottom + i] = argv[middle + i];
argv[middle + i] = tem;
}
bottom += len;
}
}
d->__first_nonopt += (d->optind - d->__last_nonopt);
d->__last_nonopt = d->optind;
}
static const char *_getopt_initialize_a (const char *optstring, struct _getopt_data_a *d, int posixly_correct)
{
d->__first_nonopt = d->__last_nonopt = d->optind;
d->__nextchar = NULL;
d->__posixly_correct = posixly_correct | !!getenv("POSIXLY_CORRECT");
if (optstring[0] == '-')
{
d->__ordering = RETURN_IN_ORDER;
++optstring;
}
else if (optstring[0] == '+')
{
d->__ordering = REQUIRE_ORDER;
++optstring;
}
else if (d->__posixly_correct)
d->__ordering = REQUIRE_ORDER;
else
d->__ordering = PERMUTE;
return optstring;
}
int _getopt_internal_r_a (int argc, char *const *argv, const char *optstring, const struct option_a *longopts, int *longind, int long_only, struct _getopt_data_a *d, int posixly_correct)
{
int print_errors = d->opterr;
if (argc < 1)
return -1;
d->optarg = NULL;
if (d->optind == 0 || !d->__initialized)
{
if (d->optind == 0)
d->optind = 1;
optstring = _getopt_initialize_a (optstring, d, posixly_correct);
d->__initialized = 1;
}
else if (optstring[0] == '-' || optstring[0] == '+')
optstring++;
if (optstring[0] == ':')
print_errors = 0;
if (d->__nextchar == NULL || *d->__nextchar == '\0')
{
if (d->__last_nonopt > d->optind)
d->__last_nonopt = d->optind;
if (d->__first_nonopt > d->optind)
d->__first_nonopt = d->optind;
if (d->__ordering == PERMUTE)
{
if (d->__first_nonopt != d->__last_nonopt && d->__last_nonopt != d->optind)
exchange_a ((char **) argv, d);
else if (d->__last_nonopt != d->optind)
d->__first_nonopt = d->optind;
while (d->optind < argc && (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0'))
d->optind++;
d->__last_nonopt = d->optind;
}
if (d->optind != argc && !strcmp(argv[d->optind], "--"))
{
d->optind++;
if (d->__first_nonopt != d->__last_nonopt && d->__last_nonopt != d->optind)
exchange_a((char **) argv, d);
else if (d->__first_nonopt == d->__last_nonopt)
d->__first_nonopt = d->optind;
d->__last_nonopt = argc;
d->optind = argc;
}
if (d->optind == argc)
{
if (d->__first_nonopt != d->__last_nonopt)
d->optind = d->__first_nonopt;
return -1;
}
if ((argv[d->optind][0] != '-' || argv[d->optind][1] == '\0'))
{
if (d->__ordering == REQUIRE_ORDER)
return -1;
d->optarg = argv[d->optind++];
return 1;
}
d->__nextchar = (argv[d->optind] + 1 + (longopts != NULL && argv[d->optind][1] == '-'));
}
if (longopts != NULL && (argv[d->optind][1] == '-' || (long_only && (argv[d->optind][2] || !strchr(optstring, argv[d->optind][1])))))
{
char *nameend;
unsigned int namelen;
const struct option_a *p;
const struct option_a *pfound = NULL;
struct option_list
{
const struct option_a *p;
struct option_list *next;
} *ambig_list = NULL;
int exact = 0;
int indfound = -1;
int option_index;
for (nameend = d->__nextchar; *nameend && *nameend != '='; nameend++);
namelen = (unsigned int)(nameend - d->__nextchar);
for (p = longopts, option_index = 0; p->name; p++, option_index++)
if (!strncmp(p->name, d->__nextchar, namelen))
{
if (namelen == (unsigned int)strlen(p->name))
{
pfound = p;
indfound = option_index;
exact = 1;
break;
}
else if (pfound == NULL)
{
pfound = p;
indfound = option_index;
}
else if (long_only || pfound->has_arg != p->has_arg || pfound->flag != p->flag || pfound->val != p->val)
{
struct option_list *newp = (struct option_list*)alloca(sizeof(*newp));
newp->p = p;
newp->next = ambig_list;
ambig_list = newp;
}
}
if (ambig_list != NULL && !exact)
{
if (print_errors)
{
struct option_list first;
first.p = pfound;
first.next = ambig_list;
ambig_list = &first;
fprintf (stderr, "%s: option '%s' is ambiguous; possibilities:", argv[0], argv[d->optind]);
do
{
fprintf (stderr, " '--%s'", ambig_list->p->name);
ambig_list = ambig_list->next;
}
while (ambig_list != NULL);
fputc ('\n', stderr);
}
d->__nextchar += strlen(d->__nextchar);
d->optind++;
d->optopt = 0;
return '?';
}
if (pfound != NULL)
{
option_index = indfound;
d->optind++;
if (*nameend)
{
if (pfound->has_arg)
d->optarg = nameend + 1;
else
{
if (print_errors)
{
if (argv[d->optind - 1][1] == '-')
{
fprintf(stderr, "%s: option '--%s' doesn't allow an argument\n",argv[0], pfound->name);
}
else
{
fprintf(stderr, "%s: option '%c%s' doesn't allow an argument\n",argv[0], argv[d->optind - 1][0],pfound->name);
}
}
d->__nextchar += strlen(d->__nextchar);
d->optopt = pfound->val;
return '?';
}
}
else if (pfound->has_arg == 1)
{
if (d->optind < argc)
d->optarg = argv[d->optind++];
else
{
if (print_errors)
{
fprintf(stderr,"%s: option '--%s' requires an argument\n",argv[0], pfound->name);
}
d->__nextchar += strlen(d->__nextchar);
d->optopt = pfound->val;
return optstring[0] == ':' ? ':' : '?';
}
}
d->__nextchar += strlen(d->__nextchar);
if (longind != NULL)
*longind = option_index;
if (pfound->flag)
{
*(pfound->flag) = pfound->val;
return 0;
}
return pfound->val;
}
if (!long_only || argv[d->optind][1] == '-' || strchr(optstring, *d->__nextchar) == NULL)
{
if (print_errors)
{
if (argv[d->optind][1] == '-')
{
fprintf(stderr, "%s: unrecognized option '--%s'\n",argv[0], d->__nextchar);
}
else
{
fprintf(stderr, "%s: unrecognized option '%c%s'\n",argv[0], argv[d->optind][0], d->__nextchar);
}
}
d->__nextchar = (char *)"";
d->optind++;
d->optopt = 0;
return '?';
}
}
{
char c = *d->__nextchar++;
char *temp = (char*)strchr(optstring, c);
if (*d->__nextchar == '\0')
++d->optind;
if (temp == NULL || c == ':' || c == ';')
{
if (print_errors)
{
fprintf(stderr, "%s: invalid option -- '%c'\n", argv[0], c);
}
d->optopt = c;
return '?';
}
if (temp[0] == 'W' && temp[1] == ';')
{
char *nameend;
const struct option_a *p;
const struct option_a *pfound = NULL;
int exact = 0;
int ambig = 0;
int indfound = 0;
int option_index;
if (longopts == NULL)
goto no_longs;
if (*d->__nextchar != '\0')
{
d->optarg = d->__nextchar;
d->optind++;
}
else if (d->optind == argc)
{
if (print_errors)
{
fprintf(stderr,"%s: option requires an argument -- '%c'\n",argv[0], c);
}
d->optopt = c;
if (optstring[0] == ':')
c = ':';
else
c = '?';
return c;
}
else
d->optarg = argv[d->optind++];
for (d->__nextchar = nameend = d->optarg; *nameend && *nameend != '='; nameend++);
for (p = longopts, option_index = 0; p->name; p++, option_index++)
if (!strncmp(p->name, d->__nextchar, nameend - d->__nextchar))
{
if ((unsigned int) (nameend - d->__nextchar) == strlen(p->name))
{
pfound = p;
indfound = option_index;
exact = 1;
break;
}
else if (pfound == NULL)
{
pfound = p;
indfound = option_index;
}
else if (long_only || pfound->has_arg != p->has_arg || pfound->flag != p->flag || pfound->val != p->val)
ambig = 1;
}
if (ambig && !exact)
{
if (print_errors)
{
fprintf(stderr, "%s: option '-W %s' is ambiguous\n",argv[0], d->optarg);
}
d->__nextchar += strlen(d->__nextchar);
d->optind++;
return '?';
}
if (pfound != NULL)
{
option_index = indfound;
if (*nameend)
{
if (pfound->has_arg)
d->optarg = nameend + 1;
else
{
if (print_errors)
{
fprintf(stderr, "%s: option '-W %s' doesn't allow an argument\n",argv[0], pfound->name);
}
d->__nextchar += strlen(d->__nextchar);
return '?';
}
}
else if (pfound->has_arg == 1)
{
if (d->optind < argc)
d->optarg = argv[d->optind++];
else
{
if (print_errors)
{
fprintf(stderr, "%s: option '-W %s' requires an argument\n",argv[0], pfound->name);
}
d->__nextchar += strlen(d->__nextchar);
return optstring[0] == ':' ? ':' : '?';
}
}
else
d->optarg = NULL;
d->__nextchar += strlen(d->__nextchar);
if (longind != NULL)
*longind = option_index;
if (pfound->flag)
{
*(pfound->flag) = pfound->val;
return 0;
}
return pfound->val;
}
no_longs:
d->__nextchar = NULL;
return 'W';
}
if (temp[1] == ':')
{
if (temp[2] == ':')
{
if (*d->__nextchar != '\0')
{
d->optarg = d->__nextchar;
d->optind++;
}
else
d->optarg = NULL;
d->__nextchar = NULL;
}
else
{
if (*d->__nextchar != '\0')
{
d->optarg = d->__nextchar;
d->optind++;
}
else if (d->optind == argc)
{
if (print_errors)
{
fprintf(stderr,"%s: option requires an argument -- '%c'\n",argv[0], c);
}
d->optopt = c;
if (optstring[0] == ':')
c = ':';
else
c = '?';
}
else
d->optarg = argv[d->optind++];
d->__nextchar = NULL;
}
}
return c;
}
}
int _getopt_internal_a (int argc, char *const *argv, const char *optstring, const struct option_a *longopts, int *longind, int long_only, int posixly_correct)
{
int result;
getopt_data_a.optind = optind;
getopt_data_a.opterr = opterr;
result = _getopt_internal_r_a (argc, argv, optstring, longopts,longind, long_only, &getopt_data_a,posixly_correct);
optind = getopt_data_a.optind;
optarg_a = getopt_data_a.optarg;
optopt = getopt_data_a.optopt;
return result;
}
int getopt_a (int argc, char *const *argv, const char *optstring) _GETOPT_THROW
{
return _getopt_internal_a (argc, argv, optstring, (const struct option_a *) 0, (int *) 0, 0, 0);
}
int getopt_long_a (int argc, char *const *argv, const char *options, const struct option_a *long_options, int *opt_index) _GETOPT_THROW
{
return _getopt_internal_a (argc, argv, options, long_options, opt_index, 0, 0);
}
int getopt_long_only_a (int argc, char *const *argv, const char *options, const struct option_a *long_options, int *opt_index) _GETOPT_THROW
{
return _getopt_internal_a (argc, argv, options, long_options, opt_index, 1, 0);
}
int _getopt_long_r_a (int argc, char *const *argv, const char *options, const struct option_a *long_options, int *opt_index, struct _getopt_data_a *d)
{
return _getopt_internal_r_a (argc, argv, options, long_options, opt_index,0, d, 0);
}
int _getopt_long_only_r_a (int argc, char *const *argv, const char *options, const struct option_a *long_options, int *opt_index, struct _getopt_data_a *d)
{
return _getopt_internal_r_a (argc, argv, options, long_options, opt_index, 1, d, 0);
}
//
//
// Unicode Structures and Functions
//
//
static struct _getopt_data_w
{
int optind;
int opterr;
int optopt;
wchar_t *optarg;
int __initialized;
wchar_t *__nextchar;
enum ENUM_ORDERING __ordering;
int __posixly_correct;
int __first_nonopt;
int __last_nonopt;
} getopt_data_w;
wchar_t *optarg_w;
static void exchange_w(wchar_t **argv, struct _getopt_data_w *d)
{
int bottom = d->__first_nonopt;
int middle = d->__last_nonopt;
int top = d->optind;
wchar_t *tem;
while (top > middle && middle > bottom)
{
if (top - middle > middle - bottom)
{
int len = middle - bottom;
register int i;
for (i = 0; i < len; i++)
{
tem = argv[bottom + i];
argv[bottom + i] = argv[top - (middle - bottom) + i];
argv[top - (middle - bottom) + i] = tem;
}
top -= len;
}
else
{
int len = top - middle;
register int i;
for (i = 0; i < len; i++)
{
tem = argv[bottom + i];
argv[bottom + i] = argv[middle + i];
argv[middle + i] = tem;
}
bottom += len;
}
}
d->__first_nonopt += (d->optind - d->__last_nonopt);
d->__last_nonopt = d->optind;
}
static const wchar_t *_getopt_initialize_w (const wchar_t *optstring, struct _getopt_data_w *d, int posixly_correct)
{
d->__first_nonopt = d->__last_nonopt = d->optind;
d->__nextchar = NULL;
d->__posixly_correct = posixly_correct | !!_wgetenv(L"POSIXLY_CORRECT");
if (optstring[0] == L'-')
{
d->__ordering = RETURN_IN_ORDER;
++optstring;
}
else if (optstring[0] == L'+')
{
d->__ordering = REQUIRE_ORDER;
++optstring;
}
else if (d->__posixly_correct)
d->__ordering = REQUIRE_ORDER;
else
d->__ordering = PERMUTE;
return optstring;
}
int _getopt_internal_r_w (int argc, wchar_t *const *argv, const wchar_t *optstring, const struct option_w *longopts, int *longind, int long_only, struct _getopt_data_w *d, int posixly_correct)
{
int print_errors = d->opterr;
if (argc < 1)
return -1;
d->optarg = NULL;
if (d->optind == 0 || !d->__initialized)
{
if (d->optind == 0)
d->optind = 1;
optstring = _getopt_initialize_w (optstring, d, posixly_correct);
d->__initialized = 1;
}
else if (optstring[0] == L'-' || optstring[0] == L'+')
optstring++;
if (optstring[0] == L':')
print_errors = 0;
if (d->__nextchar == NULL || *d->__nextchar == L'\0')
{
if (d->__last_nonopt > d->optind)
d->__last_nonopt = d->optind;
if (d->__first_nonopt > d->optind)
d->__first_nonopt = d->optind;
if (d->__ordering == PERMUTE)
{
if (d->__first_nonopt != d->__last_nonopt && d->__last_nonopt != d->optind)
exchange_w((wchar_t **) argv, d);
else if (d->__last_nonopt != d->optind)
d->__first_nonopt = d->optind;
while (d->optind < argc && (argv[d->optind][0] != L'-' || argv[d->optind][1] == L'\0'))
d->optind++;
d->__last_nonopt = d->optind;
}
if (d->optind != argc && !wcscmp(argv[d->optind], L"--"))
{
d->optind++;
if (d->__first_nonopt != d->__last_nonopt && d->__last_nonopt != d->optind)
exchange_w((wchar_t **) argv, d);
else if (d->__first_nonopt == d->__last_nonopt)
d->__first_nonopt = d->optind;
d->__last_nonopt = argc;
d->optind = argc;
}
if (d->optind == argc)
{
if (d->__first_nonopt != d->__last_nonopt)
d->optind = d->__first_nonopt;
return -1;
}
if ((argv[d->optind][0] != L'-' || argv[d->optind][1] == L'\0'))
{
if (d->__ordering == REQUIRE_ORDER)
return -1;
d->optarg = argv[d->optind++];
return 1;
}
d->__nextchar = (argv[d->optind] + 1 + (longopts != NULL && argv[d->optind][1] == L'-'));
}
if (longopts != NULL && (argv[d->optind][1] == L'-' || (long_only && (argv[d->optind][2] || !wcschr(optstring, argv[d->optind][1])))))
{
wchar_t *nameend;
unsigned int namelen;
const struct option_w *p;
const struct option_w *pfound = NULL;
struct option_list
{
const struct option_w *p;
struct option_list *next;
} *ambig_list = NULL;
int exact = 0;
int indfound = -1;
int option_index;
for (nameend = d->__nextchar; *nameend && *nameend != L'='; nameend++);
namelen = (unsigned int)(nameend - d->__nextchar);
for (p = longopts, option_index = 0; p->name; p++, option_index++)
if (!wcsncmp(p->name, d->__nextchar, namelen))
{
if (namelen == (unsigned int)wcslen(p->name))
{
pfound = p;
indfound = option_index;
exact = 1;
break;
}
else if (pfound == NULL)
{
pfound = p;
indfound = option_index;
}
else if (long_only || pfound->has_arg != p->has_arg || pfound->flag != p->flag || pfound->val != p->val)
{
struct option_list *newp = (struct option_list*)alloca(sizeof(*newp));
newp->p = p;
newp->next = ambig_list;
ambig_list = newp;
}
}
if (ambig_list != NULL && !exact)
{
if (print_errors)
{
struct option_list first;
first.p = pfound;
first.next = ambig_list;
ambig_list = &first;
fwprintf(stderr, L"%s: option '%s' is ambiguous; possibilities:", argv[0], argv[d->optind]);
do
{
fwprintf (stderr, L" '--%s'", ambig_list->p->name);
ambig_list = ambig_list->next;
}
while (ambig_list != NULL);
fputwc (L'\n', stderr);
}
d->__nextchar += wcslen(d->__nextchar);
d->optind++;
d->optopt = 0;
return L'?';
}
if (pfound != NULL)
{
option_index = indfound;
d->optind++;
if (*nameend)
{
if (pfound->has_arg)
d->optarg = nameend + 1;
else
{
if (print_errors)
{
if (argv[d->optind - 1][1] == L'-')
{
fwprintf(stderr, L"%s: option '--%s' doesn't allow an argument\n",argv[0], pfound->name);
}
else
{
fwprintf(stderr, L"%s: option '%c%s' doesn't allow an argument\n",argv[0], argv[d->optind - 1][0],pfound->name);
}
}
d->__nextchar += wcslen(d->__nextchar);
d->optopt = pfound->val;
return L'?';
}
}
else if (pfound->has_arg == 1)
{
if (d->optind < argc)
d->optarg = argv[d->optind++];
else
{
if (print_errors)
{
fwprintf(stderr,L"%s: option '--%s' requires an argument\n",argv[0], pfound->name);
}
d->__nextchar += wcslen(d->__nextchar);
d->optopt = pfound->val;
return optstring[0] == L':' ? L':' : L'?';
}
}
d->__nextchar += wcslen(d->__nextchar);
if (longind != NULL)
*longind = option_index;
if (pfound->flag)
{
*(pfound->flag) = pfound->val;
return 0;
}
return pfound->val;
}
if (!long_only || argv[d->optind][1] == L'-' || wcschr(optstring, *d->__nextchar) == NULL)
{
if (print_errors)
{
if (argv[d->optind][1] == L'-')
{
fwprintf(stderr, L"%s: unrecognized option '--%s'\n",argv[0], d->__nextchar);
}
else
{
fwprintf(stderr, L"%s: unrecognized option '%c%s'\n",argv[0], argv[d->optind][0], d->__nextchar);
}
}
d->__nextchar = (wchar_t *)L"";
d->optind++;
d->optopt = 0;
return L'?';
}
}
{
wchar_t c = *d->__nextchar++;
wchar_t *temp = (wchar_t*)wcschr(optstring, c);
if (*d->__nextchar == L'\0')
++d->optind;
if (temp == NULL || c == L':' || c == L';')
{
if (print_errors)
{
fwprintf(stderr, L"%s: invalid option -- '%c'\n", argv[0], c);
}
d->optopt = c;
return L'?';
}
if (temp[0] == L'W' && temp[1] == L';')
{
wchar_t *nameend;
const struct option_w *p;
const struct option_w *pfound = NULL;
int exact = 0;
int ambig = 0;
int indfound = 0;
int option_index;
if (longopts == NULL)
goto no_longs;
if (*d->__nextchar != L'\0')
{
d->optarg = d->__nextchar;
d->optind++;
}
else if (d->optind == argc)
{
if (print_errors)
{
fwprintf(stderr,L"%s: option requires an argument -- '%c'\n",argv[0], c);
}
d->optopt = c;
if (optstring[0] == L':')
c = L':';
else
c = L'?';
return c;
}
else
d->optarg = argv[d->optind++];
for (d->__nextchar = nameend = d->optarg; *nameend && *nameend != L'='; nameend++);
for (p = longopts, option_index = 0; p->name; p++, option_index++)
if (!wcsncmp(p->name, d->__nextchar, nameend - d->__nextchar))
{
if ((unsigned int) (nameend - d->__nextchar) == wcslen(p->name))
{
pfound = p;
indfound = option_index;
exact = 1;
break;
}
else if (pfound == NULL)
{
pfound = p;
indfound = option_index;
}
else if (long_only || pfound->has_arg != p->has_arg || pfound->flag != p->flag || pfound->val != p->val)
ambig = 1;
}
if (ambig && !exact)
{
if (print_errors)
{
fwprintf(stderr, L"%s: option '-W %s' is ambiguous\n",argv[0], d->optarg);
}
d->__nextchar += wcslen(d->__nextchar);
d->optind++;
return L'?';
}
if (pfound != NULL)
{
option_index = indfound;
if (*nameend)
{
if (pfound->has_arg)
d->optarg = nameend + 1;
else
{
if (print_errors)
{
fwprintf(stderr, L"%s: option '-W %s' doesn't allow an argument\n",argv[0], pfound->name);
}
d->__nextchar += wcslen(d->__nextchar);
return L'?';
}
}
else if (pfound->has_arg == 1)
{
if (d->optind < argc)
d->optarg = argv[d->optind++];
else
{
if (print_errors)
{
fwprintf(stderr, L"%s: option '-W %s' requires an argument\n",argv[0], pfound->name);
}
d->__nextchar += wcslen(d->__nextchar);
return optstring[0] == L':' ? L':' : L'?';
}
}
else
d->optarg = NULL;
d->__nextchar += wcslen(d->__nextchar);
if (longind != NULL)
*longind = option_index;
if (pfound->flag)
{
*(pfound->flag) = pfound->val;
return 0;
}
return pfound->val;
}
no_longs:
d->__nextchar = NULL;
return L'W';
}
if (temp[1] == L':')
{
if (temp[2] == L':')
{
if (*d->__nextchar != L'\0')
{
d->optarg = d->__nextchar;
d->optind++;
}
else
d->optarg = NULL;
d->__nextchar = NULL;
}
else
{
if (*d->__nextchar != L'\0')
{
d->optarg = d->__nextchar;
d->optind++;
}
else if (d->optind == argc)
{
if (print_errors)
{
fwprintf(stderr,L"%s: option requires an argument -- '%c'\n",argv[0], c);
}
d->optopt = c;
if (optstring[0] == L':')
c = L':';
else
c = L'?';
}
else
d->optarg = argv[d->optind++];
d->__nextchar = NULL;
}
}
return c;
}
}
int _getopt_internal_w (int argc, wchar_t *const *argv, const wchar_t *optstring, const struct option_w *longopts, int *longind, int long_only, int posixly_correct)
{
int result;
getopt_data_w.optind = optind;
getopt_data_w.opterr = opterr;
result = _getopt_internal_r_w (argc, argv, optstring, longopts,longind, long_only, &getopt_data_w,posixly_correct);
optind = getopt_data_w.optind;
optarg_w = getopt_data_w.optarg;
optopt = getopt_data_w.optopt;
return result;
}
int getopt_w (int argc, wchar_t *const *argv, const wchar_t *optstring) _GETOPT_THROW
{
return _getopt_internal_w (argc, argv, optstring, (const struct option_w *) 0, (int *) 0, 0, 0);
}
int getopt_long_w (int argc, wchar_t *const *argv, const wchar_t *options, const struct option_w *long_options, int *opt_index) _GETOPT_THROW
{
return _getopt_internal_w (argc, argv, options, long_options, opt_index, 0, 0);
}
int getopt_long_only_w (int argc, wchar_t *const *argv, const wchar_t *options, const struct option_w *long_options, int *opt_index) _GETOPT_THROW
{
return _getopt_internal_w (argc, argv, options, long_options, opt_index, 1, 0);
}
int _getopt_long_r_w (int argc, wchar_t *const *argv, const wchar_t *options, const struct option_w *long_options, int *opt_index, struct _getopt_data_w *d)
{
return _getopt_internal_r_w (argc, argv, options, long_options, opt_index,0, d, 0);
}
int _getopt_long_only_r_w (int argc, wchar_t *const *argv, const wchar_t *options, const struct option_w *long_options, int *opt_index, struct _getopt_data_w *d)
{
return _getopt_internal_r_w (argc, argv, options, long_options, opt_index, 1, d, 0);
}

136
manual/getopt/getopt.h Normal file
View file

@ -0,0 +1,136 @@
/* Getopt for Microsoft C
This code is a modification of the Free Software Foundation, Inc.
Getopt library for parsing command line argument the purpose was
to provide a Microsoft Visual C friendly derivative. This code
provides functionality for both Unicode and Multibyte builds.
Date: 02/03/2011 - Ludvik Jerabek - Initial Release
Version: 1.0
Comment: Supports getopt, getopt_long, and getopt_long_only
and POSIXLY_CORRECT environment flag
License: LGPL
Revisions:
02/03/2011 - Ludvik Jerabek - Initial Release
02/20/2011 - Ludvik Jerabek - Fixed compiler warnings at Level 4
07/05/2011 - Ludvik Jerabek - Added no_argument, required_argument, optional_argument defs
08/03/2011 - Ludvik Jerabek - Fixed non-argument runtime bug which caused runtime exception
08/09/2011 - Ludvik Jerabek - Added code to export functions for DLL and LIB
02/15/2012 - Ludvik Jerabek - Fixed _GETOPT_THROW definition missing in implementation file
08/01/2012 - Ludvik Jerabek - Created separate functions for char and wchar_t characters so single dll can do both unicode and ansi
10/15/2012 - Ludvik Jerabek - Modified to match latest GNU features
06/19/2015 - Ludvik Jerabek - Fixed maximum option limitation caused by option_a (255) and option_w (65535) structure val variable
**DISCLAIMER**
THIS MATERIAL IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING, BUT Not LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE, OR NON-INFRINGEMENT. SOME JURISDICTIONS DO NOT ALLOW THE
EXCLUSION OF IMPLIED WARRANTIES, SO THE ABOVE EXCLUSION MAY NOT
APPLY TO YOU. IN NO EVENT WILL I BE LIABLE TO ANY PARTY FOR ANY
DIRECT, INDIRECT, SPECIAL OR OTHER CONSEQUENTIAL DAMAGES FOR ANY
USE OF THIS MATERIAL INCLUDING, WITHOUT LIMITATION, ANY LOST
PROFITS, BUSINESS INTERRUPTION, LOSS OF PROGRAMS OR OTHER DATA ON
YOUR INFORMATION HANDLING SYSTEM OR OTHERWISE, EVEN If WE ARE
EXPRESSLY ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*/
#ifndef __GETOPT_H_
#define __GETOPT_H_
#ifdef _GETOPT_API
#undef _GETOPT_API
#endif
#if defined(EXPORTS_GETOPT) && defined(STATIC_GETOPT)
#error "The preprocessor definitions of EXPORTS_GETOPT and STATIC_GETOPT can only be used individually"
#elif defined(STATIC_GETOPT)
#pragma message("Warning static builds of getopt violate the Lesser GNU Public License")
#define _GETOPT_API
#elif defined(EXPORTS_GETOPT)
#pragma message("Exporting getopt library")
#define _GETOPT_API __declspec(dllexport)
#else
#pragma message("Importing getopt library")
#define _GETOPT_API __declspec(dllimport)
#endif
// Change behavior for C\C++
#ifdef __cplusplus
#define _BEGIN_EXTERN_C extern "C" {
#define _END_EXTERN_C }
#define _GETOPT_THROW throw()
#else
#define _BEGIN_EXTERN_C
#define _END_EXTERN_C
#define _GETOPT_THROW
#endif
// Standard GNU options
#define null_argument 0 /*Argument Null*/
#define no_argument 0 /*Argument Switch Only*/
#define required_argument 1 /*Argument Required*/
#define optional_argument 2 /*Argument Optional*/
// Shorter Options
#define ARG_NULL 0 /*Argument Null*/
#define ARG_NONE 0 /*Argument Switch Only*/
#define ARG_REQ 1 /*Argument Required*/
#define ARG_OPT 2 /*Argument Optional*/
#include <string.h>
#include <wchar.h>
_BEGIN_EXTERN_C
extern _GETOPT_API int optind;
extern _GETOPT_API int opterr;
extern _GETOPT_API int optopt;
// Ansi
struct option_a
{
const char* name;
int has_arg;
int *flag;
int val;
};
extern _GETOPT_API char *optarg_a;
extern _GETOPT_API int getopt_a(int argc, char *const *argv, const char *optstring) _GETOPT_THROW;
extern _GETOPT_API int getopt_long_a(int argc, char *const *argv, const char *options, const struct option_a *long_options, int *opt_index) _GETOPT_THROW;
extern _GETOPT_API int getopt_long_only_a(int argc, char *const *argv, const char *options, const struct option_a *long_options, int *opt_index) _GETOPT_THROW;
// Unicode
struct option_w
{
const wchar_t* name;
int has_arg;
int *flag;
int val;
};
extern _GETOPT_API wchar_t *optarg_w;
extern _GETOPT_API int getopt_w(int argc, wchar_t *const *argv, const wchar_t *optstring) _GETOPT_THROW;
extern _GETOPT_API int getopt_long_w(int argc, wchar_t *const *argv, const wchar_t *options, const struct option_w *long_options, int *opt_index) _GETOPT_THROW;
extern _GETOPT_API int getopt_long_only_w(int argc, wchar_t *const *argv, const wchar_t *options, const struct option_w *long_options, int *opt_index) _GETOPT_THROW;
_END_EXTERN_C
#undef _BEGIN_EXTERN_C
#undef _END_EXTERN_C
#undef _GETOPT_THROW
#undef _GETOPT_API
#ifdef _UNICODE
#define getopt getopt_w
#define getopt_long getopt_long_w
#define getopt_long_only getopt_long_only_w
#define option option_w
#define optarg optarg_w
#else
#define getopt getopt_a
#define getopt_long getopt_long_a
#define getopt_long_only getopt_long_only_a
#define option option_a
#define optarg optarg_a
#endif
#endif // __GETOPT_H_

View file

@ -18,21 +18,42 @@ else (APPLE)
set(INCS "")
endif (APPLE)
if (NOT MSVC)
set(_all_h_file "${PROJECT_BINARY_DIR}/all.h")
else (NOT MSVC)
set(_all_h_file "${PROJECT_SOURCE_DIR}/all.h")
endif (NOT MSVC)
add_library (midi STATIC
${PROJECT_BINARY_DIR}/all.h
${_all_h_file}
${PCH}
midifile.cpp
midiinstrument.cpp
)
set_target_properties (
if (NOT MSVC)
set_target_properties (
midi
PROPERTIES
COMPILE_FLAGS "${PCH_INCLUDE} -g -Wall -Wextra -Winvalid-pch"
)
else (NOT MSVC)
set_target_properties (
midi
PROPERTIES
COMPILE_FLAGS "${PCH_INCLUDE}"
)
endif (NOT MSVC)
xcode_pch(midi all)
ADD_DEPENDENCIES(midi mops1)
ADD_DEPENDENCIES(midi mops2)
# Use MSVC pre-compiled headers
vstudio_pch( midi )
# MSVC does not depend on mops1 & mops2 for PCH
if (NOT MSVC)
ADD_DEPENDENCIES(midi mops1)
ADD_DEPENDENCIES(midi mops2)
endif (NOT MSVC)

View file

@ -12,19 +12,34 @@
add_executable (smf2xml smf2xml.cpp xmlwriter.cpp midifile.cpp)
set_target_properties(smf2xml
if (NOT MSVC)
set_target_properties(smf2xml
PROPERTIES COMPILE_FLAGS "-g -Wall -Wextra"
)
else (NOT MSVC)
set_target_properties (smf2xml
PROPERTIES COMPILE_FLAGS ""
)
endif (NOT MSVC)
target_link_libraries(smf2xml
${QT_LIBRARIES}
)
add_executable (xml2smf xml2smf.cpp xmlreader.cpp midifile.cpp)
set_target_properties (
if (NOT MSVC)
set_target_properties (
xml2smf
PROPERTIES COMPILE_FLAGS "-g -Wall -Wextra"
)
else (NOT MSVC)
set_target_properties (
xml2smf
PROPERTIES COMPILE_FLAGS ""
)
endif (NOT MSVC)
target_link_libraries(xml2smf
${QT_LIBRARIES}
)

View file

@ -17,7 +17,11 @@
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#=============================================================================
include (${PROJECT_SOURCE_DIR}/build/gch.cmake)
# This is not needed for MSVC compilation
if (NOT MSVC)
include (${PROJECT_SOURCE_DIR}/build/gch.cmake)
endif (NOT MSVC)
include (${PROJECT_SOURCE_DIR}/build/CopyFilesMacros.cmake)
SET_SOURCE_FILES_PROPERTIES(revision.h PROPERTIES GENERATED TRUE)
@ -163,11 +167,16 @@ endif (APPLE)
set (AUDIO "")
if (MINGW)
set (resource_file ${PROJECT_BINARY_DIR}/resfile.o)
else (MINGW)
endif (MINGW)
if (MSVC)
# MSVC recognizes a *.rc file and will invoke the resource compiler to link it
set (resource_file ${PROJECT_SOURCE_DIR}/mscore/data/mscore.rc)
endif ( MSVC )
if ( NOT MINGW AND NOT MSVC )
if (USE_ALSA)
set (AUDIO ${AUDIO} alsa.cpp)
endif (USE_ALSA)
endif (MINGW)
endif ( NOT MINGW AND NOT MSVC )
if (USE_PORTAUDIO)
set (AUDIO ${AUDIO} pa.cpp)
@ -232,10 +241,16 @@ else (APPLE)
set(COCOABRIDGE "")
endif (APPLE)
if (NOT MSVC)
set(_all_h_file "${PROJECT_BINARY_DIR}/all.h")
else (NOT MSVC)
set(_all_h_file "${PROJECT_SOURCE_DIR}/all.h")
endif (NOT MSVC)
add_executable ( ${ExecutableName}
${qrc_files}
${ui_headers}
${PROJECT_BINARY_DIR}/all.h
${_all_h_file}
${PCH}
${resource_file}
${INCS}
@ -385,11 +400,11 @@ if (USE_SYSTEM_FREETYPE)
target_link_libraries(mscore ${FREETYPE_LIBRARIES})
endif (USE_SYSTEM_FREETYPE)
if (MINGW)
if (MINGW OR MSVC)
set(MSCORE_OUTPUT_NAME ${MUSESCORE_NAME})
elseif (MSCORE_INSTALL_SUFFIX)
set(MSCORE_OUTPUT_NAME "${ExecutableName}${MSCORE_INSTALL_SUFFIX}")
endif (MINGW)
endif (MINGW OR MSVC)
# If MSCORE_OUTPUT_NAME is set (e.g, when cmake is called by the user), the output executable will be
# called MSCORE_OUTPUT_NAME instead of 'mscore'. This can be used to have MuseScore stable and unstable
@ -444,7 +459,7 @@ if (MINGW)
${PROJECT_BINARY_DIR}/resfile.o
PROPERTIES generated true
)
string(TOUPPER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE)
string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE)
# Windows: Add -mconsole to LINK_FLAGS to get a console window for debug output
if(CMAKE_BUILD_TYPE MATCHES "DEBUG")
set_target_properties( mscore
@ -547,125 +562,291 @@ if (MINGW)
REGEX ".*QtWebkit.*" EXCLUDE)
else (MINGW)
target_link_libraries(mscore
${ALSA_LIB}
${QT_LIBRARIES}
z
${CMAKE_DL_LIBS}
pthread
)
if ( NOT MSVC )
target_link_libraries(mscore
${ALSA_LIB}
${QT_LIBRARIES}
z
${CMAKE_DL_LIBS}
pthread
)
if (USE_SYSTEM_FREETYPE)
target_link_libraries(mscore freetype)
else (USE_SYSTEM_FREETYPE)
target_link_libraries(mscore mscore_freetype)
endif (USE_SYSTEM_FREETYPE)
if (USE_SYSTEM_FREETYPE)
target_link_libraries(mscore freetype)
else (USE_SYSTEM_FREETYPE)
target_link_libraries(mscore mscore_freetype)
endif (USE_SYSTEM_FREETYPE)
if (USE_PORTAUDIO)
target_link_libraries(mscore ${PORTAUDIO_LIB})
endif (USE_PORTAUDIO)
if (USE_PORTAUDIO)
target_link_libraries(mscore ${PORTAUDIO_LIB})
endif (USE_PORTAUDIO)
if (USE_PORTMIDI)
if (APPLE)
set(PORTMIDI_LIB portmidi)
else (APPLE)
set(PORTMIDI_LIB -lportmidi -lporttime) # Remove -lporttime on RPM-based systems where PortTime is part of PortMidi.
endif (APPLE)
target_link_libraries(mscore ${PORTMIDI_LIB})
endif (USE_PORTMIDI)
if (USE_PORTMIDI)
if (APPLE)
set(PORTMIDI_LIB portmidi)
else (APPLE)
set(PORTMIDI_LIB -lportmidi -lporttime) # Remove -lporttime on RPM-based systems where PortTime is part of PortMidi.
endif (APPLE)
target_link_libraries(mscore ${PORTMIDI_LIB})
endif (USE_PORTMIDI)
if (USE_PULSEAUDIO)
target_link_libraries(mscore ${PULSEAUDIO_LIBRARY})
endif (USE_PULSEAUDIO)
if (USE_PULSEAUDIO)
target_link_libraries(mscore ${PULSEAUDIO_LIBRARY})
endif (USE_PULSEAUDIO)
set_target_properties (
mscore
PROPERTIES
COMPILE_FLAGS "${PCH_INCLUDE} -g -Wall -Wno-overloaded-virtual -Winvalid-pch"
)
set_target_properties (
mscore
PROPERTIES
COMPILE_FLAGS "${PCH_INCLUDE} -g -Wall -Wno-overloaded-virtual -Winvalid-pch"
)
if (OMR)
target_link_libraries(mscore omr poppler)
if (OCR)
target_link_libraries(mscore tesseract_api)
endif (OCR)
endif (OMR)
if (OMR)
target_link_libraries(mscore omr poppler)
if (OCR)
target_link_libraries(mscore tesseract_api)
endif (OCR)
endif (OMR)
if (APPLE)
target_link_libraries(mscore ${OsxFrameworks})
else (APPLE)
target_link_libraries(mscore rt)
endif (APPLE)
if (APPLE)
target_link_libraries(mscore ${OsxFrameworks})
else (APPLE)
target_link_libraries(mscore rt)
endif (APPLE)
# 'gold' does not use indirect shared libraries for symbol resolution, Linux only
if (NOT APPLE)
if(USE_JACK)
target_link_libraries(mscore ${CMAKE_DL_LIBS})
endif(USE_JACK)
target_link_libraries(mscore rt)
endif (NOT APPLE)
# 'gold' does not use indirect shared libraries for symbol resolution, Linux only
if (NOT APPLE)
if(USE_JACK)
target_link_libraries(mscore ${CMAKE_DL_LIBS})
endif(USE_JACK)
target_link_libraries(mscore rt)
endif (NOT APPLE)
if (APPLE)
set_target_properties(mscore
PROPERTIES
LINK_FLAGS "-stdlib=libc++"
)
xcode_pch(mscore all)
install (TARGETS mscore BUNDLE DESTINATION ${CMAKE_INSTALL_PREFIX})
install (FILES data/mscore.icns DESTINATION ${Mscore_SHARE_NAME}${Mscore_INSTALL_NAME})
install (FILES data/musescoreDocument.icns DESTINATION ${Mscore_SHARE_NAME}${Mscore_INSTALL_NAME})
else (APPLE)
#### PACKAGING for Linux and BSD based systems (more in top-level CMakeLists.txt) ####
# Install mscore executable (package maintainers may add "MuseScore" and/or "musescore" aliases that symlink to mscore)
install( TARGETS mscore RUNTIME DESTINATION bin )
if (LN_EXECUTABLE)
add_custom_target(mscore_alias ALL
COMMAND echo "Creating symlink alias for mscore executable."
COMMAND ${LN_EXECUTABLE} -sf "mscore${MSCORE_INSTALL_SUFFIX}" "musescore${MSCORE_INSTALL_SUFFIX}"
COMMAND echo 'Symlink alias: musescore${MSCORE_INSTALL_SUFFIX} -> mscore${MSCORE_INSTALL_SUFFIX}'
)
install( FILES ${PROJECT_BINARY_DIR}/mscore/musescore${MSCORE_INSTALL_SUFFIX} DESTINATION bin)
else (LN_EXECUTABLE)
add_custom_target(mscore_alias ALL
COMMAND echo "No symlink aliases will be created."
VERBATIM
)
endif (LN_EXECUTABLE)
# Install MuseScore icons (use SVGs where possible, but install PNGs as backup for systems that don't support SVG)
if (MSCORE_UNSTABLE)
set(MSCORE_ICON_BASE ../assets/musescore-icon-square) # Square icons on development builds
else (MSCORE_UNSTABLE)
set(MSCORE_ICON_BASE ../assets/musescore-icon-round) # Round icons on stable releases
endif (MSCORE_UNSTABLE)
install(FILES ${MSCORE_ICON_BASE}.svg RENAME mscore${MSCORE_INSTALL_SUFFIX}.svg DESTINATION share/icons/hicolor/scalable/apps)
install(FILES ${MSCORE_ICON_BASE}-16.png RENAME mscore${MSCORE_INSTALL_SUFFIX}.png DESTINATION share/icons/hicolor/16x16/apps)
install(FILES ${MSCORE_ICON_BASE}-24.png RENAME mscore${MSCORE_INSTALL_SUFFIX}.png DESTINATION share/icons/hicolor/24x24/apps)
install(FILES ${MSCORE_ICON_BASE}-32.png RENAME mscore${MSCORE_INSTALL_SUFFIX}.png DESTINATION share/icons/hicolor/32x32/apps)
install(FILES ${MSCORE_ICON_BASE}-48.png RENAME mscore${MSCORE_INSTALL_SUFFIX}.png DESTINATION share/icons/hicolor/48x48/apps)
install(FILES ${MSCORE_ICON_BASE}-64.png RENAME mscore${MSCORE_INSTALL_SUFFIX}.png DESTINATION share/icons/hicolor/64x64/apps)
install(FILES ${MSCORE_ICON_BASE}-96.png RENAME mscore${MSCORE_INSTALL_SUFFIX}.png DESTINATION share/icons/hicolor/96x96/apps)
install(FILES ${MSCORE_ICON_BASE}-128.png RENAME mscore${MSCORE_INSTALL_SUFFIX}.png DESTINATION share/icons/hicolor/128x128/apps)
install(FILES ${MSCORE_ICON_BASE}-512.png RENAME mscore${MSCORE_INSTALL_SUFFIX}.png DESTINATION share/icons/hicolor/512x512/apps)
# Install MIME (filetype) icons for each mimetype on Linux
install( FILES ../assets/mscz-icon.svg RENAME application-x-musescore${MSCORE_INSTALL_SUFFIX}.svg
DESTINATION share/icons/hicolor/scalable/mimetypes) # SVG icon for .MSCZ files
install( FILES ../assets/mscz-icon-48.png RENAME application-x-musescore${MSCORE_INSTALL_SUFFIX}.png
DESTINATION share/icons/hicolor/48x48/mimetypes) # PNG icon for .MSCZ files
install( FILES ../assets/mscx-icon.svg RENAME application-x-musescore${MSCORE_INSTALL_SUFFIX}+xml.svg
DESTINATION share/icons/hicolor/scalable/mimetypes) # SVG icon for .MSCX files
install( FILES ../assets/mscx-icon-48.png RENAME application-x-musescore${MSCORE_INSTALL_SUFFIX}+xml.png
DESTINATION share/icons/hicolor/48x48/mimetypes) # PNG icon for .MSCX files
# use a custom icon for MusicXML files (there isn't a standard icon for MusicXML files)
install( FILES ../assets/mxl-icon.svg RENAME application-vnd.recordare.musicxml${MSCORE_INSTALL_SUFFIX}.svg
DESTINATION share/icons/hicolor/scalable/mimetypes) # SVG icon for .MXL (compressed MusicXML) files
install( FILES ../assets/mxl-icon-48.png RENAME application-vnd.recordare.musicxml${MSCORE_INSTALL_SUFFIX}.png
DESTINATION share/icons/hicolor/48x48/mimetypes) # PNG icon for .MXL (compressed MusicXML) files
install( FILES ../assets/xml-icon.svg RENAME application-vnd.recordare.musicxml${MSCORE_INSTALL_SUFFIX}+xml.svg
DESTINATION share/icons/hicolor/scalable/mimetypes) # SVG icon for .XML (MusicXML) files
install( FILES ../assets/xml-icon-48.png RENAME application-vnd.recordare.musicxml${MSCORE_INSTALL_SUFFIX}+xml.png
DESTINATION share/icons/hicolor/48x48/mimetypes) # PNG icon for .XML (MusicXML) files
# Note: Must now run "gtk-update-icon-cache" to set the new icons. This is done in the Makefile.
endif (APPLE)
if (APPLE)
set_target_properties(mscore
PROPERTIES
LINK_FLAGS "-stdlib=libc++"
)
xcode_pch(mscore all)
install (TARGETS mscore BUNDLE DESTINATION ${CMAKE_INSTALL_PREFIX})
install (FILES data/mscore.icns DESTINATION ${Mscore_SHARE_NAME}${Mscore_INSTALL_NAME})
install (FILES data/musescoreDocument.icns DESTINATION ${Mscore_SHARE_NAME}${Mscore_INSTALL_NAME})
else (APPLE)
#### PACKAGING for Linux and BSD based systems (more in top-level CMakeLists.txt) ####
# Install mscore executable (package maintainers may add "MuseScore" and/or "musescore" aliases that symlink to mscore)
install( TARGETS mscore RUNTIME DESTINATION bin )
if (LN_EXECUTABLE)
add_custom_target(mscore_alias ALL
COMMAND echo "Creating symlink alias for mscore executable."
COMMAND ${LN_EXECUTABLE} -sf "mscore${MSCORE_INSTALL_SUFFIX}" "musescore${MSCORE_INSTALL_SUFFIX}"
COMMAND echo 'Symlink alias: musescore${MSCORE_INSTALL_SUFFIX} -> mscore${MSCORE_INSTALL_SUFFIX}'
)
install( FILES ${PROJECT_BINARY_DIR}/mscore/musescore${MSCORE_INSTALL_SUFFIX} DESTINATION bin)
else (LN_EXECUTABLE)
add_custom_target(mscore_alias ALL
COMMAND echo "No symlink aliases will be created."
VERBATIM
)
endif (LN_EXECUTABLE)
# Install MuseScore icons (use SVGs where possible, but install PNGs as backup for systems that don't support SVG)
if (MSCORE_UNSTABLE)
set(MSCORE_ICON_BASE ../assets/musescore-icon-square) # Square icons on development builds
else (MSCORE_UNSTABLE)
set(MSCORE_ICON_BASE ../assets/musescore-icon-round) # Round icons on stable releases
endif (MSCORE_UNSTABLE)
install(FILES ${MSCORE_ICON_BASE}.svg RENAME mscore${MSCORE_INSTALL_SUFFIX}.svg DESTINATION share/icons/hicolor/scalable/apps)
install(FILES ${MSCORE_ICON_BASE}-16.png RENAME mscore${MSCORE_INSTALL_SUFFIX}.png DESTINATION share/icons/hicolor/16x16/apps)
install(FILES ${MSCORE_ICON_BASE}-24.png RENAME mscore${MSCORE_INSTALL_SUFFIX}.png DESTINATION share/icons/hicolor/24x24/apps)
install(FILES ${MSCORE_ICON_BASE}-32.png RENAME mscore${MSCORE_INSTALL_SUFFIX}.png DESTINATION share/icons/hicolor/32x32/apps)
install(FILES ${MSCORE_ICON_BASE}-48.png RENAME mscore${MSCORE_INSTALL_SUFFIX}.png DESTINATION share/icons/hicolor/48x48/apps)
install(FILES ${MSCORE_ICON_BASE}-64.png RENAME mscore${MSCORE_INSTALL_SUFFIX}.png DESTINATION share/icons/hicolor/64x64/apps)
install(FILES ${MSCORE_ICON_BASE}-96.png RENAME mscore${MSCORE_INSTALL_SUFFIX}.png DESTINATION share/icons/hicolor/96x96/apps)
install(FILES ${MSCORE_ICON_BASE}-128.png RENAME mscore${MSCORE_INSTALL_SUFFIX}.png DESTINATION share/icons/hicolor/128x128/apps)
install(FILES ${MSCORE_ICON_BASE}-512.png RENAME mscore${MSCORE_INSTALL_SUFFIX}.png DESTINATION share/icons/hicolor/512x512/apps)
# Install MIME (filetype) icons for each mimetype on Linux
install( FILES ../assets/mscz-icon.svg RENAME application-x-musescore${MSCORE_INSTALL_SUFFIX}.svg
DESTINATION share/icons/hicolor/scalable/mimetypes) # SVG icon for .MSCZ files
install( FILES ../assets/mscz-icon-48.png RENAME application-x-musescore${MSCORE_INSTALL_SUFFIX}.png
DESTINATION share/icons/hicolor/48x48/mimetypes) # PNG icon for .MSCZ files
install( FILES ../assets/mscx-icon.svg RENAME application-x-musescore${MSCORE_INSTALL_SUFFIX}+xml.svg
DESTINATION share/icons/hicolor/scalable/mimetypes) # SVG icon for .MSCX files
install( FILES ../assets/mscx-icon-48.png RENAME application-x-musescore${MSCORE_INSTALL_SUFFIX}+xml.png
DESTINATION share/icons/hicolor/48x48/mimetypes) # PNG icon for .MSCX files
# use a custom icon for MusicXML files (there isn't a standard icon for MusicXML files)
install( FILES ../assets/mxl-icon.svg RENAME application-vnd.recordare.musicxml${MSCORE_INSTALL_SUFFIX}.svg
DESTINATION share/icons/hicolor/scalable/mimetypes) # SVG icon for .MXL (compressed MusicXML) files
install( FILES ../assets/mxl-icon-48.png RENAME application-vnd.recordare.musicxml${MSCORE_INSTALL_SUFFIX}.png
DESTINATION share/icons/hicolor/48x48/mimetypes) # PNG icon for .MXL (compressed MusicXML) files
install( FILES ../assets/xml-icon.svg RENAME application-vnd.recordare.musicxml${MSCORE_INSTALL_SUFFIX}+xml.svg
DESTINATION share/icons/hicolor/scalable/mimetypes) # SVG icon for .XML (MusicXML) files
install( FILES ../assets/xml-icon-48.png RENAME application-vnd.recordare.musicxml${MSCORE_INSTALL_SUFFIX}+xml.png
DESTINATION share/icons/hicolor/48x48/mimetypes) # PNG icon for .XML (MusicXML) files
# Note: Must now run "gtk-update-icon-cache" to set the new icons. This is done in the Makefile.
endif (APPLE)
else ( NOT MSVC )
# Microsoft Visual Studio-specific starts here!
string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE)
# Create list of directories to search for libraries
foreach (item ${CMAKE_LIBRARY_PATH})
string( APPEND all_library_paths " /LIBPATH:${item}" )
endforeach()
# Windows: Add -mconsole to LINK_FLAGS to get a console window for debug output
if(CMAKE_BUILD_TYPE MATCHES "DEBUG")
set_target_properties( mscore
PROPERTIES
COMPILE_FLAGS "${PCH_INCLUDE} ${QT_DEFINITIONS} -DQT_SVG_LIB -DQT_GUI_LIB -DQT_XML_LIB -DQT_CORE_LIB"
LINK_FLAGS "/LIBPATH:${QT_INSTALL_PREFIX}/lib ${all_library_paths}"
#LINK_FLAGS "-mwindows -mconsole -L ${QT_INSTALL_PREFIX}/lib"
)
else(CMAKE_BUILD_TYPE MATCHES "DEBUG")
set_target_properties( mscore
PROPERTIES
COMPILE_FLAGS "${PCH_INCLUDE} ${QT_DEFINITIONS} -DQT_SVG_LIB -DQT_GUI_LIB -DQT_XML_LIB -DQT_CORE_LIB"
LINK_FLAGS "/LIBPATH:${QT_INSTALL_PREFIX}/lib ${all_library_paths}"
# LINK_FLAGS "-Wl,-S -mwindows -L ${QT_INSTALL_PREFIX}/lib"
)
endif(CMAKE_BUILD_TYPE MATCHES "DEBUG")
target_link_libraries(mscore
portaudio
portmidi
winmm
mscore_freetype
zlibstat
)
if (OMR)
target_link_libraries(mscore omr poppler)
if (OCR)
target_link_libraries(mscore tesseract_api)
endif (OCR)
endif (OMR)
# Use pre-compiled headers
vstudio_pch( mscore )
# Copy DLL dependencies to .EXE DIRECTORY
list(APPEND dlls_to_copy
"${QT_INSTALL_PREFIX}/bin/Qt5Core.dll" "${QT_INSTALL_PREFIX}/bin/Qt5Gui.dll" "${QT_INSTALL_PREFIX}/bin/Qt5Help.dll"
"${QT_INSTALL_PREFIX}/bin/Qt5Network.dll" "${QT_INSTALL_PREFIX}/bin/Qt5PrintSupport.dll"
"${QT_INSTALL_PREFIX}/bin/Qt5Qml.dll" "${QT_INSTALL_PREFIX}/bin/Qt5Quick.dll" "${QT_INSTALL_PREFIX}/bin/Qt5Sql.dll"
"${QT_INSTALL_PREFIX}/bin/Qt5Svg.dll" "${QT_INSTALL_PREFIX}/bin/Qt5Widgets.dll" "${QT_INSTALL_PREFIX}/bin/Qt5Xml.dll"
"${QT_INSTALL_PREFIX}/bin/Qt5XmlPatterns.dll"
)
set(CMAKE_FIND_LIBRARY_PREFIX "")
set(CMAKE_FIND_LIBRARY_SUFFIXES ".dll")
find_library( dll_lame NAMES "lame_enc.dll" PATHS ${CMAKE_LIBRARY_PATH} )
find_library( dll_ogg NAMES "libogg.dll" PATHS ${CMAKE_LIBRARY_PATH} )
find_library( dll_sndfile NAMES "libsndfile-1.dll" PATHS ${CMAKE_LIBRARY_PATH} )
find_library( dll_vorbis NAMES "libvorbis.dll" PATHS ${CMAKE_LIBRARY_PATH} )
find_library( dll_vorbisfile NAMES "libvorbisfile.dll" PATHS ${CMAKE_LIBRARY_PATH} )
find_library( dll_portaudio NAMES "portaudio.dll" PATHS ${CMAKE_LIBRARY_PATH} )
list(APPEND dlls_to_copy ${dll_lame} ${dll_ogg} ${dll_sndfile} ${dll_vorbis} ${dll_vorbisfile} ${dll_portaudio})
set( output_dir_for_dlls "$<TARGET_FILE_DIR:mscore>")
COPY_FILES_INTO_DIRECTORY_IF_CHANGED( "${dlls_to_copy}" ${output_dir_for_dlls} mscore)
###add_custom_command (TARGET mscore POST_BUILD
### # Copy Qt5 dependencies to .exe directory
### COMMAND ${CMAKE_COMMAND} -E copy_if_different ${QT_INSTALL_PREFIX}/bin/Qt5Core.dll ${PROJECT_BINARY_DIR}
### COMMAND ${CMAKE_COMMAND} -E copy_if_different ${QT_INSTALL_PREFIX}/bin/Qt5Gui.dll ${PROJECT_BINARY_DIR}
### COMMAND ${CMAKE_COMMAND} -E copy_if_different ${QT_INSTALL_PREFIX}/bin/Qt5Help.dll ${PROJECT_BINARY_DIR}
### COMMAND ${CMAKE_COMMAND} -E copy_if_different ${QT_INSTALL_PREFIX}/bin/Qt5Network.dll ${PROJECT_BINARY_DIR}
### COMMAND ${CMAKE_COMMAND} -E copy_if_different ${QT_INSTALL_PREFIX}/bin/Qt5PrintSupport.dll ${PROJECT_BINARY_DIR}
### COMMAND ${CMAKE_COMMAND} -E copy_if_different ${QT_INSTALL_PREFIX}/bin/Qt5Qml.dll ${PROJECT_BINARY_DIR}
### COMMAND ${CMAKE_COMMAND} -E copy_if_different ${QT_INSTALL_PREFIX}/bin/Qt5Quick.dll ${PROJECT_BINARY_DIR}
### COMMAND ${CMAKE_COMMAND} -E copy_if_different ${QT_INSTALL_PREFIX}/bin/Qt5Sql.dll ${PROJECT_BINARY_DIR}
### COMMAND ${CMAKE_COMMAND} -E copy_if_different ${QT_INSTALL_PREFIX}/bin/Qt5Svg.dll ${PROJECT_BINARY_DIR}
### COMMAND ${CMAKE_COMMAND} -E copy_if_different ${QT_INSTALL_PREFIX}/bin/Qt5Widgets.dll ${PROJECT_BINARY_DIR}
### COMMAND ${CMAKE_COMMAND} -E copy_if_different ${QT_INSTALL_PREFIX}/bin/Qt5Xml.dll ${PROJECT_BINARY_DIR}
### COMMAND ${CMAKE_COMMAND} -E copy_if_different ${QT_INSTALL_PREFIX}/bin/Qt5XmlPatterns.dll ${PROJECT_BINARY_DIR}
###
### # Copy other dependencies to .EXE directory
### COMMAND ${CMAKE_COMMAND} -E copy_if_different ${QT_INSTALL_PREFIX}/bin/Qt5Core.dll ${PROJECT_BINARY_DIR}
### COMMAND ${CMAKE_COMMAND} -E copy_if_different ${QT_INSTALL_PREFIX}/bin/Qt5Core.dll ${PROJECT_BINARY_DIR}
### COMMAND ${CMAKE_COMMAND} -E copy_if_different ${QT_INSTALL_PREFIX}/bin/Qt5Core.dll ${PROJECT_BINARY_DIR}
###
###
###
### COMMENT "Copying libraries to output directory" VERBATIM)
# Keep dependencies in alphabetical order. Changes made to this list
# might need to be made in "build/Linux+BSD/portable/copy-libs" too.
get_filename_component(COMPILER_DIR ${CMAKE_CXX_COMPILER} DIRECTORY)
get_filename_component (MINGW_ROOT ${COMPILER_DIR} DIRECTORY)
foreach (QtLibrary ${QT_LIBRARIES})
message("Library ${QtLibrary}")
# always use release libs
set_target_properties(${QtLibrary} PROPERTIES MAP_IMPORTED_CONFIG_DEBUG "RELEASE")
get_target_property(QtSharedLibrary ${QtLibrary} LOCATION_RELEASE)
if (EXISTS ${QtSharedLibrary})
list (APPEND QtInstallLibraries ${QtSharedLibrary})
endif (EXISTS ${QtSharedLibrary})
endforeach (QtLibrary ${QT_LIBRARIES})
list(REMOVE_DUPLICATES QtInstallLibraries)
target_link_libraries(mscore ${QT_LIBRARIES})
### MINGW stuff that will need to be converted for MSVC...
#####install( TARGETS mscore RUNTIME DESTINATION bin )
#####
#####install( FILES
##### ${MINGW_ROOT}/bin/libgcc_s_dw2-1.dll
##### ${MINGW_ROOT}/bin/libstdc++-6.dll
##### ${MINGW_ROOT}/bin/libwinpthread-1.dll
##### ${MINGW_ROOT}/lib/libogg.dll
##### ${MINGW_ROOT}/lib/libsndfile-1.dll
##### ${MINGW_ROOT}/lib/libvorbis.dll
##### ${MINGW_ROOT}/lib/libvorbisfile.dll
##### ${MINGW_ROOT}/lib/portaudio.dll
##### ${MINGW_ROOT}/opt/bin/libeay32.dll
##### ${MINGW_ROOT}/opt/bin/ssleay32.dll
##### ${QtInstallLibraries}
##### ${PROJECT_SOURCE_DIR}/build/qt.conf
##### DESTINATION bin)
#####
#####install (FILES
##### ${MINGW_ROOT}/lib/lame_enc.dll
##### DESTINATION bin
##### OPTIONAL)
#####
##### install(FILES
##### ${QT_INSTALL_PREFIX}/plugins/iconengines/qsvgicon.dll
##### DESTINATION bin/iconengines)
#####
##### install(FILES
##### ${QT_INSTALL_PREFIX}/plugins/imageformats/qjpeg.dll
##### ${QT_INSTALL_PREFIX}/plugins/imageformats/qsvg.dll
##### ${QT_INSTALL_PREFIX}/plugins/imageformats/qtiff.dll
##### DESTINATION bin/imageformats)
#####
##### install(FILES
##### ${QT_INSTALL_PREFIX}/plugins/platforms/qwindows.dll
##### DESTINATION bin/platforms)
#####
##### install(FILES
##### ${QT_INSTALL_PREFIX}/plugins/printsupport/windowsprintersupport.dll
##### DESTINATION bin/printsupport)
#####
##### install(FILES
##### ${QT_INSTALL_PREFIX}/plugins/sqldrivers/qsqlite.dll
##### DESTINATION bin/sqldrivers)
#####
##### install(DIRECTORY
##### ${QT_INSTALL_PREFIX}/qml
##### DESTINATION .
##### REGEX ".*d\\.dll" EXCLUDE
##### REGEX ".*QtGraphicalEffects.*" EXCLUDE
##### REGEX ".*QtMultimedia.*" EXCLUDE
##### REGEX ".*QtSensors.*" EXCLUDE
##### REGEX ".*QtTest.*" EXCLUDE
##### REGEX ".*QtWebkit.*" EXCLUDE)
endif ( NOT MSVC )
endif (MINGW)
if (APPLE)
@ -695,6 +876,8 @@ if (APPLE)
REGEX ".*_debug\\.dylib" EXCLUDE)
endif (APPLE)
ADD_DEPENDENCIES(${ExecutableName} mops1)
ADD_DEPENDENCIES(${ExecutableName} mops2)
# MSVC does not depend on mops1 & mops2 for PCH
if (NOT MSVC)
ADD_DEPENDENCIES(${ExecutableName} mops1)
ADD_DEPENDENCIES(${ExecutableName} mops2)
endif (NOT MSVC)

View file

@ -29,9 +29,15 @@ if (OCR)
set (OCR_SRC ocr.cpp)
endif (OCR)
if (NOT MSVC)
set(_all_h_file "${PROJECT_BINARY_DIR}/all.h")
else (NOT MSVC)
set(_all_h_file "${PROJECT_SOURCE_DIR}/all.h")
endif (NOT MSVC)
add_library (
omr STATIC
${PROJECT_BINARY_DIR}/all.h
${_all_h_file}
${PCH}
omrview.cpp pdf.cpp omrpage.cpp
skew.cpp utils.cpp
@ -39,14 +45,28 @@ add_library (
${OCR_SRC}
)
set_target_properties (
if (NOT MSVC)
set_target_properties (
omr
PROPERTIES
COMPILE_FLAGS "${PCH_INCLUDE} -g -Wall -Wextra -Winvalid-pch -Wno-unused-private-field"
)
else (NOT MSVC)
set_target_properties (
omr
PROPERTIES
COMPILE_FLAGS "${PCH_INCLUDE}" # TODO: Add disabling of unused private field warning?
)
endif (NOT MSVC)
xcode_pch(omr all)
ADD_DEPENDENCIES(omr mops1)
ADD_DEPENDENCIES(omr mops2)
# Use MSVC pre-compiled headers
vstudio_pch( omr )
# MSVC does not depend on mops1 & mops2 for PCH
if (NOT MSVC)
ADD_DEPENDENCIES(omr mops1)
ADD_DEPENDENCIES(omr mops2)
endif (NOT MSVC)

View file

@ -18,22 +18,42 @@ else (APPLE)
set(INCS "")
endif (APPLE)
if (NOT MSVC)
set(_all_h_file "${PROJECT_BINARY_DIR}/all.h")
else (NOT MSVC)
set(_all_h_file "${PROJECT_SOURCE_DIR}/all.h")
endif (NOT MSVC)
add_library (synthesizer STATIC
${PROJECT_BINARY_DIR}/all.h
${_all_h_file}
${PCH}
msynthesizer.cpp
event.cpp
synthesizergui.cpp
${INCS}
)
set_target_properties (
if (NOT MSVC)
set_target_properties (
synthesizer
PROPERTIES
COMPILE_FLAGS "${PCH_INCLUDE} -g -Wall -Wextra -Winvalid-pch"
)
else (NOT MSVC)
set_target_properties (
synthesizer
PROPERTIES
COMPILE_FLAGS "${PCH_INCLUDE}"
)
endif (NOT MSVC)
xcode_pch(synthesizer all)
ADD_DEPENDENCIES(synthesizer mops1)
ADD_DEPENDENCIES(synthesizer mops2)
# Use MSVC pre-compiled headers
vstudio_pch( synthesizer )
# MSVC does not depend on mops1 & mops2 for PCH
if (NOT MSVC)
ADD_DEPENDENCIES(synthesizer mops1)
ADD_DEPENDENCIES(synthesizer mops2)
endif (NOT MSVC)

View file

@ -12,13 +12,26 @@ add_library (
Agent.cpp
)
set_target_properties( beatroot
PROPERTIES
COMPILE_FLAGS "${PCH_INCLUDE} -g -Wall -Wextra -Winvalid-pch"
)
if (NOT MSVC)
set_target_properties( beatroot
PROPERTIES
COMPILE_FLAGS "${PCH_INCLUDE} -g -Wall -Wextra -Winvalid-pch"
)
else (NOT MSVC)
set_target_properties ( beatroot
PROPERTIES
COMPILE_FLAGS "${PCH_INCLUDE}"
)
endif (NOT MSVC)
xcode_pch(beatroot all)
ADD_DEPENDENCIES(beatroot mops1)
ADD_DEPENDENCIES(beatroot mops2)
# Use MSVC pre-compiled headers
vstudio_pch( beatroot )
# MSVC does not depend on mops1 & mops2 for PCH
if (NOT MSVC)
ADD_DEPENDENCIES(beatroot mops1)
ADD_DEPENDENCIES(beatroot mops2)
endif (NOT MSVC)

View file

@ -26,21 +26,40 @@ else (APPLE)
set(INCS "")
endif (APPLE)
if (NOT MSVC)
set(_all_h_file "${PROJECT_BINARY_DIR}/all.h")
else (NOT MSVC)
set(_all_h_file "${PROJECT_SOURCE_DIR}/all.h")
endif (NOT MSVC)
add_library(diff_match_patch STATIC
diff_match_patch.cpp
${PROJECT_BINARY_DIR}/all.h
${_all_h_file}
${PCH}
${INCS}
)
set_target_properties (
if (NOT MSVC)
set_target_properties (
diff_match_patch
PROPERTIES
COMPILE_FLAGS "${PCH_INCLUDE} -g -Wall -Wextra -Winvalid-pch"
)
else (NOT MSVC)
set_target_properties (
diff_match_patch
PROPERTIES
COMPILE_FLAGS "${PCH_INCLUDE}"
)
endif (NOT MSVC)
xcode_pch(diff_match_patch all)
ADD_DEPENDENCIES(diff_match_patch mops1)
ADD_DEPENDENCIES(diff_match_patch mops2)
# Use MSVC pre-compiled headers
vstudio_pch( diff_match_patch )
# MSVC does not depend on mops1 & mops2 for PCH
if (NOT MSVC)
ADD_DEPENDENCIES(diff_match_patch mops1)
ADD_DEPENDENCIES(diff_match_patch mops2)
endif (NOT MSVC)

View file

@ -188,7 +188,7 @@ add_library(mscore_freetype
${BASE_SRCS}
)
if (MSVC)
set_target_properties(freetype PROPERTIES
COMPILE_FLAGS /Fd"$(IntDir)$(TargetName).pdb")
endif ()
###-###if (MSVC)
###-### set_target_properties(freetype PROPERTIES
###-### COMPILE_FLAGS /Fd"$(IntDir)$(TargetName).pdb")
###-###endif ()

View file

@ -26,25 +26,45 @@ else (APPLE)
set(INCS "")
endif (APPLE)
if (NOT MSVC)
set(_all_h_file "${PROJECT_BINARY_DIR}/all.h")
else (NOT MSVC)
set(_all_h_file "${PROJECT_SOURCE_DIR}/all.h")
endif (NOT MSVC)
add_library(kqoauth STATIC
kqoauthauthreplyserver.cpp
kqoauthrequest.cpp
kqoauthrequest_xauth.cpp
kqoauthmanager.cpp
kqoauthutils.cpp
${PROJECT_BINARY_DIR}/all.h
${_all_h_file}
${PCH}
${INCS}
)
set_target_properties (
if (NOT MSVC)
set_target_properties (
kqoauth
PROPERTIES
COMPILE_FLAGS "${PCH_INCLUDE} -I ${PROJECT_SOURCE_DIR}/thirdparty/openssl/include -g -Wall -Wextra -Winvalid-pch"
)
else (NOT MSVC)
set_target_properties (
kqoauth
PROPERTIES
COMPILE_FLAGS "${PCH_INCLUDE} /I${PROJECT_SOURCE_DIR}/thirdparty/openssl/include"
)
endif (NOT MSVC)
xcode_pch(kqoauth all)
ADD_DEPENDENCIES(kqoauth mops1)
ADD_DEPENDENCIES(kqoauth mops2)
# Use MSVC pre-compiled headers
vstudio_pch( kqoauth )
# MSVC does not depend on mops1 & mops2 for PCH
if (NOT MSVC)
ADD_DEPENDENCIES(kqoauth mops1)
ADD_DEPENDENCIES(kqoauth mops2)
endif (NOT MSVC)

View file

@ -26,21 +26,41 @@ else (APPLE)
set(INCS "")
endif (APPLE)
if (NOT MSVC)
set(_all_h_file "${PROJECT_BINARY_DIR}/all.h")
else (NOT MSVC)
set(_all_h_file "${PROJECT_SOURCE_DIR}/all.h")
endif (NOT MSVC)
add_library(ofqf STATIC
${PROJECT_BINARY_DIR}/all.h
${_all_h_file}
${PCH}
${INCS}
qoscclient.cpp qoscserver.cpp qosctypes.cpp
)
set_target_properties (
if (NOT MSVC)
set_target_properties (
ofqf
PROPERTIES
COMPILE_FLAGS "${PCH_INCLUDE} -g -Wall -Wextra -Winvalid-pch"
)
else (NOT MSVC)
set_target_properties (
ofqf
PROPERTIES
COMPILE_FLAGS "${PCH_INCLUDE}"
)
endif (NOT MSVC)
xcode_pch(ofqf all)
ADD_DEPENDENCIES(ofqf mops1)
ADD_DEPENDENCIES(ofqf mops2)
# Use MSVC pre-compiled headers
vstudio_pch( ofqf )
# MSVC does not depend on mops1 & mops2 for PCH
if (NOT MSVC)
ADD_DEPENDENCIES(ofqf mops1)
ADD_DEPENDENCIES(ofqf mops2)
endif (NOT MSVC)

View file

@ -139,7 +139,20 @@ else (APPLE)
if (MINGW)
set (POPPLER_COMPILE_FLAGS "-O2 -Wall -Wextra -Wno-write-strings -ansi -Wnon-virtual-dtor -Woverloaded-virtual -Wno-unused-parameter -Wno-missing-field-initializers -Wno-unused-but-set-variable -Wno-format -std=c++11")
else (MINGW)
set (POPPLER_COMPILE_FLAGS "-O2 -Wno-write-strings -ansi -Wnon-virtual-dtor -Woverloaded-virtual -Wno-unused-parameter -Wno-missing-field-initializers -Wno-unused-but-set-variable -std=c++11")
if (NOT MSVC)
set (POPPLER_COMPILE_FLAGS "-O2 -Wno-write-strings -ansi -Wnon-virtual-dtor -Woverloaded-virtual -Wno-unused-parameter -Wno-missing-field-initializers -Wno-unused-but-set-variable -std=c++11")
else (NOT MSVC)
# For MSVC:
# -O2: controls optimization, not compatible with global options
# -ansi & -std=c++11 -> gloablly set /std:c++14 should take care.
# -Wno-write-strings -> ???
# -Wno-unused-parameter -> Warning C4100: 'identifier' : unreferenced formal parameter
# -Wnon-virtual-dtor -> /Wall enabled all warnings, no need to enable particularly (Warning C4265: 'classname': class has virtual functions, but destructor is not virtual\n instances of this class may not be destructed correctly)
# -Woverloaded-virtual -> /Wall enabled all warnings, no need to enable particularly
# -Wno-missing-field-initializers -> ???
# -Wno-unused-but-set-variable -> Warning C4189: 'identifier': local variable is initialized but not referenced
set (POPPLER_COMPILE_FLAGS "/wd4100 /wd4189")
endif (NOT MSVC)
endif(MINGW)
endif(APPLE)

View file

@ -19,21 +19,42 @@ else (APPLE)
set(INCS "")
endif (APPLE)
if (NOT MSVC)
set(_all_h_file "${PROJECT_BINARY_DIR}/all.h")
else (NOT MSVC)
set(_all_h_file "${PROJECT_SOURCE_DIR}/all.h")
endif (NOT MSVC)
add_library(qzip STATIC
qzip.cpp
${PROJECT_BINARY_DIR}/all.h
${_all_h_file}
${PCH}
${INCS}
)
set_target_properties (
if (NOT MSVC)
set_target_properties (
qzip
PROPERTIES
COMPILE_FLAGS "${PCH_INCLUDE} -g -Wall -Wextra -Winvalid-pch"
)
else (NOT MSVC)
set_target_properties (
qzip
PROPERTIES
COMPILE_FLAGS "${PCH_INCLUDE}"
)
include_directories("${PROJECT_SOURCE_DIR}/dependencies/include/zlib")
endif (NOT MSVC)
xcode_pch(qzip all)
ADD_DEPENDENCIES(qzip mops1)
ADD_DEPENDENCIES(qzip mops2)
# Use MSVC pre-compiled headers
vstudio_pch( qzip )
# MSVC does not depend on mops1 & mops2 for PCH
if (NOT MSVC)
ADD_DEPENDENCIES(qzip mops1)
ADD_DEPENDENCIES(qzip mops2)
endif (NOT MSVC)

View file

@ -25,9 +25,15 @@ else (APPLE)
set(INCS "")
endif (APPLE)
if (NOT MSVC)
set(_all_h_file "${PROJECT_BINARY_DIR}/all.h")
else (NOT MSVC)
set(_all_h_file "${PROJECT_SOURCE_DIR}/all.h")
endif (NOT MSVC)
add_library (
rtf2html STATIC
${PROJECT_BINARY_DIR}/all.h
${_all_h_file}
${INCS}
fmt_opts.cpp
rtf2html.cpp
@ -35,13 +41,26 @@ add_library (
rtf_table.cpp
)
set_target_properties( rtf2html
PROPERTIES
COMPILE_FLAGS "${PCH_INCLUDE} -g -Wall -Wextra -Winvalid-pch"
)
if (NOT MSVC)
set_target_properties( rtf2html
PROPERTIES
COMPILE_FLAGS "${PCH_INCLUDE} -g -Wall -Wextra -Winvalid-pch"
)
else (NOT MSVC)
set_target_properties ( rtf2html
PROPERTIES
COMPILE_FLAGS "${PCH_INCLUDE}"
)
endif (NOT MSVC)
xcode_pch(rtf2html all)
ADD_DEPENDENCIES(rtf2html mops1)
ADD_DEPENDENCIES(rtf2html mops2)
# Use MSVC pre-compiled headers
vstudio_pch( rtf2html )
# MSVC does not depend on mops1 & mops2 for PCH
if (NOT MSVC)
ADD_DEPENDENCIES(rtf2html mops1)
ADD_DEPENDENCIES(rtf2html mops2)
endif (NOT MSVC)

View file

@ -20,21 +20,41 @@
include (${PROJECT_SOURCE_DIR}/build/gch.cmake)
if (NOT MSVC)
set(_all_h_file "${PROJECT_BINARY_DIR}/all.h")
else (NOT MSVC)
set(_all_h_file "${PROJECT_SOURCE_DIR}/all.h")
endif (NOT MSVC)
add_library (
qtsingleapp STATIC
${PROJECT_BINARY_DIR}/all.h
${_all_h_file}
${PCH}
qtsingleapplication.cpp
qtlocalpeer.cpp
)
set_target_properties (
qtsingleapp
PROPERTIES
COMPILE_FLAGS "${PCH_INCLUDE} -g -Wall -Wextra -Winvalid-pch"
)
if (NOT MSVC)
set_target_properties (
qtsingleapp
PROPERTIES
COMPILE_FLAGS "${PCH_INCLUDE} -g -Wall -Wextra -Winvalid-pch"
)
else (NOT MSVC)
set_target_properties (
qtsingleapp
PROPERTIES
COMPILE_FLAGS "${PCH_INCLUDE}"
)
endif (NOT MSVC)
xcode_pch(qtsingleapp all)
ADD_DEPENDENCIES(qtsingleapp mops1)
ADD_DEPENDENCIES(qtsingleapp mops2)
# Use MSVC pre-compiled headers
vstudio_pch( qtsingleapp )
# MSVC does not depend on mops1 & mops2 for PCH
if (NOT MSVC)
ADD_DEPENDENCIES(qtsingleapp mops1)
ADD_DEPENDENCIES(qtsingleapp mops2)
endif (NOT MSVC)

View file

@ -26,11 +26,19 @@ add_library(xmlstream STATIC
${INCS}
)
set_target_properties (
if (NOT MSVC)
set_target_properties (
xmlstream
PROPERTIES
COMPILE_FLAGS "${PCH_INCLUDE} -g -Wall -Wextra -Winvalid-pch"
)
else (NOT MSVC)
set_target_properties (
xmlstream
PROPERTIES
COMPILE_FLAGS "${PCH_INCLUDE} ${PCH_FORCE_USE}"
)
endif (NOT MSVC)
xcode_pch(xmlstream all)

View file

@ -14,6 +14,12 @@ include (${PROJECT_SOURCE_DIR}/build/gch.cmake)
QT5_WRAP_UI (zerberusUi zerberus_gui.ui)
if (NOT MSVC)
set(_all_h_file "${PROJECT_BINARY_DIR}/all.h")
else (NOT MSVC)
set(_all_h_file "${PROJECT_SOURCE_DIR}/all.h")
endif (NOT MSVC)
add_library (zerberus STATIC
${zerberusUi}
channel.cpp
@ -24,19 +30,33 @@ add_library (zerberus STATIC
zerberus.cpp
zone.cpp
zerberusgui.cpp
${PROJECT_BINARY_DIR}/all.h
${_all_h_file}
${PCH}
${INCS}
)
set_target_properties (
if (NOT MSVC)
set_target_properties (
zerberus
PROPERTIES
COMPILE_FLAGS "${PCH_INCLUDE} -g -Wall -Wextra -Winvalid-pch"
)
else (NOT MSVC)
set_target_properties (
zerberus
PROPERTIES
COMPILE_FLAGS "${PCH_INCLUDE}"
)
endif (NOT MSVC)
xcode_pch(zerberus all)
ADD_DEPENDENCIES(zerberus mops1)
ADD_DEPENDENCIES(zerberus mops2)
# Use MSVC pre-compiled headers
vstudio_pch( zerberus )
# MSVC does not depend on mops1 & mops2 for PCH
if (NOT MSVC)
ADD_DEPENDENCIES(zerberus mops1)
ADD_DEPENDENCIES(zerberus mops2)
endif (NOT MSVC)