Skip to content

Commit

Permalink
Allow .cxx and .cc extension in compile (#2273)
Browse files Browse the repository at this point in the history
* Allow .cxx and .cc extensions

* Added integration test
  • Loading branch information
cmaglie authored Aug 23, 2023
1 parent 304d48c commit 5314a7c
Show file tree
Hide file tree
Showing 7 changed files with 81 additions and 10 deletions.
16 changes: 11 additions & 5 deletions arduino/globals/globals.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ var (
".hpp": empty,
".hh": empty,
".cpp": empty,
".cxx": empty,
".cc": empty,
".S": empty,
".adoc": empty,
".md": empty,
Expand All @@ -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
Expand Down
13 changes: 8 additions & 5 deletions docs/platform-specification.md
Original file line number Diff line number Diff line change
Expand Up @@ -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):

Expand Down
42 changes: 42 additions & 0 deletions internal/integrationtest/compile_3/compile_cxx_cc_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
// 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 [email protected].

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:[email protected]")
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)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
void func_in_cc();
void func_in_cxx();

void setup() {
func_in_cc();
func_in_cxx();
}

void loop() {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
void func_in_cc() {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
void func_in_cxx() {

}
3 changes: 3 additions & 0 deletions legacy/builder/builder_utils/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down

0 comments on commit 5314a7c

Please sign in to comment.