Unverified Commit 5314a7ca authored by Cristian Maglie's avatar Cristian Maglie Committed by GitHub

Allow `.cxx` and `.cc` extension in compile (#2273)

* Allow .cxx and .cc extensions

* Added integration test
parent 304d48cd
......@@ -35,6 +35,8 @@ var (
".hpp": empty,
".hh": empty,
".cpp": empty,
".cxx": empty,
".cc": empty,
".S": empty,
".adoc": empty,
".md": empty,
......@@ -43,11 +45,15 @@ var (
".ipp": empty,
}
// SourceFilesValidExtensions lists valid extensions for source files (no headers)
SourceFilesValidExtensions = map[string]struct{}{
".c": empty,
".cpp": empty,
".S": empty,
// SourceFilesValidExtensions lists valid extensions for source files (no headers).
// If a platform do not provide a compile recipe for a specific file extension, this
// map provides the equivalent extension to use as a fallback.
SourceFilesValidExtensions = map[string]string{
".c": "",
".cpp": "",
".cxx": ".cpp",
".cc": ".cpp",
".S": "",
}
// HeaderFilesValidExtensions lists valid extensions for header files
......
......@@ -172,12 +172,15 @@ These properties can be overwritten respectively with `--keys-keychain`, `--sign
#### Recipes to compile source code
We said that the Arduino development software determines a list of files to compile. Each file can be source code
written in C (.c files), C++ (.cpp files) or Assembly (.S files). Every language is compiled using its respective
**recipe**:
written in C (.c files), C++ (.cpp/.cxx/.cc files) or Assembly (.S files). Every language is compiled using its
respective **recipe**:
- `recipe.c.o.pattern`: for C files
- `recipe.cpp.o.pattern`: for CPP files
- `recipe.S.o.pattern`: for Assembly files
- `recipe.c.o.pattern`: for C files (.c)
- `recipe.cpp.o.pattern`: for CPP files (.cpp/.cxx/.cc)
- `recipe.S.o.pattern`: for Assembly files (.S)
(an optional `recipe.cxx.o.pattern` and `recipe.cc.o.pattern` may be provided, if `.cxx` or `.cc` needs special
handling, but it's not required and we do not recommend it)
The recipes can be built concatenating the following automatically generated properties (for each file compiled):
......
// This file is part of arduino-cli.
//
// Copyright 2022 ARDUINO SA (http://www.arduino.cc/)
//
// This software is released under the GNU General Public License version 3,
// which covers the main part of arduino-cli.
// The terms of this license can be found at:
// https://www.gnu.org/licenses/gpl-3.0.en.html
//
// You can be released from the requirements of the above licenses by purchasing
// a commercial license. Buying such a license is mandatory if you want to
// modify or otherwise use the software for commercial activities involving the
// Arduino software without disclosing the source code of your own applications.
// To purchase a commercial license, send an email to license@arduino.cc.
package compile_test
import (
"testing"
"github.com/arduino/arduino-cli/internal/integrationtest"
"github.com/arduino/go-paths-helper"
"github.com/stretchr/testify/require"
)
func TestCompileSketchWithCxxOrCc(t *testing.T) {
// See: https://github.com/arduino/arduino-cli/issues/1149
env, cli := integrationtest.CreateArduinoCLIWithEnvironment(t)
defer env.CleanUp()
// Run update-index with our test index
_, _, err := cli.Run("core", "install", "arduino:avr@1.8.5")
require.NoError(t, err)
// Prepare sketchbook and sketch
sketch, err := paths.New("testdata", "sketch_with_cxx_cc").Abs()
require.NoError(t, err)
_, _, err = cli.Run("compile", "-v", "-b", "arduino:avr:uno", sketch.String())
require.NoError(t, err)
}
void func_in_cc();
void func_in_cxx();
void setup() {
func_in_cc();
func_in_cxx();
}
void loop() {
}
\ No newline at end of file
void func_in_cc() {
}
\ No newline at end of file
void func_in_cxx() {
}
\ No newline at end of file
......@@ -109,6 +109,9 @@ func compileFiles(ctx *types.Context, sourcePath *paths.Path, recurse bool, buil
queue := make(chan *paths.Path)
job := func(source *paths.Path) {
recipe := fmt.Sprintf("recipe%s.o.pattern", source.Ext())
if !buildProperties.ContainsKey(recipe) {
recipe = fmt.Sprintf("recipe%s.o.pattern", globals.SourceFilesValidExtensions[source.Ext()])
}
objectFile, err := compileFileWithRecipe(ctx, sourcePath, source, buildPath, buildProperties, includes, recipe)
if err != nil {
errorsMux.Lock()
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment