forked from jasder/antlr
All C++ runtime tests pass now.
- A few remaining changes had to be done for the C++ runtime tests which now completely pass. - Added a runtime testing overview document. - Added a description of C++ target. - Updated the ANTLR release document.
This commit is contained in:
parent
ac664a91b8
commit
4a6b68c6f6
|
@ -0,0 +1,73 @@
|
|||
# C++
|
||||
|
||||
The C++ target supports all platforms that can either run MS Visual Studio 2013 (or newer), XCode 7 (or newer) or CMake (C++11 required). All build tools can either create static or dynamic libraries, both as 64bit or 32bit arch. Additionally, XCode can create an iOS library.
|
||||
|
||||
## How to create a C++ lexer or parser?
|
||||
This is pretty much the same as creating a Java lexer or parser, except you need to specify the language target, for example:
|
||||
|
||||
```
|
||||
$ antlr4 -Dlanguage=Cpp MyGrammar.g4
|
||||
```
|
||||
|
||||
You will see that there are a whole bunch of files generated by this call. If visitor or listener are not suppressed (which is the default) you'll get:
|
||||
|
||||
* MyGrammarLexer.h + MyGrammarLexer.cpp
|
||||
* MyGrammarParser.h + MyGrammarParser.cpp
|
||||
* MyGrammarVisitor.h + MyGrammarVisitor.cpp
|
||||
* MyGrammarBaseVisitor.h + MyGrammarBaseVisitor.cpp
|
||||
* MyGrammarListener.h + MyGrammarListener.cpp
|
||||
* MyGrammarBaseListener.h + MyGrammarBaseListener.cpp
|
||||
|
||||
## Where can I get the runtime?
|
||||
|
||||
Once you've generated the lexer and/or parser code, you need to download or build the runtime. Prebuilt C++ runtime binaries for Windows (VS 2013 runtime), OSX and iOS are available on the ANTLR web site:
|
||||
|
||||
* http://www.antlr.org
|
||||
|
||||
Use CMake to build a Linux library (works also on OSX, if you don't have XCode, as we use pure C++ code). Building your own library on OSX or Windows is trivial, however. Just open the VS or XCode project, select target + arch and build it. Should work out of the box without any additional dependency.
|
||||
|
||||
|
||||
## How do I run the generated lexer and/or parser?
|
||||
|
||||
Putting it all together to get a working parser is really easy. Look in the [runtime/Cpp/demo](../runtime/Cpp/demo) folder for a simple example. The [README](../runtime/Cpp/demo/README.md) there describes shortly how to build and run the demo on OSX, Windows or Linux.
|
||||
|
||||
## How do I create and run a custom listener?
|
||||
|
||||
The generation step above created a listener and base listener class for you. The listener class is an abstract interface, which declares enter and exit methods for each of your parser rules. The base listener is implements all those abstract methods with an empty body, so you don't have to do it yourself if you just want to implement a single function. Hence use this base listener as the base class for your custom listener:
|
||||
|
||||
```c++
|
||||
#include <iostream>
|
||||
|
||||
#include "antlr4-runtime.h"
|
||||
#include "MyGrammarLexer.h"
|
||||
#include "MyGrammarParser.h"
|
||||
#include "MyGrammarBaseListener.h"
|
||||
|
||||
using namespace org::antlr::v4::runtime;
|
||||
|
||||
class TreeShapeListener : public MyGrammarBaseListener {
|
||||
public:
|
||||
void enterKey(Ref<ParserRuleContext> ctx) {
|
||||
// Do something when entering the key rule.
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
int main(int argc, const char* argv[]) {
|
||||
std::wifstream stream;
|
||||
stream.open(argv[1]);
|
||||
ANTLRInputStream input("ae");
|
||||
MyGrammarLexer lexer(&input);
|
||||
CommonTokenStream tokens(&lexer);
|
||||
MyGrammarParser parser(&tokens);
|
||||
|
||||
Ref<tree::ParseTree> tree = parser.key();
|
||||
Ref<TreeShapeListener> listener(new TreeShapeListener());
|
||||
tree::ParseTreeWalker::DEFAULT->walk(listener, tree);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
This example assumes your grammar contains a parser rule named `key` for which the enterKey function was generated. The `Ref<>` template is an alias for `std::shared_ptr<>` to simplify the runtime source code which often makes use of smart pointers.
|
|
@ -16,6 +16,9 @@ $ git push upstream :refs/tags/4.5.2
|
|||
|
||||
Edit the repository looking for 4.5 or whatever and update it. Bump version in the following files:
|
||||
|
||||
* runtime/Cpp/VERSION
|
||||
* runtime/Cpp/runtime/antlr4cpp.vcxproj
|
||||
* runtime/Cpp/runtime/antlrcpp.xcodeproj
|
||||
* runtime/Java/src/org/antlr/v4/runtime/RuntimeMetaData.java
|
||||
* runtime/Python2/setup.py
|
||||
* runtime/Python2/src/antlr4/Recognizer.py
|
||||
|
@ -25,6 +28,7 @@ Edit the repository looking for 4.5 or whatever and update it. Bump version in t
|
|||
* runtime/JavaScript/src/antlr4/package.json
|
||||
* runtime/JavaScript/src/antlr4/Recognizer.js
|
||||
* tool/src/org/antlr/v4/codegen/target/CppTarget.java
|
||||
* tool/src/org/antlr/v4/codegen/target/CppTarget.java
|
||||
* tool/src/org/antlr/v4/codegen/target/CSharpTarget.java
|
||||
* tool/src/org/antlr/v4/codegen/target/JavaScriptTarget.java
|
||||
* tool/src/org/antlr/v4/codegen/target/Python2Target.java
|
||||
|
|
|
@ -0,0 +1,41 @@
|
|||
# Overview of the ANTLR Runtime Test Suite
|
||||
|
||||
An important part of ANTLR4 is its runtime test suite, which consist of 2 subparts:
|
||||
|
||||
* Tests for the tool itself
|
||||
* Tests for the ANTLR runtime
|
||||
|
||||
Usually the tests are executed while compiling and installing an ANTLR4 jar from source code. The command for that is simply:
|
||||
|
||||
```bash
|
||||
$ mvn install
|
||||
```
|
||||
|
||||
to be executed in the root of the ANTLR4 repository. More details about this can be found in [Building ANTLR](building-antlr.md).
|
||||
|
||||
However, you don't need to run the installation again and again just to run the tests. Instead use
|
||||
|
||||
```bash
|
||||
$ mvn test
|
||||
```
|
||||
|
||||
to only trigger testing. You can find all runtime tests in the [runtime-testsuite/resources/org/antlr/v4/test/runtime](../runtime-testsuite/resources/org/antlr/v4/test/runtime) subfolder (tool tests under [tool-testsuite/test/org/antlr/v4/test/tool](../tool-testsuite/test/org/antlr/v4/test/tool)). The tool tests are just a bunch of Java test cases that test the tool's internal behavior (e.g. for code generation). We focus on the runtime tests here.
|
||||
|
||||
The underlying process of running the tests is quite a complicated setup to cater especially for a flexible test specification that can run with different target runtimes. Everything runs in Java, except for the actual target runtime tests. Runtime tests run first, followed by the tool tests. If there was a test failure in the first step, the tool tests are not executed, however. These are the steps involved when running the runtime tests:
|
||||
|
||||
* Generate Java JUnit test cases from the test templates, once for each target (C++, C#, Python, Java, Javascript atm.).
|
||||
* These test cases generate grammar files when executed and run the target specific parser generation step, including compiling a binary, if necessary (e.g. for C++ and C#).
|
||||
* Finally run the compiled test module using the input specified in the test template. The output (usually a token or parse tree dump) is then compared against the expected output, specified in the test template as well. This also includes any error messages written to the console.
|
||||
|
||||
## Generating JUnit Tests
|
||||
|
||||
The test specification part makes heavy use of the StringTemplate engine to allow defining target language agnostic tests. For that all tests are described in template (`stg`) files. You can find them in the [templates](../runtime-testsuite/resources/org/antlr/v4/test/runtime/templates) subfolder of the runtime tests folder. Read more about the folder structure in the [adding-tests.md](adding-tests.md) file. As lined out there you have to run
|
||||
|
||||
```bash
|
||||
$ mvn -Pgen generate-test-sources
|
||||
```
|
||||
everytime you change any of the test templates or your target language specific template (which is used to translate certain text to your specific language). And a small hint: this command can be executed from the ANTLR source root as well. No need to dig into a subfolder.
|
||||
|
||||
## Running the Generated Tests
|
||||
|
||||
After generation you can run the tests as written above (`mvn install` or `mvn test`, both recompile ANTLR if necessary), which takes about 40 minutes for the full set (of which 30 mins are alone consumed by the C++ target tests). Which tests actually run is controlled by the [runtime tests pom.xml file](../runtime-testsuite/pom.xml). Look for the `maven-surefire-plugin` plugin entry and especially its includes. If you ever want to run tests only for a specific target, comment out all other `<include>` elements. For a specific test change the wildcard to that specific test name. This is especially helpful when debugging a test (e.g. when it fails) or when creating/changing tests. Additionally, some targets require to install additional dependencies you may not want to add to your box (e.g. mono, python 3.5) just to run e.g. the Java or C++ tests.
|
|
@ -14,9 +14,9 @@ ANTLR 4 is the result of substantial effort of the following people:
|
|||
|
||||
The C++ target has been the work of the following people:
|
||||
|
||||
* Dan McLaughlin, dan.mclaughlin@gmail.com C++ Target project leader
|
||||
* David Sisson, dsisson@google.com
|
||||
* [Mike Lischke](www.soft-gems.net), mike@lischke-online.de
|
||||
* Dan McLaughlin, dan.mclaughlin@gmail.com (initial port, got code to compile)
|
||||
* David Sisson, dsisson@google.com (initial port, made the runtime C++ tests runnable)
|
||||
* [Mike Lischke](www.soft-gems.net), mike@lischke-online.de (brought the initial port to a working library, made most runtime tests passing)
|
||||
|
||||
## Other contributors
|
||||
|
||||
|
@ -30,6 +30,7 @@ The C++ target has been the work of the following people:
|
|||
* Some unit tests in the OSX project, for important base classes with almost 100% code coverage.
|
||||
* All memory allocations checked
|
||||
* Simple command line demo application working on all supported platforms.
|
||||
* All runtime tests pass.
|
||||
|
||||
### Build + Usage Notes
|
||||
|
||||
|
|
|
@ -1 +1 @@
|
|||
4.0.0
|
||||
4.5.4
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# Demo application for the ANTLR 4 C++ target
|
||||
## Demo application for the ANTLR 4 C++ target
|
||||
|
||||
This demo app shows how to build the ANTLR runtime both as dynamic and static library and how to use a parser generated from a simple demo grammar.
|
||||
|
||||
|
@ -10,4 +10,4 @@ A few steps are necessary to get this to work:
|
|||
- Open the project in the folder that matches your system.
|
||||
- Compile and run.
|
||||
|
||||
Compilation is done as described in the runtime/cpp/readme.md file.
|
||||
Compilation is done as described in the [runtime/cpp/readme.md](../README.md) file.
|
||||
|
|
|
@ -47,16 +47,15 @@ void BailErrorStrategy::recover(Parser *recognizer, std::exception_ptr e) {
|
|||
context = context->getParent().lock();
|
||||
} while (true);
|
||||
|
||||
#if defined(_MSC_FULL_VER) && _MSC_FULL_VER < 190023026
|
||||
// throw_with_nested is not available before VS 2015.
|
||||
std::rethrow_exception(e);
|
||||
#else
|
||||
try {
|
||||
std::rethrow_exception(e); // Throw the exception to be able to catch and rethrow nested.
|
||||
} catch (RecognitionException &inner) {
|
||||
#if defined(_MSC_FULL_VER) && _MSC_FULL_VER < 190023026
|
||||
throw ParseCancellationException(inner.what());
|
||||
#else
|
||||
std::throw_with_nested(ParseCancellationException());
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
Ref<Token> BailErrorStrategy::recoverInline(Parser *recognizer) {
|
||||
|
@ -71,15 +70,15 @@ Ref<Token> BailErrorStrategy::recoverInline(Parser *recognizer) {
|
|||
context = context->getParent().lock();
|
||||
} while (true);
|
||||
|
||||
#if defined(_MSC_FULL_VER) && _MSC_FULL_VER < 190023026
|
||||
throw e;
|
||||
#else
|
||||
try {
|
||||
throw e;
|
||||
} catch (InputMismatchException &inner) {
|
||||
#if defined(_MSC_FULL_VER) && _MSC_FULL_VER < 190023026
|
||||
throw throw ParseCancellationException(inner.what());
|
||||
#else
|
||||
std::throw_with_nested(ParseCancellationException());
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
void BailErrorStrategy::sync(Parser * /*recognizer*/) {
|
||||
|
|
|
@ -55,7 +55,7 @@ namespace runtime {
|
|||
|
||||
private:
|
||||
/// Which configurations did we try at input.index() that couldn't match input.LT(1)?
|
||||
std::shared_ptr<atn::ATNConfigSet> _deadEndConfigs;
|
||||
Ref<atn::ATNConfigSet> _deadEndConfigs;
|
||||
|
||||
/// The token object at the start index; the input stream might
|
||||
/// not be buffering tokens so get a reference to it. (At the
|
||||
|
|
|
@ -194,13 +194,14 @@ int ParserATNSimulator::execATN(dfa::DFA &dfa, dfa::DFAState *s0, TokenStream *i
|
|||
// ATN states in SLL implies LL will also get nowhere.
|
||||
// If conflict in states that dip out, choose min since we
|
||||
// will get error no matter what.
|
||||
NoViableAltException e = noViableAlt(input, outerContext, previousD->configs, startIndex);
|
||||
input->seek(startIndex);
|
||||
int alt = getSynValidOrSemInvalidAltThatFinishedDecisionEntryRule(previousD->configs, outerContext);
|
||||
if (alt != ATN::INVALID_ALT_NUMBER) {
|
||||
return alt;
|
||||
}
|
||||
|
||||
throw noViableAlt(input, outerContext, previousD->configs, startIndex);
|
||||
throw e;
|
||||
}
|
||||
|
||||
if (D->requiresFullContext && mode != PredictionMode::SLL) {
|
||||
|
|
|
@ -1,246 +0,0 @@
|
|||
// !$*UTF8*$!
|
||||
{
|
||||
archiveVersion = 1;
|
||||
classes = {
|
||||
};
|
||||
objectVersion = 46;
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
271650A71CF7538F00E75CA2 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 271650A61CF7538F00E75CA2 /* main.cpp */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXCopyFilesBuildPhase section */
|
||||
271650A11CF7538F00E75CA2 /* CopyFiles */ = {
|
||||
isa = PBXCopyFilesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
dstPath = /usr/share/man/man1/;
|
||||
dstSubfolderSpec = 0;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 1;
|
||||
};
|
||||
/* End PBXCopyFilesBuildPhase section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
271650A31CF7538F00E75CA2 /* test */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = test; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
271650A61CF7538F00E75CA2 /* main.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
271650A01CF7538F00E75CA2 /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
2716509A1CF7538F00E75CA2 = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
271650A51CF7538F00E75CA2 /* test */,
|
||||
271650A41CF7538F00E75CA2 /* Products */,
|
||||
);
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
271650A41CF7538F00E75CA2 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
271650A31CF7538F00E75CA2 /* test */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
271650A51CF7538F00E75CA2 /* test */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
271650A61CF7538F00E75CA2 /* main.cpp */,
|
||||
);
|
||||
path = test;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXNativeTarget section */
|
||||
271650A21CF7538F00E75CA2 /* test */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 271650AA1CF7538F00E75CA2 /* Build configuration list for PBXNativeTarget "test" */;
|
||||
buildPhases = (
|
||||
2716509F1CF7538F00E75CA2 /* Sources */,
|
||||
271650A01CF7538F00E75CA2 /* Frameworks */,
|
||||
271650A11CF7538F00E75CA2 /* CopyFiles */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
);
|
||||
name = test;
|
||||
productName = test;
|
||||
productReference = 271650A31CF7538F00E75CA2 /* test */;
|
||||
productType = "com.apple.product-type.tool";
|
||||
};
|
||||
/* End PBXNativeTarget section */
|
||||
|
||||
/* Begin PBXProject section */
|
||||
2716509B1CF7538F00E75CA2 /* Project object */ = {
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
LastUpgradeCheck = 0730;
|
||||
ORGANIZATIONNAME = "Oracle Corporation";
|
||||
TargetAttributes = {
|
||||
271650A21CF7538F00E75CA2 = {
|
||||
CreatedOnToolsVersion = 7.3.1;
|
||||
};
|
||||
};
|
||||
};
|
||||
buildConfigurationList = 2716509E1CF7538F00E75CA2 /* Build configuration list for PBXProject "test" */;
|
||||
compatibilityVersion = "Xcode 3.2";
|
||||
developmentRegion = English;
|
||||
hasScannedForEncodings = 0;
|
||||
knownRegions = (
|
||||
en,
|
||||
);
|
||||
mainGroup = 2716509A1CF7538F00E75CA2;
|
||||
productRefGroup = 271650A41CF7538F00E75CA2 /* Products */;
|
||||
projectDirPath = "";
|
||||
projectRoot = "";
|
||||
targets = (
|
||||
271650A21CF7538F00E75CA2 /* test */,
|
||||
);
|
||||
};
|
||||
/* End PBXProject section */
|
||||
|
||||
/* Begin PBXSourcesBuildPhase section */
|
||||
2716509F1CF7538F00E75CA2 /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
271650A71CF7538F00E75CA2 /* main.cpp in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXSourcesBuildPhase section */
|
||||
|
||||
/* Begin XCBuildConfiguration section */
|
||||
271650A81CF7538F00E75CA2 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
CODE_SIGN_IDENTITY = "-";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
ENABLE_TESTABILITY = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_DYNAMIC_NO_PIC = NO;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_OPTIMIZATION_LEVEL = 0;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||
"DEBUG=1",
|
||||
"$(inherited)",
|
||||
);
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.11;
|
||||
MTL_ENABLE_DEBUG_INFO = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = macosx;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
271650A91CF7538F00E75CA2 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
CODE_SIGN_IDENTITY = "-";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.11;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
SDKROOT = macosx;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
271650AB1CF7538F00E75CA2 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
271650AC1CF7538F00E75CA2 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
/* End XCBuildConfiguration section */
|
||||
|
||||
/* Begin XCConfigurationList section */
|
||||
2716509E1CF7538F00E75CA2 /* Build configuration list for PBXProject "test" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
271650A81CF7538F00E75CA2 /* Debug */,
|
||||
271650A91CF7538F00E75CA2 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
271650AA1CF7538F00E75CA2 /* Build configuration list for PBXNativeTarget "test" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
271650AB1CF7538F00E75CA2 /* Debug */,
|
||||
271650AC1CF7538F00E75CA2 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
};
|
||||
/* End XCConfigurationList section */
|
||||
};
|
||||
rootObject = 2716509B1CF7538F00E75CA2 /* Project object */;
|
||||
}
|
|
@ -1,7 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Workspace
|
||||
version = "1.0">
|
||||
<FileRef
|
||||
location = "self:test.xcodeproj">
|
||||
</FileRef>
|
||||
</Workspace>
|
Loading…
Reference in New Issue